Rework complementary filter's control

This commit is contained in:
Thomas Dehaeze 2025-04-11 14:33:24 +02:00
parent 4d86377bfd
commit fb616e7fd5
14 changed files with 1020 additions and 1076 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="241.268" height="127.565" viewBox="0 0 241.268 127.565"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="201.584" height="127.565" viewBox="0 0 201.584 127.565">
<defs> <defs>
<g> <g>
<g id="glyph-0-0"> <g id="glyph-0-0">
@ -76,169 +76,175 @@
</g> </g>
</g> </g>
<clipPath id="clip-0"> <clipPath id="clip-0">
<path clip-rule="nonzero" d="M 0.046875 14 L 140 14 L 140 127 L 0.046875 127 Z M 0.046875 14 "/> <path clip-rule="nonzero" d="M 0.136719 14 L 118 14 L 118 127 L 0.136719 127 Z M 0.136719 14 "/>
</clipPath> </clipPath>
<clipPath id="clip-1"> <clipPath id="clip-1">
<path clip-rule="nonzero" d="M 66 92 L 109 92 L 109 127.132812 L 66 127.132812 Z M 66 92 "/> <path clip-rule="nonzero" d="M 52 92 L 95 92 L 95 127.132812 L 52 127.132812 Z M 52 92 "/>
</clipPath> </clipPath>
<clipPath id="clip-2"> <clipPath id="clip-2">
<path clip-rule="nonzero" d="M 191 92 L 234 92 L 234 127.132812 L 191 127.132812 Z M 191 92 "/> <path clip-rule="nonzero" d="M 157 92 L 200 92 L 200 127.132812 L 157 127.132812 Z M 157 92 "/>
</clipPath> </clipPath>
<clipPath id="clip-3"> <clipPath id="clip-3">
<path clip-rule="nonzero" d="M 82 97 L 115 97 L 115 127.132812 L 82 127.132812 Z M 82 97 "/> <path clip-rule="nonzero" d="M 67 97 L 101 97 L 101 127.132812 L 67 127.132812 Z M 67 97 "/>
</clipPath> </clipPath>
<clipPath id="clip-4"> <clipPath id="clip-4">
<path clip-rule="nonzero" d="M 207 97 L 240 97 L 240 127.132812 L 207 127.132812 Z M 207 97 "/> <path clip-rule="nonzero" d="M 173 97 L 201.035156 97 L 201.035156 127.132812 L 173 127.132812 Z M 173 97 "/>
</clipPath> </clipPath>
<clipPath id="clip-5"> <clipPath id="clip-5">
<path clip-rule="nonzero" d="M 219 15 L 240.492188 15 L 240.492188 47 L 219 47 Z M 219 15 "/> <path clip-rule="nonzero" d="M 180 15 L 201.035156 15 L 201.035156 47 L 180 47 Z M 180 15 "/>
</clipPath> </clipPath>
<clipPath id="clip-6"> <clipPath id="clip-6">
<path clip-rule="nonzero" d="M 122 97 L 156 97 L 156 127.132812 L 122 127.132812 Z M 122 97 "/> <path clip-rule="nonzero" d="M 0.136719 15 L 32 15 L 32 47 L 0.136719 47 Z M 0.136719 15 "/>
</clipPath>
<clipPath id="clip-7">
<path clip-rule="nonzero" d="M 100 97 L 133 97 L 133 127.132812 L 100 127.132812 Z M 100 97 "/>
</clipPath> </clipPath>
</defs> </defs>
<path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" d="M 1.039062 126.136719 L 139.171875 126.136719 L 139.171875 14.949219 L 1.039062 14.949219 Z M 1.039062 126.136719 "/> <path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" d="M 1.128906 126.136719 L 116.660156 126.136719 L 116.660156 14.949219 L 1.128906 14.949219 Z M 1.128906 126.136719 "/>
<g clip-path="url(#clip-0)"> <g clip-path="url(#clip-0)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -30.801759 -95.654848 L 107.80209 -95.654848 L 107.80209 15.911804 L -30.801759 15.911804 Z M -30.801759 -95.654848 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -25.132948 -95.654848 L 90.792267 -95.654848 L 90.792267 15.911804 L -25.132948 15.911804 Z M -25.132948 -95.654848 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="41.049386" y="10.647691"/> <use xlink:href="#glyph-0-0" x="29.839948" y="10.647691"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="47.533847" y="10.647691"/> <use xlink:href="#glyph-0-1" x="36.32441" y="10.647691"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="58.010657" y="10.647691"/> <use xlink:href="#glyph-0-2" x="46.80122" y="10.647691"/>
<use xlink:href="#glyph-0-3" x="62.423983" y="10.647691"/> <use xlink:href="#glyph-0-3" x="51.214546" y="10.647691"/>
<use xlink:href="#glyph-0-4" x="67.388354" y="10.647691"/> <use xlink:href="#glyph-0-4" x="56.178917" y="10.647691"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-5" x="72.626759" y="10.647691"/> <use xlink:href="#glyph-0-5" x="61.417322" y="10.647691"/>
<use xlink:href="#glyph-0-6" x="76.488047" y="10.647691"/> <use xlink:href="#glyph-0-6" x="65.27861" y="10.647691"/>
<use xlink:href="#glyph-0-3" x="80.377136" y="10.647691"/> <use xlink:href="#glyph-0-3" x="69.167698" y="10.647691"/>
<use xlink:href="#glyph-0-7" x="85.341507" y="10.647691"/> <use xlink:href="#glyph-0-7" x="74.13207" y="10.647691"/>
<use xlink:href="#glyph-0-7" x="88.099712" y="10.647691"/> <use xlink:href="#glyph-0-7" x="76.890274" y="10.647691"/>
<use xlink:href="#glyph-0-8" x="90.857916" y="10.647691"/> <use xlink:href="#glyph-0-8" x="79.648479" y="10.647691"/>
<use xlink:href="#glyph-0-6" x="95.271243" y="10.647691"/> <use xlink:href="#glyph-0-6" x="84.061805" y="10.647691"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.97506 -0.00165186 C 6.97506 3.851286 3.851163 6.975183 -0.00177506 6.975183 C -3.850793 6.975183 -6.974691 3.851286 -6.974691 -0.00165186 C -6.974691 -3.85067 -3.850793 -6.974568 -0.00177506 -6.974568 C 3.851163 -6.974568 6.97506 -3.85067 6.97506 -0.00165186 Z M 6.97506 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.972254 -0.00165186 C 6.972254 3.851286 3.852276 6.975183 -0.000662015 6.975183 C -3.84968 6.975183 -6.973578 3.851286 -6.973578 -0.00165186 C -6.973578 -3.85067 -3.84968 -6.974568 -0.000662015 -6.974568 C 3.852276 -6.974568 6.972254 -3.85067 6.972254 -0.00165186 Z M 6.972254 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="27.413883" y="33.714034"/> <use xlink:href="#glyph-1-0" x="21.85418" y="33.714034"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="22.028248" y="45.534725"/> <use xlink:href="#glyph-2-0" x="16.468545" y="45.534725"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 24.479862 -8.5032 L 47.158496 -8.5032 L 47.158496 8.503816 L 24.479862 8.503816 Z M 24.479862 -8.5032 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 15.975507 -8.5032 L 38.654141 -8.5032 L 38.654141 8.503816 L 15.975507 8.503816 Z M 15.975507 -8.5032 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="64.692761" y="34.255189"/> <use xlink:href="#glyph-3-0" x="50.657958" y="34.255189"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 119.0199 -8.5032 L 141.698535 -8.5032 L 141.698535 8.503816 L 119.0199 8.503816 Z M 119.0199 -8.5032 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 102.013997 -8.5032 L 124.688712 -8.5032 L 124.688712 8.503816 L 102.013997 8.503816 Z M 102.013997 -8.5032 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="156.35519" y="34.53922"/> <use xlink:href="#glyph-3-1" x="133.845287" y="34.53922"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="164.162566" y="30.936506"/> <use xlink:href="#glyph-4-0" x="141.651667" y="30.936506"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 173.153087 -0.00165186 C 173.153087 3.851286 170.02919 6.975183 166.180171 6.975183 C 162.327234 6.975183 159.203336 3.851286 159.203336 -0.00165186 C 159.203336 -3.85067 162.327234 -6.974568 166.180171 -6.974568 C 170.02919 -6.974568 173.153087 -3.85067 173.153087 -0.00165186 Z M 173.153087 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 147.641716 -0.00165186 C 147.641716 3.851286 144.517819 6.975183 140.664881 6.975183 C 136.815863 6.975183 133.691965 3.851286 133.691965 -0.00165186 C 133.691965 -3.85067 136.815863 -6.974568 140.664881 -6.974568 C 144.517819 -6.974568 147.641716 -3.85067 147.641716 -0.00165186 Z M 147.641716 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="193.026141" y="33.714034"/> <use xlink:href="#glyph-1-0" x="162.041139" y="33.714034"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 44.822432 -34.513469 L 67.497147 -34.513469 L 67.497147 -17.506453 L 44.822432 -17.506453 Z M 44.822432 -34.513469 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 36.318077 -34.513469 L 58.992792 -34.513469 L 58.992792 -17.506453 L 36.318077 -17.506453 Z M 36.318077 -34.513469 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="83.801599" y="60.120986"/> <use xlink:href="#glyph-3-1" x="69.766797" y="60.120986"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 44.822432 -63.859293 L 67.497147 -63.859293 L 67.497147 -46.848357 L 44.822432 -46.848357 Z M 44.822432 -63.859293 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 36.318077 -63.859293 L 58.992792 -63.859293 L 58.992792 -46.848357 L 36.318077 -46.848357 Z M 36.318077 -63.859293 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="79.8132" y="88.619804"/> <use xlink:href="#glyph-3-2" x="65.778397" y="88.619804"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-0" x="88.066058" y="90.108727"/> <use xlink:href="#glyph-5-0" x="74.031255" y="90.108727"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 94.65625 113.195312 C 94.65625 109.355469 91.542969 106.242188 87.707031 106.242188 C 83.867188 106.242188 80.753906 109.355469 80.753906 113.195312 C 80.753906 117.03125 83.867188 120.144531 87.707031 120.144531 C 91.542969 120.144531 94.65625 117.03125 94.65625 113.195312 Z M 94.65625 113.195312 "/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 80.621094 113.195312 C 80.621094 109.355469 77.507812 106.242188 73.671875 106.242188 C 69.832031 106.242188 66.71875 109.355469 66.71875 113.195312 C 66.71875 117.03125 69.832031 120.144531 73.671875 120.144531 C 77.507812 120.144531 80.621094 117.03125 80.621094 113.195312 Z M 80.621094 113.195312 "/>
<g clip-path="url(#clip-1)"> <g clip-path="url(#clip-1)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 63.134665 -82.669311 C 63.134665 -78.816374 60.010768 -75.692476 56.161749 -75.692476 C 52.308812 -75.692476 49.184914 -78.816374 49.184914 -82.669311 C 49.184914 -86.51833 52.308812 -89.642227 56.161749 -89.642227 C 60.010768 -89.642227 63.134665 -86.51833 63.134665 -82.669311 Z M 63.134665 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 54.63031 -82.669311 C 54.63031 -78.816374 51.506413 -75.692476 47.657395 -75.692476 C 43.804457 -75.692476 40.680559 -78.816374 40.680559 -82.669311 C 40.680559 -86.51833 43.804457 -89.642227 47.657395 -89.642227 C 51.506413 -89.642227 54.63031 -86.51833 54.63031 -82.669311 Z M 54.63031 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="83.38203" y="116.100096"/> <use xlink:href="#glyph-1-0" x="69.347228" y="116.100096"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.639467 -91.17086 L 103.318101 -91.17086 L 103.318101 -74.163844 L 80.639467 -74.163844 Z M 80.639467 -91.17086 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 63.633564 -91.17086 L 86.308279 -91.17086 L 86.308279 -74.163844 L 63.633564 -74.163844 Z M 63.633564 -91.17086 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="116.303766" y="115.840979"/> <use xlink:href="#glyph-3-2" x="93.793864" y="115.840979"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-1" x="124.556624" y="117.330899"/> <use xlink:href="#glyph-5-1" x="102.046721" y="117.330899"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 219.726562 113.195312 C 219.726562 109.355469 216.613281 106.242188 212.777344 106.242188 C 208.9375 106.242188 205.824219 109.355469 205.824219 113.195312 C 205.824219 117.03125 208.9375 120.144531 212.777344 120.144531 C 216.613281 120.144531 219.726562 117.03125 219.726562 113.195312 Z M 219.726562 113.195312 "/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 185.914062 113.195312 C 185.914062 109.355469 182.804688 106.242188 178.964844 106.242188 C 175.128906 106.242188 172.015625 109.355469 172.015625 113.195312 C 172.015625 117.03125 175.128906 120.144531 178.964844 120.144531 C 182.804688 120.144531 185.914062 117.03125 185.914062 113.195312 Z M 185.914062 113.195312 "/>
<g clip-path="url(#clip-2)"> <g clip-path="url(#clip-2)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 188.631471 -82.669311 C 188.631471 -78.816374 185.507573 -75.692476 181.658555 -75.692476 C 177.805617 -75.692476 174.68172 -78.816374 174.68172 -82.669311 C 174.68172 -86.51833 177.805617 -89.642227 181.658555 -89.642227 C 185.507573 -89.642227 188.631471 -86.51833 188.631471 -82.669311 Z M 188.631471 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 160.282331 -82.669311 C 160.282331 -78.816374 157.162353 -75.692476 153.309415 -75.692476 C 149.460397 -75.692476 146.336499 -78.816374 146.336499 -82.669311 C 146.336499 -86.51833 149.460397 -89.642227 153.309415 -89.642227 C 157.162353 -89.642227 160.282331 -86.51833 160.282331 -82.669311 Z M 160.282331 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="208.45154" y="116.100096"/> <use xlink:href="#glyph-1-0" x="174.641172" y="116.100096"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.97506 -0.00165186 L 19.349144 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.972254 -0.00165186 L 10.844789 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053122 -0.00165186 L 1.608329 1.683763 L 3.086007 -0.00165186 L 1.608329 -1.683148 Z M 6.053122 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 48.190106, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052887 -0.00165186 L 1.608094 1.683763 L 3.085772 -0.00165186 L 1.608094 -1.683148 Z M 6.052887 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 34.155183, 30.806948)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 47.656282 -0.00165186 L 113.889182 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 39.151927 -0.00165186 L 96.87936 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.05234 -0.00165186 L 1.607547 1.683763 L 3.089145 -0.00165186 L 1.607547 -1.683148 Z M 6.05234 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 142.409635, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054697 -0.00165186 L 1.609904 1.683763 L 3.087582 -0.00165186 L 1.609904 -1.683148 Z M 6.054697 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 119.899473, 30.806948)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-3" x="140.365714" y="27.001923"/> <use xlink:href="#glyph-3-3" x="117.855812" y="27.001923"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 56.161749 -0.00165186 L 56.161749 -12.375736 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 47.657395 -0.00165186 L 47.657395 -12.375736 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053623 0.00168942 L 1.608831 1.683185 L 3.086509 0.00168942 L 1.608831 -1.683726 Z M 6.053623 0.00168942 " transform="matrix(0, 0.996602, 0.996602, 0, 87.705348, 40.310699)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053623 0.00145466 L 1.608831 1.68295 L 3.086509 0.00145466 L 1.608831 -1.683961 Z M 6.053623 0.00145466 " transform="matrix(0, 0.996602, 0.996602, 0, 73.670425, 40.310699)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 89.691406 30.808594 C 89.691406 29.710938 88.800781 28.820312 87.707031 28.820312 C 86.609375 28.820312 85.71875 29.710938 85.71875 30.808594 C 85.71875 31.902344 86.609375 32.792969 87.707031 32.792969 C 88.800781 32.792969 89.691406 31.902344 89.691406 30.808594 Z M 89.691406 30.808594 "/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 75.65625 30.808594 C 75.65625 29.710938 74.765625 28.820312 73.671875 28.820312 C 72.574219 28.820312 71.683594 29.710938 71.683594 30.808594 C 71.683594 31.902344 72.574219 32.792969 73.671875 32.792969 C 74.765625 32.792969 75.65625 31.902344 75.65625 30.808594 Z M 75.65625 30.808594 "/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 56.161749 -35.011255 L 56.161749 -41.71764 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 47.657395 -35.011255 L 47.657395 -41.71764 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052448 0.00168942 L 1.607655 1.683185 L 3.089252 0.00168942 L 1.607655 -1.683726 Z M 6.052448 0.00168942 " transform="matrix(0, 0.996602, 0.996602, 0, 87.705348, 69.554059)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052448 0.00145466 L 1.607655 1.68295 L 3.089252 0.00145466 L 1.607655 -1.683961 Z M 6.052448 0.00145466 " transform="matrix(0, 0.996602, 0.996602, 0, 73.670425, 69.554059)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 56.161749 -64.357079 L 56.161749 -71.059544 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 47.657395 -64.357079 L 47.657395 -71.059544 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055211 0.00168942 L 1.610418 1.683185 L 3.088096 0.00168942 L 1.610418 -1.683726 Z M 6.055211 0.00168942 " transform="matrix(0, 0.996602, 0.996602, 0, 87.705348, 98.797398)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055211 0.00145466 L 1.610418 1.68295 L 3.088096 0.00145466 L 1.610418 -1.683961 Z M 6.055211 0.00145466 " transform="matrix(0, 0.996602, 0.996602, 0, 73.670425, 98.797398)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.141681 -82.669311 L 67.767597 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 63.135778 -82.669311 L 59.263243 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 96.070312 113.195312 L 100.5 114.871094 L 99.023438 113.195312 L 100.5 111.515625 Z M 96.070312 113.195312 "/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 82.035156 113.195312 L 86.464844 114.871094 L 84.992188 113.195312 L 86.464844 111.515625 Z M 82.035156 113.195312 "/>
<g clip-path="url(#clip-3)"> <g clip-path="url(#clip-3)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.0525 0.00102149 L 1.607707 1.682517 L 3.089305 0.00102149 L 1.607707 -1.684394 Z M 6.0525 0.00102149 " transform="matrix(-0.996602, 0, 0, 0.996602, 102.102244, 113.194294)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052735 0.00102149 L 1.607942 1.682517 L 3.08562 0.00102149 L 1.607942 -1.684394 Z M 6.052735 0.00102149 " transform="matrix(-0.996602, 0, 0, 0.996602, 88.067321, 113.194294)"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 49.184914 -82.669311 L -0.00177506 -82.669311 L -0.00177506 -11.6075 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 40.680559 -82.669311 L -0.000662015 -82.669311 L -0.000662015 -11.6075 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052518 0.00177506 L 1.607725 1.683271 L 3.089323 0.00177506 L 1.607725 -1.68364 Z M 6.052518 0.00177506 " transform="matrix(0, -0.996602, -0.996602, 0, 31.736144, 45.203824)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052518 0.000662015 L 1.607725 1.682158 L 3.089323 0.000662015 L 1.607725 -1.684753 Z M 6.052518 0.000662015 " transform="matrix(0, -0.996602, -0.996602, 0, 26.176441, 45.203824)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 142.19632 -0.00165186 L 154.570404 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 125.190417 -0.00165186 L 129.059033 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051522 -0.00165186 L 1.610648 1.683763 L 3.088326 -0.00165186 L 1.610648 -1.683148 Z M 6.051522 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 182.953419, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052511 -0.00165186 L 1.607718 1.683763 L 3.089316 -0.00165186 L 1.607718 -1.683148 Z M 6.052511 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 151.968058, 30.806948)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 193.264403 -82.669311 L 208.472336 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 164.919183 -82.669311 L 174.455498 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 221.140625 113.195312 L 225.570312 114.871094 L 224.09375 113.195312 L 225.570312 111.515625 Z M 221.140625 113.195312 "/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 187.328125 113.195312 L 191.757812 114.871094 L 190.285156 113.195312 L 191.757812 111.515625 Z M 187.328125 113.195312 "/>
<g clip-path="url(#clip-4)"> <g clip-path="url(#clip-4)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052565 0.00102149 L 1.607772 1.682517 L 3.08937 0.00102149 L 1.607772 -1.684394 Z M 6.052565 0.00102149 " transform="matrix(-0.996602, 0, 0, 0.996602, 227.172621, 113.194294)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054905 0.00102149 L 1.610112 1.682517 L 3.08779 0.00102149 L 1.610112 -1.684394 Z M 6.054905 0.00102149 " transform="matrix(-0.996602, 0, 0, 0.996602, 193.362452, 113.194294)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-4" x="229.733966" y="109.387984"/> <use xlink:href="#glyph-3-4" x="190.273864" y="109.387984"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 173.153087 -0.00165186 L 203.839404 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 147.641716 -0.00165186 L 169.822565 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 238.085938 30.808594 L 233.65625 29.128906 L 235.132812 30.808594 L 233.65625 32.484375 Z M 238.085938 30.808594 "/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 198.628906 30.808594 L 194.199219 29.128906 L 195.671875 30.808594 L 194.199219 32.484375 Z M 198.628906 30.808594 "/>
<g clip-path="url(#clip-5)"> <g clip-path="url(#clip-5)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052022 -0.00165186 L 1.607229 1.683763 L 3.088826 -0.00165186 L 1.607229 -1.683148 Z M 6.052022 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 232.054483, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055163 -0.00165186 L 1.61037 1.683763 L 3.088048 -0.00165186 L 1.61037 -1.683148 Z M 6.055163 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 192.594322, 30.806948)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-5" x="230.469458" y="25.071506"/> <use xlink:href="#glyph-3-5" x="191.009356" y="25.071506"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 181.658555 -0.00165186 L 181.658555 -71.059544 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 153.309415 -0.00165186 L 153.309415 -71.059544 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055211 0.00161497 L 1.610418 1.683111 L 3.088096 0.00161497 L 1.610418 -1.6838 Z M 6.055211 0.00161497 " transform="matrix(0, 0.996602, 0.996602, 0, 212.775734, 98.797398)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055211 -0.0007148 L 1.610418 1.6847 L 3.088096 -0.0007148 L 1.610418 -1.682211 Z M 6.055211 -0.0007148 " transform="matrix(0, 0.996602, 0.996602, 0, 178.965556, 98.797398)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 214.761719 30.808594 C 214.761719 29.710938 213.871094 28.820312 212.777344 28.820312 C 211.679688 28.820312 210.789062 29.710938 210.789062 30.808594 C 210.789062 31.902344 211.679688 32.792969 212.777344 32.792969 C 213.871094 32.792969 214.761719 31.902344 214.761719 30.808594 Z M 214.761719 30.808594 "/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 180.953125 30.808594 C 180.953125 29.710938 180.0625 28.820312 178.964844 28.820312 C 177.867188 28.820312 176.980469 29.710938 176.980469 30.808594 C 176.980469 31.902344 177.867188 32.792969 178.964844 32.792969 C 180.0625 32.792969 180.953125 31.902344 180.953125 30.808594 Z M 180.953125 30.808594 "/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -11.607623 -0.00165186 L -26.815556 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -11.60651 -0.00165186 L -21.146744 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052395 -0.00165186 L 1.607602 1.683763 L 3.089199 -0.00165186 L 1.607602 -1.683148 Z M 6.052395 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 17.339268, 30.806948)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 17.8125 30.808594 L 13.382812 29.128906 L 14.855469 30.808594 L 13.382812 32.484375 Z M 17.8125 30.808594 "/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-6" x="8.817298" y="27.001923"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 174.68172 -82.669311 L 108.448819 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 136.613281 113.195312 L 141.042969 114.871094 L 139.570312 113.195312 L 141.042969 111.515625 Z M 136.613281 113.195312 "/>
<g clip-path="url(#clip-6)"> <g clip-path="url(#clip-6)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053329 0.00102149 L 1.608536 1.682517 L 3.086214 0.00102149 L 1.608536 -1.684394 Z M 6.053329 0.00102149 " transform="matrix(-0.996602, 0, 0, 0.996602, 142.646038, 113.194294)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053508 -0.00165186 L 1.608715 1.683763 L 3.086393 -0.00165186 L 1.608715 -1.683148 Z M 6.053508 -0.00165186 " transform="matrix(0.996602, 0, 0, -0.996602, 11.779565, 30.806948)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-5" x="139.004357" y="107.457567"/> <use xlink:href="#glyph-3-6" x="8.907329" y="27.001923"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 146.336499 -82.669311 L 91.442916 -82.669311 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 114.101562 113.195312 L 118.53125 114.871094 L 117.058594 113.195312 L 118.53125 111.515625 Z M 114.101562 113.195312 "/>
<g clip-path="url(#clip-7)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054902 0.00102149 L 1.610109 1.682517 L 3.087787 0.00102149 L 1.610109 -1.684394 Z M 6.054902 0.00102149 " transform="matrix(-0.996602, 0, 0, 0.996602, 120.135887, 113.194294)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-2" x="143.871759" y="108.94649"/> <use xlink:href="#glyph-3-5" x="116.494454" y="107.457567"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 166.180171 11.608116 L 166.180171 26.816049 " transform="matrix(0.996602, 0, 0, -0.996602, 31.736144, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051912 0.0012714 L 1.607119 1.682767 L 3.088717 0.0012714 L 1.607119 -1.684144 Z M 6.051912 0.0012714 " transform="matrix(0, 0.996602, 0.996602, 0, 197.350295, 16.410061)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-7" x="201.154423" y="14.782591"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-3" x="206.321802" y="16.27251"/> <use xlink:href="#glyph-5-2" x="121.361856" y="108.94649"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 140.664881 11.608116 L 140.664881 21.14835 " transform="matrix(0.996602, 0, 0, -0.996602, 26.176441, 30.806948)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051912 -0.00164896 L 1.607119 1.683766 L 3.088717 -0.00164896 L 1.607119 -1.683145 Z M 6.051912 -0.00164896 " transform="matrix(0, 0.996602, 0.996602, 0, 166.364925, 16.410061)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-7" x="170.169421" y="20.433322"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-3" x="175.3368" y="21.922245"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,177 +1,246 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="256.9" height="106.309" viewBox="0 0 256.9 106.309"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="210.395" height="105.421" viewBox="0 0 210.395 105.421">
<defs> <defs>
<g> <g>
<g id="glyph-0-0"> <g id="glyph-0-0">
<path d="M 8.0625 -2.984375 C 8.0625 -3.203125 7.859375 -3.203125 7.6875 -3.203125 L 4.515625 -3.203125 L 4.515625 -6.375 C 4.515625 -6.53125 4.515625 -6.734375 4.3125 -6.734375 C 4.09375 -6.734375 4.09375 -6.546875 4.09375 -6.375 L 4.09375 -3.203125 L 0.921875 -3.203125 C 0.75 -3.203125 0.546875 -3.203125 0.546875 -3 C 0.546875 -2.78125 0.734375 -2.78125 0.921875 -2.78125 L 4.09375 -2.78125 L 4.09375 0.390625 C 4.09375 0.5625 4.09375 0.765625 4.296875 0.765625 C 4.515625 0.765625 4.515625 0.578125 4.515625 0.390625 L 4.515625 -2.78125 L 7.6875 -2.78125 C 7.859375 -2.78125 8.0625 -2.78125 8.0625 -2.984375 Z M 8.0625 -2.984375 "/> <path d="M 7.25 -0.875 C 7.25 -0.9375 7.25 -1.046875 7.125 -1.046875 C 7.015625 -1.046875 7.015625 -0.953125 7 -0.875 C 6.9375 -0.171875 6.59375 0 6.34375 0 C 5.859375 0 5.78125 -0.5 5.640625 -1.421875 L 5.515625 -2.21875 C 5.34375 -2.859375 4.859375 -3.1875 4.3125 -3.375 C 5.265625 -3.609375 6.046875 -4.203125 6.046875 -4.984375 C 6.046875 -5.9375 4.90625 -6.765625 3.453125 -6.765625 L 0.34375 -6.765625 L 0.34375 -6.453125 L 0.578125 -6.453125 C 1.34375 -6.453125 1.359375 -6.34375 1.359375 -6 L 1.359375 -0.765625 C 1.359375 -0.421875 1.34375 -0.3125 0.578125 -0.3125 L 0.34375 -0.3125 L 0.34375 0 C 0.703125 -0.03125 1.40625 -0.03125 1.796875 -0.03125 C 2.171875 -0.03125 2.875 -0.03125 3.234375 0 L 3.234375 -0.3125 L 3 -0.3125 C 2.234375 -0.3125 2.21875 -0.421875 2.21875 -0.765625 L 2.21875 -3.28125 L 3.359375 -3.28125 C 3.515625 -3.28125 3.9375 -3.28125 4.28125 -2.9375 C 4.65625 -2.578125 4.65625 -2.28125 4.65625 -1.609375 C 4.65625 -0.96875 4.65625 -0.578125 5.0625 -0.203125 C 5.46875 0.15625 6.015625 0.21875 6.3125 0.21875 C 7.078125 0.21875 7.25 -0.59375 7.25 -0.875 Z M 5.015625 -4.984375 C 5.015625 -4.296875 4.78125 -3.5 3.3125 -3.5 L 2.21875 -3.5 L 2.21875 -6.0625 C 2.21875 -6.296875 2.21875 -6.40625 2.4375 -6.4375 C 2.53125 -6.453125 2.828125 -6.453125 3.015625 -6.453125 C 3.90625 -6.453125 5.015625 -6.421875 5.015625 -4.984375 Z M 5.015625 -4.984375 "/>
</g>
<g id="glyph-0-1">
<path d="M 6.78125 -4.484375 L 6.59375 -6.703125 L 0.546875 -6.703125 L 0.359375 -4.484375 L 0.609375 -4.484375 C 0.75 -6.078125 0.890625 -6.40625 2.390625 -6.40625 C 2.5625 -6.40625 2.828125 -6.40625 2.921875 -6.375 C 3.125 -6.34375 3.125 -6.234375 3.125 -6 L 3.125 -0.78125 C 3.125 -0.453125 3.125 -0.3125 2.09375 -0.3125 L 1.6875 -0.3125 L 1.6875 0 C 2.09375 -0.03125 3.109375 -0.03125 3.5625 -0.03125 C 4.015625 -0.03125 5.046875 -0.03125 5.453125 0 L 5.453125 -0.3125 L 5.046875 -0.3125 C 4.015625 -0.3125 4.015625 -0.453125 4.015625 -0.78125 L 4.015625 -6 C 4.015625 -6.203125 4.015625 -6.34375 4.1875 -6.375 C 4.296875 -6.40625 4.5625 -6.40625 4.75 -6.40625 C 6.25 -6.40625 6.40625 -6.078125 6.53125 -4.484375 Z M 6.78125 -4.484375 "/>
</g>
<g id="glyph-0-2">
<path d="M 4.109375 -1.171875 C 4.109375 -1.28125 4.015625 -1.28125 3.984375 -1.28125 C 3.890625 -1.28125 3.875 -1.234375 3.859375 -1.171875 C 3.5625 -0.25 2.921875 -0.140625 2.5625 -0.140625 C 2.03125 -0.140625 1.15625 -0.5625 1.15625 -2.15625 C 1.15625 -3.78125 1.96875 -4.1875 2.5 -4.1875 C 2.578125 -4.1875 3.203125 -4.1875 3.5625 -3.828125 C 3.15625 -3.796875 3.09375 -3.5 3.09375 -3.375 C 3.09375 -3.109375 3.265625 -2.90625 3.546875 -2.90625 C 3.796875 -2.90625 4 -3.078125 4 -3.375 C 4 -4.046875 3.25 -4.4375 2.484375 -4.4375 C 1.25 -4.4375 0.34375 -3.375 0.34375 -2.140625 C 0.34375 -0.875 1.3125 0.109375 2.46875 0.109375 C 3.796875 0.109375 4.109375 -1.078125 4.109375 -1.171875 Z M 4.109375 -1.171875 "/>
</g>
<g id="glyph-0-3">
<path d="M 4.671875 -2.125 C 4.671875 -3.390625 3.671875 -4.4375 2.484375 -4.4375 C 1.234375 -4.4375 0.28125 -3.359375 0.28125 -2.125 C 0.28125 -0.84375 1.3125 0.109375 2.46875 0.109375 C 3.671875 0.109375 4.671875 -0.859375 4.671875 -2.125 Z M 3.84375 -2.203125 C 3.84375 -1.84375 3.84375 -1.3125 3.625 -0.875 C 3.40625 -0.421875 2.96875 -0.140625 2.484375 -0.140625 C 2.046875 -0.140625 1.609375 -0.34375 1.34375 -0.796875 C 1.09375 -1.234375 1.09375 -1.84375 1.09375 -2.203125 C 1.09375 -2.578125 1.09375 -3.125 1.34375 -3.5625 C 1.609375 -4.015625 2.078125 -4.21875 2.46875 -4.21875 C 2.90625 -4.21875 3.328125 -4 3.59375 -3.578125 C 3.84375 -3.15625 3.84375 -2.578125 3.84375 -2.203125 Z M 3.84375 -2.203125 "/>
</g>
<g id="glyph-0-4">
<path d="M 5.296875 0 L 5.296875 -0.3125 C 4.78125 -0.3125 4.53125 -0.3125 4.53125 -0.609375 L 4.53125 -2.5 C 4.53125 -3.34375 4.53125 -3.65625 4.21875 -4.015625 C 4.078125 -4.1875 3.75 -4.375 3.1875 -4.375 C 2.453125 -4.375 1.984375 -3.953125 1.71875 -3.34375 L 1.71875 -4.375 L 0.3125 -4.265625 L 0.3125 -3.96875 C 1.015625 -3.96875 1.09375 -3.890625 1.09375 -3.40625 L 1.09375 -0.75 C 1.09375 -0.3125 0.984375 -0.3125 0.3125 -0.3125 L 0.3125 0 L 1.4375 -0.03125 L 2.546875 0 L 2.546875 -0.3125 C 1.875 -0.3125 1.765625 -0.3125 1.765625 -0.75 L 1.765625 -2.578125 C 1.765625 -3.609375 2.484375 -4.15625 3.109375 -4.15625 C 3.734375 -4.15625 3.84375 -3.625 3.84375 -3.0625 L 3.84375 -0.75 C 3.84375 -0.3125 3.734375 -0.3125 3.078125 -0.3125 L 3.078125 0 L 4.1875 -0.03125 Z M 5.296875 0 "/>
</g>
<g id="glyph-0-5">
<path d="M 3.28125 -1.234375 L 3.28125 -1.796875 L 3.046875 -1.796875 L 3.046875 -1.25 C 3.046875 -0.515625 2.75 -0.140625 2.375 -0.140625 C 1.71875 -0.140625 1.71875 -1.046875 1.71875 -1.203125 L 1.71875 -3.96875 L 3.125 -3.96875 L 3.125 -4.265625 L 1.71875 -4.265625 L 1.71875 -6.09375 L 1.46875 -6.09375 C 1.453125 -5.28125 1.15625 -4.21875 0.1875 -4.1875 L 0.1875 -3.96875 L 1.03125 -3.96875 L 1.03125 -1.234375 C 1.03125 -0.015625 1.953125 0.109375 2.3125 0.109375 C 3.015625 0.109375 3.28125 -0.59375 3.28125 -1.234375 Z M 3.28125 -1.234375 "/>
</g>
<g id="glyph-0-6">
<path d="M 3.609375 -3.78125 C 3.609375 -4.09375 3.296875 -4.375 2.875 -4.375 C 2.15625 -4.375 1.796875 -3.71875 1.65625 -3.28125 L 1.65625 -4.375 L 0.28125 -4.265625 L 0.28125 -3.96875 C 0.96875 -3.96875 1.046875 -3.890625 1.046875 -3.40625 L 1.046875 -0.75 C 1.046875 -0.3125 0.9375 -0.3125 0.28125 -0.3125 L 0.28125 0 L 1.40625 -0.03125 C 1.796875 -0.03125 2.265625 -0.03125 2.671875 0 L 2.671875 -0.3125 L 2.453125 -0.3125 C 1.71875 -0.3125 1.703125 -0.421875 1.703125 -0.765625 L 1.703125 -2.296875 C 1.703125 -3.28125 2.125 -4.15625 2.875 -4.15625 C 2.9375 -4.15625 2.96875 -4.15625 2.984375 -4.15625 C 2.953125 -4.140625 2.75 -4.015625 2.75 -3.765625 C 2.75 -3.484375 2.96875 -3.34375 3.1875 -3.34375 C 3.359375 -3.34375 3.609375 -3.453125 3.609375 -3.78125 Z M 3.609375 -3.78125 "/>
</g>
<g id="glyph-0-7">
<path d="M 2.53125 0 L 2.53125 -0.3125 C 1.859375 -0.3125 1.75 -0.3125 1.75 -0.75 L 1.75 -6.875 L 0.328125 -6.765625 L 0.328125 -6.453125 C 1.015625 -6.453125 1.09375 -6.390625 1.09375 -5.90625 L 1.09375 -0.75 C 1.09375 -0.3125 0.984375 -0.3125 0.328125 -0.3125 L 0.328125 0 L 1.421875 -0.03125 Z M 2.53125 0 "/>
</g>
<g id="glyph-0-8">
<path d="M 4.109375 -1.171875 C 4.109375 -1.28125 4.03125 -1.296875 3.984375 -1.296875 C 3.890625 -1.296875 3.875 -1.234375 3.859375 -1.15625 C 3.5 -0.140625 2.609375 -0.140625 2.515625 -0.140625 C 2.015625 -0.140625 1.625 -0.4375 1.390625 -0.796875 C 1.09375 -1.28125 1.09375 -1.9375 1.09375 -2.28125 L 3.859375 -2.28125 C 4.078125 -2.28125 4.109375 -2.28125 4.109375 -2.5 C 4.109375 -3.484375 3.578125 -4.4375 2.34375 -4.4375 C 1.1875 -4.4375 0.28125 -3.421875 0.28125 -2.171875 C 0.28125 -0.859375 1.3125 0.109375 2.453125 0.109375 C 3.671875 0.109375 4.109375 -0.984375 4.109375 -1.171875 Z M 3.453125 -2.5 L 1.109375 -2.5 C 1.171875 -3.96875 2 -4.21875 2.34375 -4.21875 C 3.359375 -4.21875 3.453125 -2.875 3.453125 -2.5 Z M 3.453125 -2.5 "/>
</g> </g>
<g id="glyph-1-0"> <g id="glyph-1-0">
<path d="M 6.859375 -2.46875 C 6.859375 -2.671875 6.671875 -2.671875 6.53125 -2.671875 L 1.140625 -2.671875 C 1.015625 -2.671875 0.828125 -2.671875 0.828125 -2.46875 C 0.828125 -2.28125 1.015625 -2.28125 1.140625 -2.28125 L 6.53125 -2.28125 C 6.671875 -2.28125 6.859375 -2.28125 6.859375 -2.46875 Z M 6.859375 -2.46875 "/> <path d="M 8.0625 -2.984375 C 8.0625 -3.203125 7.875 -3.203125 7.6875 -3.203125 L 4.515625 -3.203125 L 4.515625 -6.375 C 4.515625 -6.546875 4.515625 -6.75 4.3125 -6.75 C 4.09375 -6.75 4.09375 -6.5625 4.09375 -6.375 L 4.09375 -3.203125 L 0.921875 -3.203125 C 0.75 -3.203125 0.546875 -3.203125 0.546875 -3 C 0.546875 -2.78125 0.75 -2.78125 0.921875 -2.78125 L 4.09375 -2.78125 L 4.09375 0.390625 C 4.09375 0.5625 4.09375 0.765625 4.296875 0.765625 C 4.515625 0.765625 4.515625 0.578125 4.515625 0.390625 L 4.515625 -2.78125 L 7.6875 -2.78125 C 7.859375 -2.78125 8.0625 -2.78125 8.0625 -2.984375 Z M 8.0625 -2.984375 "/>
</g> </g>
<g id="glyph-2-0"> <g id="glyph-2-0">
<path d="M 4.84375 -1.421875 C 4.84375 -1.515625 4.75 -1.515625 4.734375 -1.515625 C 4.625 -1.515625 4.625 -1.46875 4.59375 -1.328125 C 4.390625 -0.609375 4.15625 -0.109375 3.734375 -0.109375 C 3.546875 -0.109375 3.40625 -0.21875 3.40625 -0.578125 C 3.40625 -0.734375 3.453125 -0.96875 3.484375 -1.125 C 3.53125 -1.296875 3.53125 -1.328125 3.53125 -1.4375 C 3.53125 -2.078125 2.90625 -2.359375 2.0625 -2.46875 C 2.375 -2.65625 2.6875 -2.96875 2.921875 -3.203125 C 3.390625 -3.734375 3.84375 -4.15625 4.328125 -4.15625 C 4.390625 -4.15625 4.40625 -4.15625 4.421875 -4.140625 C 4.546875 -4.125 4.546875 -4.125 4.625 -4.0625 C 4.65625 -4.0625 4.65625 -4.046875 4.671875 -4.03125 C 4.1875 -4 4.109375 -3.609375 4.109375 -3.484375 C 4.109375 -3.328125 4.21875 -3.140625 4.484375 -3.140625 C 4.734375 -3.140625 5.03125 -3.359375 5.03125 -3.75 C 5.03125 -4.046875 4.796875 -4.375 4.359375 -4.375 C 4.078125 -4.375 3.625 -4.296875 2.90625 -3.5 C 2.578125 -3.125 2.1875 -2.734375 1.8125 -2.578125 L 2.84375 -6.75 C 2.84375 -6.75 2.84375 -6.859375 2.703125 -6.859375 C 2.484375 -6.859375 1.765625 -6.78125 1.5 -6.765625 C 1.421875 -6.75 1.3125 -6.75 1.3125 -6.5625 C 1.3125 -6.453125 1.40625 -6.453125 1.546875 -6.453125 C 2.03125 -6.453125 2.046875 -6.375 2.046875 -6.28125 L 2.015625 -6.078125 L 0.578125 -0.390625 C 0.546875 -0.25 0.546875 -0.234375 0.546875 -0.171875 C 0.546875 0.0625 0.734375 0.109375 0.828125 0.109375 C 0.953125 0.109375 1.109375 0.015625 1.171875 -0.09375 C 1.21875 -0.1875 1.65625 -2.015625 1.71875 -2.265625 C 2.0625 -2.234375 2.875 -2.078125 2.875 -1.421875 C 2.875 -1.359375 2.875 -1.3125 2.84375 -1.21875 C 2.8125 -1.09375 2.796875 -0.984375 2.796875 -0.875 C 2.796875 -0.28125 3.1875 0.109375 3.703125 0.109375 C 4 0.109375 4.265625 -0.046875 4.484375 -0.421875 C 4.734375 -0.84375 4.84375 -1.421875 4.84375 -1.421875 Z M 4.84375 -1.421875 "/> <path d="M 6.875 -2.484375 C 6.875 -2.671875 6.6875 -2.671875 6.546875 -2.671875 L 1.15625 -2.671875 C 1.015625 -2.671875 0.828125 -2.671875 0.828125 -2.484375 C 0.828125 -2.28125 1.015625 -2.28125 1.15625 -2.28125 L 6.546875 -2.28125 C 6.6875 -2.28125 6.875 -2.28125 6.875 -2.484375 Z M 6.875 -2.484375 "/>
</g>
<g id="glyph-2-1">
<path d="M 7.125 -2.59375 C 7.125 -2.65625 7.078125 -2.703125 7 -2.703125 C 6.78125 -2.703125 6.1875 -2.671875 5.96875 -2.671875 L 4.578125 -2.703125 C 4.484375 -2.703125 4.375 -2.703125 4.375 -2.5 C 4.375 -2.390625 4.453125 -2.390625 4.671875 -2.390625 C 4.671875 -2.390625 4.96875 -2.390625 5.1875 -2.375 C 5.453125 -2.34375 5.5 -2.3125 5.5 -2.1875 C 5.5 -2.09375 5.390625 -1.65625 5.296875 -1.28125 C 5.015625 -0.203125 3.734375 -0.09375 3.375 -0.09375 C 2.4375 -0.09375 1.390625 -0.65625 1.390625 -2.171875 C 1.390625 -2.46875 1.5 -4.109375 2.53125 -5.390625 C 3.0625 -6.0625 4.03125 -6.671875 5 -6.671875 C 6.015625 -6.671875 6.59375 -5.90625 6.59375 -4.75 C 6.59375 -4.359375 6.5625 -4.359375 6.5625 -4.25 C 6.5625 -4.15625 6.671875 -4.15625 6.71875 -4.15625 C 6.84375 -4.15625 6.84375 -4.171875 6.890625 -4.359375 L 7.515625 -6.875 C 7.515625 -6.90625 7.5 -6.96875 7.40625 -6.96875 C 7.375 -6.96875 7.375 -6.96875 7.265625 -6.859375 L 6.5625 -6.09375 C 6.484375 -6.234375 6.015625 -6.96875 4.921875 -6.96875 C 2.71875 -6.96875 0.5 -4.78125 0.5 -2.5 C 0.5 -0.921875 1.59375 0.21875 3.1875 0.21875 C 3.625 0.21875 4.078125 0.125 4.4375 -0.015625 C 4.921875 -0.21875 5.109375 -0.421875 5.296875 -0.625 C 5.375 -0.375 5.640625 -0.015625 5.734375 -0.015625 C 5.78125 -0.015625 5.8125 -0.046875 5.8125 -0.046875 C 5.828125 -0.0625 5.921875 -0.4375 5.96875 -0.65625 L 6.15625 -1.421875 C 6.203125 -1.578125 6.25 -1.75 6.296875 -1.921875 C 6.40625 -2.359375 6.40625 -2.390625 6.96875 -2.390625 C 7.015625 -2.390625 7.125 -2.40625 7.125 -2.59375 Z M 7.125 -2.59375 "/>
</g>
<g id="glyph-2-2">
<path d="M 7.09375 -0.203125 C 7.09375 -0.3125 7.015625 -0.3125 6.828125 -0.3125 C 6.453125 -0.3125 6.1875 -0.3125 6.1875 -0.484375 C 6.1875 -0.546875 6.203125 -0.59375 6.21875 -0.65625 L 7.546875 -6 C 7.640625 -6.34375 7.65625 -6.453125 8.375 -6.453125 C 8.640625 -6.453125 8.71875 -6.453125 8.71875 -6.640625 C 8.71875 -6.75 8.609375 -6.75 8.578125 -6.75 L 7.3125 -6.71875 L 6.03125 -6.75 C 5.953125 -6.75 5.84375 -6.75 5.84375 -6.5625 C 5.84375 -6.453125 5.9375 -6.453125 6.125 -6.453125 C 6.125 -6.453125 6.328125 -6.453125 6.5 -6.421875 C 6.671875 -6.40625 6.765625 -6.40625 6.765625 -6.265625 C 6.765625 -6.234375 6.75 -6.21875 6.71875 -6.078125 L 6.125 -3.671875 L 3.109375 -3.671875 L 3.703125 -6 C 3.78125 -6.34375 3.8125 -6.453125 4.53125 -6.453125 C 4.78125 -6.453125 4.859375 -6.453125 4.859375 -6.640625 C 4.859375 -6.75 4.75 -6.75 4.734375 -6.75 L 3.46875 -6.71875 L 2.1875 -6.75 C 2.109375 -6.75 2 -6.75 2 -6.5625 C 2 -6.453125 2.09375 -6.453125 2.28125 -6.453125 C 2.28125 -6.453125 2.484375 -6.453125 2.65625 -6.421875 C 2.828125 -6.40625 2.921875 -6.40625 2.921875 -6.265625 C 2.921875 -6.234375 2.90625 -6.203125 2.875 -6.078125 L 1.546875 -0.765625 C 1.453125 -0.390625 1.4375 -0.3125 0.65625 -0.3125 C 0.46875 -0.3125 0.390625 -0.3125 0.390625 -0.109375 C 0.390625 0 0.53125 0 0.53125 0 L 1.78125 -0.03125 L 2.40625 -0.015625 C 2.625 -0.015625 2.84375 0 3.0625 0 C 3.140625 0 3.25 0 3.25 -0.203125 C 3.25 -0.3125 3.171875 -0.3125 2.984375 -0.3125 C 2.609375 -0.3125 2.328125 -0.3125 2.328125 -0.484375 C 2.328125 -0.546875 2.359375 -0.59375 2.359375 -0.65625 L 3.03125 -3.359375 L 6.046875 -3.359375 L 5.375 -0.640625 C 5.265625 -0.3125 5.078125 -0.3125 4.46875 -0.3125 C 4.328125 -0.3125 4.234375 -0.3125 4.234375 -0.109375 C 4.234375 0 4.375 0 4.375 0 L 5.625 -0.03125 L 6.265625 -0.015625 C 6.484375 -0.015625 6.703125 0 6.90625 0 C 6.984375 0 7.09375 0 7.09375 -0.203125 Z M 7.09375 -0.203125 "/>
</g>
<g id="glyph-2-3">
<path d="M 5.375 -1.421875 C 5.375 -1.515625 5.28125 -1.515625 5.25 -1.515625 C 5.15625 -1.515625 5.140625 -1.46875 5.109375 -1.328125 C 4.96875 -0.78125 4.78125 -0.109375 4.375 -0.109375 C 4.15625 -0.109375 4.0625 -0.234375 4.0625 -0.5625 C 4.0625 -0.78125 4.1875 -1.25 4.265625 -1.59375 L 4.546875 -2.65625 C 4.5625 -2.8125 4.671875 -3.1875 4.703125 -3.328125 C 4.75 -3.5625 4.859375 -3.9375 4.859375 -4 C 4.859375 -4.171875 4.71875 -4.265625 4.5625 -4.265625 C 4.515625 -4.265625 4.265625 -4.25 4.1875 -3.921875 L 3.4375 -0.9375 C 3.4375 -0.90625 3.03125 -0.109375 2.3125 -0.109375 C 1.796875 -0.109375 1.703125 -0.546875 1.703125 -0.921875 C 1.703125 -1.46875 1.984375 -2.25 2.234375 -2.9375 C 2.359375 -3.234375 2.40625 -3.375 2.40625 -3.5625 C 2.40625 -4 2.09375 -4.375 1.59375 -4.375 C 0.65625 -4.375 0.28125 -2.9375 0.28125 -2.84375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.765625 0.5625 -2.921875 C 0.8125 -3.78125 1.1875 -4.15625 1.5625 -4.15625 C 1.65625 -4.15625 1.8125 -4.140625 1.8125 -3.828125 C 1.8125 -3.59375 1.703125 -3.296875 1.640625 -3.15625 C 1.28125 -2.171875 1.0625 -1.5625 1.0625 -1.078125 C 1.0625 -0.140625 1.75 0.109375 2.28125 0.109375 C 2.9375 0.109375 3.296875 -0.34375 3.46875 -0.546875 C 3.578125 -0.140625 3.921875 0.109375 4.34375 0.109375 C 4.6875 0.109375 4.921875 -0.125 5.078125 -0.4375 C 5.234375 -0.796875 5.375 -1.421875 5.375 -1.421875 Z M 5.375 -1.421875 "/>
</g>
<g id="glyph-2-4">
<path d="M 5.640625 -1.421875 C 5.640625 -1.515625 5.5625 -1.515625 5.53125 -1.515625 C 5.4375 -1.515625 5.4375 -1.484375 5.375 -1.328125 C 5.1875 -0.65625 4.859375 -0.109375 4.375 -0.109375 C 4.203125 -0.109375 4.140625 -0.203125 4.140625 -0.4375 C 4.140625 -0.6875 4.21875 -0.921875 4.3125 -1.140625 C 4.5 -1.65625 4.921875 -2.75 4.921875 -3.3125 C 4.921875 -3.96875 4.484375 -4.375 3.78125 -4.375 C 2.890625 -4.375 2.40625 -3.734375 2.234375 -3.515625 C 2.1875 -4.0625 1.78125 -4.375 1.328125 -4.375 C 0.875 -4.375 0.6875 -3.984375 0.578125 -3.8125 C 0.421875 -3.46875 0.28125 -2.890625 0.28125 -2.84375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.765625 0.578125 -2.984375 C 0.734375 -3.671875 0.9375 -4.15625 1.296875 -4.15625 C 1.5 -4.15625 1.609375 -4.03125 1.609375 -3.703125 C 1.609375 -3.484375 1.578125 -3.375 1.4375 -2.875 L 0.875 -0.578125 C 0.84375 -0.4375 0.78125 -0.203125 0.78125 -0.15625 C 0.78125 0.015625 0.921875 0.109375 1.0625 0.109375 C 1.1875 0.109375 1.359375 0.03125 1.4375 -0.171875 C 1.4375 -0.1875 1.5625 -0.65625 1.625 -0.90625 L 1.84375 -1.796875 C 1.90625 -2 1.953125 -2.21875 2 -2.453125 L 2.140625 -2.953125 C 2.28125 -3.25 2.8125 -4.15625 3.75 -4.15625 C 4.1875 -4.15625 4.28125 -3.78125 4.28125 -3.46875 C 4.28125 -2.84375 3.796875 -1.578125 3.640625 -1.15625 C 3.546875 -0.9375 3.546875 -0.8125 3.546875 -0.703125 C 3.546875 -0.234375 3.890625 0.109375 4.359375 0.109375 C 5.28125 0.109375 5.640625 -1.328125 5.640625 -1.421875 Z M 5.640625 -1.421875 "/>
</g>
<g id="glyph-2-5">
<path d="M 4.8125 -3.765625 C 4.84375 -3.90625 4.84375 -3.921875 4.84375 -4 C 4.84375 -4.171875 4.703125 -4.265625 4.5625 -4.265625 C 4.453125 -4.265625 4.296875 -4.203125 4.21875 -4.0625 C 4.1875 -4 4.109375 -3.703125 4.078125 -3.515625 L 3.875 -2.734375 L 3.4375 -0.953125 C 3.390625 -0.796875 2.96875 -0.109375 2.3125 -0.109375 C 1.8125 -0.109375 1.703125 -0.546875 1.703125 -0.90625 C 1.703125 -1.359375 1.875 -1.984375 2.203125 -2.84375 C 2.359375 -3.25 2.40625 -3.359375 2.40625 -3.5625 C 2.40625 -4 2.09375 -4.375 1.59375 -4.375 C 0.65625 -4.375 0.28125 -2.9375 0.28125 -2.84375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.765625 0.5625 -2.921875 C 0.828125 -3.859375 1.21875 -4.15625 1.5625 -4.15625 C 1.640625 -4.15625 1.8125 -4.15625 1.8125 -3.84375 C 1.8125 -3.59375 1.71875 -3.328125 1.640625 -3.140625 C 1.25 -2.09375 1.0625 -1.53125 1.0625 -1.0625 C 1.0625 -0.1875 1.6875 0.109375 2.28125 0.109375 C 2.65625 0.109375 3 -0.0625 3.28125 -0.34375 C 3.140625 0.171875 3.03125 0.65625 2.625 1.1875 C 2.375 1.515625 2 1.8125 1.546875 1.8125 C 1.40625 1.8125 0.953125 1.78125 0.796875 1.390625 C 0.953125 1.390625 1.078125 1.390625 1.21875 1.28125 C 1.3125 1.1875 1.421875 1.0625 1.421875 0.875 C 1.421875 0.5625 1.140625 0.53125 1.046875 0.53125 C 0.828125 0.53125 0.5 0.6875 0.5 1.171875 C 0.5 1.65625 0.9375 2.03125 1.546875 2.03125 C 2.5625 2.03125 3.578125 1.125 3.859375 0.015625 Z M 4.8125 -3.765625 "/>
</g>
<g id="glyph-2-6">
<path d="M 4.3125 -3.734375 C 4.3125 -4.078125 4 -4.375 3.484375 -4.375 C 2.84375 -4.375 2.40625 -3.890625 2.21875 -3.609375 C 2.140625 -4.0625 1.796875 -4.375 1.328125 -4.375 C 0.875 -4.375 0.6875 -3.984375 0.59375 -3.8125 C 0.421875 -3.46875 0.28125 -2.875 0.28125 -2.84375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.765625 0.578125 -2.984375 C 0.734375 -3.671875 0.9375 -4.15625 1.296875 -4.15625 C 1.46875 -4.15625 1.609375 -4.078125 1.609375 -3.703125 C 1.609375 -3.484375 1.578125 -3.375 1.4375 -2.875 L 0.875 -0.578125 C 0.84375 -0.4375 0.78125 -0.203125 0.78125 -0.15625 C 0.78125 0.015625 0.921875 0.109375 1.0625 0.109375 C 1.1875 0.109375 1.359375 0.03125 1.4375 -0.171875 C 1.453125 -0.203125 1.796875 -1.546875 1.828125 -1.734375 L 2.140625 -3.015625 C 2.1875 -3.140625 2.46875 -3.609375 2.703125 -3.828125 C 2.78125 -3.890625 3.0625 -4.15625 3.484375 -4.15625 C 3.75 -4.15625 3.90625 -4.03125 3.90625 -4.03125 C 3.609375 -3.984375 3.390625 -3.75 3.390625 -3.484375 C 3.390625 -3.328125 3.5 -3.140625 3.765625 -3.140625 C 4.03125 -3.140625 4.3125 -3.375 4.3125 -3.734375 Z M 4.3125 -3.734375 "/>
</g>
<g id="glyph-2-7">
<path d="M 4.921875 -1.421875 C 4.921875 -1.515625 4.84375 -1.515625 4.8125 -1.515625 C 4.703125 -1.515625 4.703125 -1.46875 4.671875 -1.328125 C 4.5 -0.6875 4.328125 -0.109375 3.921875 -0.109375 C 3.65625 -0.109375 3.625 -0.359375 3.625 -0.5625 C 3.625 -0.796875 3.640625 -0.875 3.671875 -1.03125 L 5.109375 -6.75 C 5.109375 -6.75 5.109375 -6.859375 4.96875 -6.859375 C 4.828125 -6.859375 3.890625 -6.78125 3.71875 -6.75 C 3.640625 -6.75 3.578125 -6.703125 3.578125 -6.5625 C 3.578125 -6.453125 3.671875 -6.453125 3.8125 -6.453125 C 4.296875 -6.453125 4.3125 -6.375 4.3125 -6.28125 L 4.28125 -6.078125 L 3.6875 -3.734375 C 3.515625 -4.109375 3.21875 -4.375 2.78125 -4.375 C 1.625 -4.375 0.390625 -2.921875 0.390625 -1.46875 C 0.390625 -0.546875 0.9375 0.109375 1.71875 0.109375 C 1.90625 0.109375 2.40625 0.0625 3 -0.640625 C 3.078125 -0.21875 3.421875 0.109375 3.890625 0.109375 C 4.25 0.109375 4.46875 -0.125 4.625 -0.4375 C 4.796875 -0.796875 4.921875 -1.421875 4.921875 -1.421875 Z M 3.546875 -3.109375 L 3.046875 -1.171875 C 3 -1 3 -0.984375 2.84375 -0.8125 C 2.40625 -0.265625 2 -0.109375 1.734375 -0.109375 C 1.234375 -0.109375 1.09375 -0.65625 1.09375 -1.03125 C 1.09375 -1.53125 1.421875 -2.75 1.640625 -3.203125 C 1.953125 -3.78125 2.390625 -4.15625 2.796875 -4.15625 C 3.4375 -4.15625 3.578125 -3.34375 3.578125 -3.28125 C 3.578125 -3.21875 3.546875 -3.171875 3.546875 -3.109375 Z M 3.546875 -3.109375 "/>
</g> </g>
<g id="glyph-3-0"> <g id="glyph-3-0">
<path d="M 2.0625 -3.484375 C 2.0625 -3.703125 1.875 -3.875 1.65625 -3.875 C 1.390625 -3.875 1.3125 -3.640625 1.28125 -3.546875 L 0.359375 -0.546875 L 0.328125 -0.4375 C 0.328125 -0.359375 0.546875 -0.28125 0.609375 -0.28125 C 0.65625 -0.28125 0.671875 -0.3125 0.703125 -0.390625 L 2.015625 -3.28125 C 2.046875 -3.34375 2.0625 -3.390625 2.0625 -3.484375 Z M 2.0625 -3.484375 "/> <path d="M 4.859375 -1.421875 C 4.859375 -1.515625 4.765625 -1.515625 4.734375 -1.515625 C 4.640625 -1.515625 4.625 -1.46875 4.59375 -1.34375 C 4.390625 -0.609375 4.171875 -0.109375 3.734375 -0.109375 C 3.546875 -0.109375 3.421875 -0.21875 3.421875 -0.578125 C 3.421875 -0.75 3.453125 -0.96875 3.5 -1.125 C 3.53125 -1.296875 3.53125 -1.34375 3.53125 -1.4375 C 3.53125 -2.078125 2.90625 -2.375 2.078125 -2.484375 C 2.375 -2.65625 2.6875 -2.96875 2.921875 -3.203125 C 3.390625 -3.734375 3.859375 -4.15625 4.34375 -4.15625 C 4.390625 -4.15625 4.40625 -4.15625 4.421875 -4.15625 C 4.546875 -4.125 4.5625 -4.125 4.640625 -4.078125 C 4.65625 -4.0625 4.65625 -4.046875 4.671875 -4.03125 C 4.203125 -4 4.109375 -3.609375 4.109375 -3.5 C 4.109375 -3.34375 4.21875 -3.15625 4.484375 -3.15625 C 4.75 -3.15625 5.03125 -3.375 5.03125 -3.75 C 5.03125 -4.046875 4.796875 -4.375 4.359375 -4.375 C 4.078125 -4.375 3.625 -4.296875 2.90625 -3.5 C 2.578125 -3.125 2.1875 -2.734375 1.8125 -2.578125 L 2.84375 -6.765625 C 2.84375 -6.765625 2.84375 -6.875 2.71875 -6.875 C 2.484375 -6.875 1.765625 -6.796875 1.5 -6.78125 C 1.421875 -6.765625 1.3125 -6.75 1.3125 -6.578125 C 1.3125 -6.453125 1.40625 -6.453125 1.5625 -6.453125 C 2.03125 -6.453125 2.046875 -6.390625 2.046875 -6.296875 L 2.015625 -6.09375 L 0.578125 -0.390625 C 0.546875 -0.25 0.546875 -0.234375 0.546875 -0.171875 C 0.546875 0.0625 0.75 0.109375 0.828125 0.109375 C 0.953125 0.109375 1.109375 0.015625 1.171875 -0.09375 C 1.21875 -0.1875 1.671875 -2.015625 1.71875 -2.265625 C 2.0625 -2.234375 2.875 -2.078125 2.875 -1.421875 C 2.875 -1.359375 2.875 -1.3125 2.84375 -1.21875 C 2.828125 -1.09375 2.796875 -0.984375 2.796875 -0.875 C 2.796875 -0.28125 3.203125 0.109375 3.71875 0.109375 C 4.015625 0.109375 4.28125 -0.046875 4.5 -0.421875 C 4.75 -0.859375 4.859375 -1.421875 4.859375 -1.421875 Z M 4.859375 -1.421875 "/>
</g>
<g id="glyph-3-1">
<path d="M 7.140625 -2.59375 C 7.140625 -2.671875 7.09375 -2.703125 7.015625 -2.703125 C 6.78125 -2.703125 6.203125 -2.671875 5.96875 -2.671875 L 4.59375 -2.703125 C 4.5 -2.703125 4.375 -2.703125 4.375 -2.5 C 4.375 -2.390625 4.453125 -2.390625 4.671875 -2.390625 C 4.671875 -2.390625 4.96875 -2.390625 5.203125 -2.375 C 5.453125 -2.34375 5.515625 -2.3125 5.515625 -2.1875 C 5.515625 -2.09375 5.40625 -1.65625 5.296875 -1.28125 C 5.015625 -0.203125 3.734375 -0.09375 3.390625 -0.09375 C 2.4375 -0.09375 1.390625 -0.65625 1.390625 -2.171875 C 1.390625 -2.484375 1.5 -4.109375 2.53125 -5.40625 C 3.078125 -6.078125 4.03125 -6.671875 5.015625 -6.671875 C 6.015625 -6.671875 6.609375 -5.90625 6.609375 -4.765625 C 6.609375 -4.375 6.578125 -4.359375 6.578125 -4.265625 C 6.578125 -4.15625 6.6875 -4.15625 6.71875 -4.15625 C 6.859375 -4.15625 6.859375 -4.1875 6.90625 -4.359375 L 7.53125 -6.890625 C 7.53125 -6.921875 7.515625 -6.984375 7.421875 -6.984375 C 7.390625 -6.984375 7.375 -6.96875 7.265625 -6.859375 L 6.578125 -6.109375 C 6.484375 -6.234375 6.03125 -6.984375 4.9375 -6.984375 C 2.71875 -6.984375 0.5 -4.796875 0.5 -2.5 C 0.5 -0.921875 1.59375 0.21875 3.203125 0.21875 C 3.640625 0.21875 4.078125 0.125 4.4375 -0.015625 C 4.9375 -0.21875 5.125 -0.421875 5.296875 -0.625 C 5.390625 -0.375 5.640625 -0.015625 5.75 -0.015625 C 5.796875 -0.015625 5.8125 -0.046875 5.8125 -0.046875 C 5.828125 -0.0625 5.9375 -0.453125 5.984375 -0.65625 L 6.171875 -1.421875 C 6.21875 -1.578125 6.265625 -1.75 6.296875 -1.921875 C 6.40625 -2.375 6.421875 -2.390625 6.984375 -2.390625 C 7.03125 -2.390625 7.140625 -2.40625 7.140625 -2.59375 Z M 7.140625 -2.59375 "/>
</g>
<g id="glyph-3-2">
<path d="M 7.109375 -0.203125 C 7.109375 -0.3125 7.03125 -0.3125 6.828125 -0.3125 C 6.46875 -0.3125 6.1875 -0.3125 6.1875 -0.484375 C 6.1875 -0.546875 6.21875 -0.59375 6.21875 -0.65625 L 7.5625 -6 C 7.640625 -6.359375 7.671875 -6.453125 8.390625 -6.453125 C 8.640625 -6.453125 8.734375 -6.453125 8.734375 -6.65625 C 8.734375 -6.765625 8.625 -6.765625 8.59375 -6.765625 L 7.328125 -6.734375 L 6.046875 -6.765625 C 5.96875 -6.765625 5.859375 -6.765625 5.859375 -6.5625 C 5.859375 -6.453125 5.9375 -6.453125 6.125 -6.453125 C 6.125 -6.453125 6.34375 -6.453125 6.515625 -6.4375 C 6.6875 -6.421875 6.78125 -6.40625 6.78125 -6.28125 C 6.78125 -6.234375 6.765625 -6.21875 6.734375 -6.09375 L 6.140625 -3.671875 L 3.125 -3.671875 L 3.703125 -6 C 3.796875 -6.359375 3.828125 -6.453125 4.53125 -6.453125 C 4.796875 -6.453125 4.875 -6.453125 4.875 -6.65625 C 4.875 -6.765625 4.765625 -6.765625 4.734375 -6.765625 L 3.46875 -6.734375 L 2.1875 -6.765625 C 2.109375 -6.765625 2 -6.765625 2 -6.5625 C 2 -6.453125 2.09375 -6.453125 2.28125 -6.453125 C 2.28125 -6.453125 2.484375 -6.453125 2.65625 -6.4375 C 2.828125 -6.421875 2.921875 -6.40625 2.921875 -6.28125 C 2.921875 -6.234375 2.90625 -6.21875 2.875 -6.09375 L 1.5625 -0.765625 C 1.453125 -0.390625 1.4375 -0.3125 0.65625 -0.3125 C 0.46875 -0.3125 0.390625 -0.3125 0.390625 -0.109375 C 0.390625 0 0.53125 0 0.53125 0 L 1.78125 -0.03125 L 2.421875 -0.015625 C 2.640625 -0.015625 2.859375 0 3.0625 0 C 3.140625 0 3.265625 0 3.265625 -0.203125 C 3.265625 -0.3125 3.171875 -0.3125 2.984375 -0.3125 C 2.609375 -0.3125 2.34375 -0.3125 2.34375 -0.484375 C 2.34375 -0.546875 2.359375 -0.59375 2.375 -0.65625 L 3.046875 -3.375 L 6.0625 -3.375 L 5.375 -0.640625 C 5.28125 -0.3125 5.09375 -0.3125 4.484375 -0.3125 C 4.328125 -0.3125 4.234375 -0.3125 4.234375 -0.109375 C 4.234375 0 4.375 0 4.375 0 L 5.640625 -0.03125 L 6.265625 -0.015625 C 6.484375 -0.015625 6.703125 0 6.921875 0 C 7 0 7.109375 0 7.109375 -0.203125 Z M 7.109375 -0.203125 "/>
</g>
<g id="glyph-3-3">
<path d="M 5.375 -1.421875 C 5.375 -1.515625 5.296875 -1.515625 5.265625 -1.515625 C 5.15625 -1.515625 5.15625 -1.46875 5.125 -1.34375 C 4.984375 -0.78125 4.796875 -0.109375 4.375 -0.109375 C 4.171875 -0.109375 4.078125 -0.234375 4.078125 -0.5625 C 4.078125 -0.78125 4.1875 -1.25 4.265625 -1.59375 L 4.546875 -2.671875 C 4.578125 -2.8125 4.671875 -3.1875 4.71875 -3.34375 C 4.765625 -3.5625 4.859375 -3.9375 4.859375 -4 C 4.859375 -4.1875 4.71875 -4.265625 4.578125 -4.265625 C 4.53125 -4.265625 4.265625 -4.265625 4.1875 -3.921875 L 3.453125 -0.9375 C 3.4375 -0.90625 3.046875 -0.109375 2.3125 -0.109375 C 1.796875 -0.109375 1.703125 -0.5625 1.703125 -0.921875 C 1.703125 -1.46875 1.984375 -2.265625 2.234375 -2.9375 C 2.359375 -3.234375 2.40625 -3.375 2.40625 -3.5625 C 2.40625 -4.015625 2.09375 -4.375 1.59375 -4.375 C 0.65625 -4.375 0.28125 -2.9375 0.28125 -2.859375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.78125 0.5625 -2.9375 C 0.8125 -3.796875 1.1875 -4.15625 1.5625 -4.15625 C 1.65625 -4.15625 1.8125 -4.15625 1.8125 -3.828125 C 1.8125 -3.59375 1.703125 -3.3125 1.640625 -3.15625 C 1.28125 -2.171875 1.0625 -1.5625 1.0625 -1.078125 C 1.0625 -0.140625 1.75 0.109375 2.28125 0.109375 C 2.9375 0.109375 3.296875 -0.34375 3.46875 -0.5625 C 3.578125 -0.15625 3.921875 0.109375 4.34375 0.109375 C 4.703125 0.109375 4.921875 -0.125 5.078125 -0.4375 C 5.25 -0.796875 5.375 -1.421875 5.375 -1.421875 Z M 5.375 -1.421875 "/>
</g>
<g id="glyph-3-4">
<path d="M 5.65625 -1.421875 C 5.65625 -1.515625 5.5625 -1.515625 5.53125 -1.515625 C 5.4375 -1.515625 5.4375 -1.484375 5.390625 -1.34375 C 5.1875 -0.65625 4.859375 -0.109375 4.375 -0.109375 C 4.203125 -0.109375 4.140625 -0.203125 4.140625 -0.4375 C 4.140625 -0.6875 4.234375 -0.921875 4.3125 -1.140625 C 4.5 -1.671875 4.921875 -2.75 4.921875 -3.3125 C 4.921875 -3.984375 4.5 -4.375 3.78125 -4.375 C 2.890625 -4.375 2.40625 -3.75 2.234375 -3.515625 C 2.1875 -4.078125 1.78125 -4.375 1.328125 -4.375 C 0.875 -4.375 0.6875 -4 0.578125 -3.8125 C 0.421875 -3.484375 0.28125 -2.890625 0.28125 -2.859375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.765625 0.578125 -2.984375 C 0.75 -3.6875 0.9375 -4.15625 1.296875 -4.15625 C 1.5 -4.15625 1.609375 -4.03125 1.609375 -3.703125 C 1.609375 -3.5 1.578125 -3.390625 1.453125 -2.875 L 0.875 -0.578125 C 0.84375 -0.4375 0.78125 -0.203125 0.78125 -0.15625 C 0.78125 0.015625 0.921875 0.109375 1.0625 0.109375 C 1.1875 0.109375 1.359375 0.03125 1.4375 -0.171875 C 1.453125 -0.1875 1.5625 -0.65625 1.625 -0.90625 L 1.84375 -1.796875 C 1.90625 -2.015625 1.96875 -2.234375 2.015625 -2.453125 L 2.140625 -2.953125 C 2.28125 -3.265625 2.8125 -4.15625 3.75 -4.15625 C 4.203125 -4.15625 4.296875 -3.796875 4.296875 -3.46875 C 4.296875 -2.859375 3.796875 -1.578125 3.640625 -1.15625 C 3.5625 -0.9375 3.546875 -0.8125 3.546875 -0.703125 C 3.546875 -0.234375 3.890625 0.109375 4.359375 0.109375 C 5.296875 0.109375 5.65625 -1.34375 5.65625 -1.421875 Z M 5.65625 -1.421875 "/>
</g>
<g id="glyph-3-5">
<path d="M 4.8125 -3.78125 C 4.859375 -3.90625 4.859375 -3.9375 4.859375 -4 C 4.859375 -4.1875 4.71875 -4.265625 4.5625 -4.265625 C 4.46875 -4.265625 4.3125 -4.203125 4.21875 -4.0625 C 4.203125 -4.015625 4.125 -3.703125 4.078125 -3.53125 L 3.890625 -2.734375 L 3.4375 -0.953125 C 3.390625 -0.796875 2.96875 -0.109375 2.3125 -0.109375 C 1.8125 -0.109375 1.703125 -0.546875 1.703125 -0.90625 C 1.703125 -1.359375 1.875 -1.984375 2.203125 -2.859375 C 2.375 -3.265625 2.40625 -3.375 2.40625 -3.5625 C 2.40625 -4.015625 2.09375 -4.375 1.59375 -4.375 C 0.65625 -4.375 0.28125 -2.9375 0.28125 -2.859375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.78125 0.5625 -2.9375 C 0.828125 -3.859375 1.234375 -4.15625 1.5625 -4.15625 C 1.640625 -4.15625 1.8125 -4.15625 1.8125 -3.84375 C 1.8125 -3.59375 1.71875 -3.34375 1.640625 -3.15625 C 1.25 -2.09375 1.0625 -1.53125 1.0625 -1.0625 C 1.0625 -0.1875 1.6875 0.109375 2.28125 0.109375 C 2.671875 0.109375 3 -0.0625 3.28125 -0.34375 C 3.15625 0.171875 3.03125 0.65625 2.640625 1.1875 C 2.375 1.53125 2 1.8125 1.546875 1.8125 C 1.40625 1.8125 0.953125 1.78125 0.796875 1.390625 C 0.953125 1.390625 1.078125 1.390625 1.21875 1.28125 C 1.3125 1.1875 1.421875 1.0625 1.421875 0.875 C 1.421875 0.5625 1.15625 0.53125 1.046875 0.53125 C 0.828125 0.53125 0.5 0.6875 0.5 1.171875 C 0.5 1.671875 0.9375 2.03125 1.546875 2.03125 C 2.5625 2.03125 3.59375 1.125 3.859375 0.015625 Z M 4.8125 -3.78125 "/>
</g>
<g id="glyph-3-6">
<path d="M 4.3125 -3.734375 C 4.3125 -4.078125 4 -4.375 3.5 -4.375 C 2.859375 -4.375 2.421875 -3.890625 2.234375 -3.609375 C 2.15625 -4.0625 1.796875 -4.375 1.328125 -4.375 C 0.875 -4.375 0.6875 -4 0.59375 -3.8125 C 0.421875 -3.484375 0.28125 -2.875 0.28125 -2.859375 C 0.28125 -2.75 0.40625 -2.75 0.40625 -2.75 C 0.5 -2.75 0.515625 -2.765625 0.578125 -2.984375 C 0.75 -3.6875 0.9375 -4.15625 1.296875 -4.15625 C 1.46875 -4.15625 1.609375 -4.078125 1.609375 -3.703125 C 1.609375 -3.5 1.578125 -3.390625 1.453125 -2.875 L 0.875 -0.578125 C 0.84375 -0.4375 0.78125 -0.203125 0.78125 -0.15625 C 0.78125 0.015625 0.921875 0.109375 1.0625 0.109375 C 1.1875 0.109375 1.359375 0.03125 1.4375 -0.171875 C 1.453125 -0.203125 1.796875 -1.5625 1.828125 -1.734375 L 2.15625 -3.015625 C 2.1875 -3.15625 2.46875 -3.609375 2.703125 -3.828125 C 2.78125 -3.90625 3.078125 -4.15625 3.5 -4.15625 C 3.75 -4.15625 3.90625 -4.046875 3.90625 -4.046875 C 3.609375 -4 3.390625 -3.75 3.390625 -3.5 C 3.390625 -3.34375 3.5 -3.15625 3.78125 -3.15625 C 4.046875 -3.15625 4.3125 -3.375 4.3125 -3.734375 Z M 4.3125 -3.734375 "/>
</g>
<g id="glyph-3-7">
<path d="M 4.9375 -1.421875 C 4.9375 -1.515625 4.84375 -1.515625 4.8125 -1.515625 C 4.71875 -1.515625 4.703125 -1.46875 4.671875 -1.34375 C 4.5 -0.6875 4.328125 -0.109375 3.921875 -0.109375 C 3.65625 -0.109375 3.625 -0.359375 3.625 -0.5625 C 3.625 -0.796875 3.640625 -0.875 3.6875 -1.046875 L 5.109375 -6.765625 C 5.109375 -6.765625 5.109375 -6.875 4.984375 -6.875 C 4.828125 -6.875 3.890625 -6.78125 3.71875 -6.765625 C 3.640625 -6.75 3.59375 -6.703125 3.59375 -6.578125 C 3.59375 -6.453125 3.671875 -6.453125 3.828125 -6.453125 C 4.296875 -6.453125 4.3125 -6.390625 4.3125 -6.296875 L 4.296875 -6.09375 L 3.6875 -3.75 C 3.515625 -4.109375 3.234375 -4.375 2.78125 -4.375 C 1.625 -4.375 0.390625 -2.921875 0.390625 -1.46875 C 0.390625 -0.546875 0.9375 0.109375 1.71875 0.109375 C 1.90625 0.109375 2.40625 0.0625 3 -0.640625 C 3.078125 -0.21875 3.421875 0.109375 3.90625 0.109375 C 4.25 0.109375 4.484375 -0.125 4.640625 -0.4375 C 4.796875 -0.796875 4.9375 -1.421875 4.9375 -1.421875 Z M 3.546875 -3.125 L 3.046875 -1.171875 C 3 -1 3 -0.984375 2.859375 -0.8125 C 2.421875 -0.265625 2.015625 -0.109375 1.734375 -0.109375 C 1.234375 -0.109375 1.09375 -0.65625 1.09375 -1.046875 C 1.09375 -1.53125 1.421875 -2.75 1.640625 -3.203125 C 1.953125 -3.796875 2.390625 -4.15625 2.796875 -4.15625 C 3.4375 -4.15625 3.578125 -3.34375 3.578125 -3.28125 C 3.578125 -3.234375 3.5625 -3.171875 3.546875 -3.125 Z M 3.546875 -3.125 "/>
</g> </g>
<g id="glyph-4-0"> <g id="glyph-4-0">
<path d="M 5.53125 -0.140625 C 5.53125 -0.25 5.453125 -0.25 5.296875 -0.25 C 5.1875 -0.25 5.15625 -0.25 5.03125 -0.265625 C 4.875 -0.28125 4.875 -0.296875 4.875 -0.359375 C 4.875 -0.40625 4.90625 -0.484375 4.90625 -0.515625 L 5.828125 -4.171875 C 5.890625 -4.421875 5.890625 -4.484375 6.40625 -4.484375 C 6.5625 -4.484375 6.640625 -4.484375 6.640625 -4.625 C 6.640625 -4.65625 6.625 -4.734375 6.53125 -4.734375 C 6.328125 -4.734375 5.828125 -4.703125 5.625 -4.703125 C 5.515625 -4.703125 5.265625 -4.703125 5.15625 -4.703125 C 5.015625 -4.71875 4.84375 -4.734375 4.71875 -4.734375 C 4.671875 -4.734375 4.5625 -4.734375 4.5625 -4.578125 C 4.5625 -4.484375 4.65625 -4.484375 4.796875 -4.484375 C 4.796875 -4.484375 4.921875 -4.484375 5.046875 -4.46875 C 5.203125 -4.453125 5.21875 -4.4375 5.21875 -4.375 C 5.21875 -4.375 5.21875 -4.3125 5.1875 -4.21875 L 4.78125 -2.578125 L 2.453125 -2.578125 L 2.859375 -4.1875 C 2.921875 -4.421875 2.9375 -4.484375 3.46875 -4.484375 C 3.578125 -4.484375 3.671875 -4.484375 3.671875 -4.625 C 3.671875 -4.65625 3.65625 -4.734375 3.5625 -4.734375 C 3.359375 -4.734375 2.859375 -4.703125 2.65625 -4.703125 C 2.546875 -4.703125 2.296875 -4.703125 2.1875 -4.703125 C 2.046875 -4.71875 1.875 -4.734375 1.75 -4.734375 C 1.703125 -4.734375 1.59375 -4.734375 1.59375 -4.578125 C 1.59375 -4.484375 1.6875 -4.484375 1.828125 -4.484375 C 1.828125 -4.484375 1.953125 -4.484375 2.078125 -4.46875 C 2.234375 -4.453125 2.25 -4.4375 2.25 -4.375 C 2.25 -4.375 2.25 -4.3125 2.21875 -4.21875 L 1.296875 -0.546875 C 1.234375 -0.296875 1.21875 -0.25 0.6875 -0.25 C 0.5625 -0.25 0.484375 -0.25 0.484375 -0.109375 C 0.484375 -0.03125 0.53125 0 0.59375 0 C 0.796875 0 1.28125 -0.03125 1.484375 -0.03125 C 1.609375 -0.03125 1.84375 -0.03125 1.96875 -0.015625 C 2.109375 -0.015625 2.28125 0 2.40625 0 C 2.4375 0 2.546875 0 2.546875 -0.140625 C 2.546875 -0.25 2.484375 -0.25 2.328125 -0.25 C 2.21875 -0.25 2.1875 -0.25 2.0625 -0.265625 C 1.90625 -0.28125 1.90625 -0.296875 1.90625 -0.359375 C 1.90625 -0.359375 1.90625 -0.421875 1.9375 -0.515625 L 2.390625 -2.328125 L 4.71875 -2.328125 L 4.265625 -0.546875 C 4.203125 -0.296875 4.1875 -0.25 3.65625 -0.25 C 3.53125 -0.25 3.453125 -0.25 3.453125 -0.109375 C 3.453125 -0.03125 3.5 0 3.5625 0 C 3.765625 0 4.25 -0.03125 4.453125 -0.03125 C 4.578125 -0.03125 4.8125 -0.03125 4.9375 -0.015625 C 5.078125 -0.015625 5.25 0 5.375 0 C 5.40625 0 5.53125 0 5.53125 -0.140625 Z M 5.53125 -0.140625 "/> <path d="M 2.078125 -3.5 C 2.078125 -3.71875 1.890625 -3.875 1.671875 -3.875 C 1.390625 -3.875 1.3125 -3.65625 1.296875 -3.5625 L 0.375 -0.5625 L 0.328125 -0.4375 C 0.328125 -0.359375 0.546875 -0.28125 0.609375 -0.28125 C 0.65625 -0.28125 0.6875 -0.3125 0.703125 -0.390625 L 2.015625 -3.28125 C 2.046875 -3.34375 2.078125 -3.40625 2.078125 -3.5 Z M 2.078125 -3.5 "/>
</g> </g>
<g id="glyph-4-1"> <g id="glyph-5-0">
<path d="M 4.984375 -1.71875 C 4.984375 -1.75 4.984375 -1.828125 4.875 -1.828125 C 4.796875 -1.828125 4.78125 -1.78125 4.734375 -1.671875 C 4.46875 -1.015625 4.171875 -0.25 2.90625 -0.25 L 2.125 -0.25 C 1.90625 -0.25 1.890625 -0.25 1.890625 -0.3125 C 1.890625 -0.3125 1.890625 -0.359375 1.921875 -0.46875 L 2.859375 -4.15625 C 2.921875 -4.40625 2.9375 -4.484375 3.578125 -4.484375 C 3.78125 -4.484375 3.859375 -4.484375 3.859375 -4.625 C 3.859375 -4.625 3.84375 -4.734375 3.734375 -4.734375 C 3.578125 -4.734375 3.390625 -4.71875 3.21875 -4.703125 L 2.1875 -4.703125 C 2.046875 -4.703125 1.875 -4.734375 1.75 -4.734375 C 1.703125 -4.734375 1.59375 -4.734375 1.59375 -4.578125 C 1.59375 -4.484375 1.6875 -4.484375 1.828125 -4.484375 C 1.828125 -4.484375 1.953125 -4.484375 2.078125 -4.46875 C 2.234375 -4.453125 2.25 -4.4375 2.25 -4.375 C 2.25 -4.375 2.25 -4.3125 2.21875 -4.21875 L 1.296875 -0.546875 C 1.234375 -0.296875 1.21875 -0.25 0.6875 -0.25 C 0.5625 -0.25 0.484375 -0.25 0.484375 -0.109375 C 0.484375 0 0.5625 0 0.6875 0 L 4.171875 0 C 4.34375 0 4.34375 0 4.40625 -0.140625 C 4.46875 -0.328125 4.984375 -1.671875 4.984375 -1.71875 Z M 4.984375 -1.71875 "/> <path d="M 5.53125 -0.140625 C 5.53125 -0.25 5.46875 -0.25 5.3125 -0.25 C 5.203125 -0.25 5.171875 -0.25 5.046875 -0.265625 C 4.890625 -0.28125 4.890625 -0.296875 4.890625 -0.375 C 4.890625 -0.40625 4.90625 -0.484375 4.921875 -0.515625 L 5.828125 -4.171875 C 5.890625 -4.4375 5.90625 -4.484375 6.421875 -4.484375 C 6.578125 -4.484375 6.65625 -4.484375 6.65625 -4.640625 C 6.65625 -4.671875 6.640625 -4.734375 6.546875 -4.734375 C 6.34375 -4.734375 5.84375 -4.703125 5.640625 -4.703125 C 5.515625 -4.703125 5.28125 -4.703125 5.15625 -4.71875 C 5.015625 -4.71875 4.859375 -4.734375 4.71875 -4.734375 C 4.6875 -4.734375 4.578125 -4.734375 4.578125 -4.578125 C 4.578125 -4.484375 4.65625 -4.484375 4.796875 -4.484375 C 4.796875 -4.484375 4.9375 -4.484375 5.0625 -4.46875 C 5.203125 -4.453125 5.21875 -4.453125 5.21875 -4.375 C 5.21875 -4.375 5.21875 -4.328125 5.203125 -4.21875 L 4.78125 -2.59375 L 2.46875 -2.59375 L 2.859375 -4.203125 C 2.921875 -4.4375 2.9375 -4.484375 3.46875 -4.484375 C 3.59375 -4.484375 3.6875 -4.484375 3.6875 -4.640625 C 3.6875 -4.671875 3.65625 -4.734375 3.578125 -4.734375 C 3.375 -4.734375 2.859375 -4.703125 2.65625 -4.703125 C 2.546875 -4.703125 2.296875 -4.703125 2.1875 -4.71875 C 2.046875 -4.71875 1.875 -4.734375 1.75 -4.734375 C 1.703125 -4.734375 1.609375 -4.734375 1.609375 -4.578125 C 1.609375 -4.484375 1.6875 -4.484375 1.828125 -4.484375 C 1.828125 -4.484375 1.96875 -4.484375 2.09375 -4.46875 C 2.234375 -4.453125 2.25 -4.453125 2.25 -4.375 C 2.25 -4.375 2.25 -4.328125 2.21875 -4.21875 L 1.296875 -0.546875 C 1.234375 -0.3125 1.234375 -0.25 0.6875 -0.25 C 0.5625 -0.25 0.484375 -0.25 0.484375 -0.109375 C 0.484375 -0.03125 0.53125 0 0.59375 0 C 0.796875 0 1.296875 -0.03125 1.484375 -0.03125 C 1.609375 -0.03125 1.859375 -0.03125 1.96875 -0.015625 C 2.109375 -0.015625 2.28125 0 2.421875 0 C 2.453125 0 2.5625 0 2.5625 -0.140625 C 2.5625 -0.25 2.484375 -0.25 2.328125 -0.25 C 2.21875 -0.25 2.1875 -0.25 2.0625 -0.265625 C 1.921875 -0.28125 1.921875 -0.296875 1.921875 -0.375 C 1.921875 -0.375 1.921875 -0.421875 1.9375 -0.515625 L 2.40625 -2.34375 L 4.71875 -2.34375 L 4.28125 -0.546875 C 4.21875 -0.3125 4.203125 -0.25 3.65625 -0.25 C 3.546875 -0.25 3.453125 -0.25 3.453125 -0.109375 C 3.453125 -0.03125 3.5 0 3.5625 0 C 3.765625 0 4.265625 -0.03125 4.46875 -0.03125 C 4.578125 -0.03125 4.828125 -0.03125 4.953125 -0.015625 C 5.078125 -0.015625 5.265625 0 5.390625 0 C 5.421875 0 5.53125 0 5.53125 -0.140625 Z M 5.53125 -0.140625 "/>
</g> </g>
<g id="glyph-4-2"> <g id="glyph-5-1">
<path d="M 6.671875 -0.984375 C 6.671875 -1.078125 6.59375 -1.078125 6.5625 -1.078125 C 6.46875 -1.078125 6.46875 -1.03125 6.4375 -0.96875 C 6.28125 -0.40625 5.984375 -0.125 5.703125 -0.125 C 5.5625 -0.125 5.53125 -0.21875 5.53125 -0.359375 C 5.53125 -0.53125 5.5625 -0.609375 5.6875 -0.921875 C 5.765625 -1.140625 6.0625 -1.875 6.0625 -2.265625 C 6.0625 -2.375 6.0625 -2.671875 5.796875 -2.859375 C 5.6875 -2.953125 5.484375 -3.046875 5.15625 -3.046875 C 4.53125 -3.046875 4.15625 -2.640625 3.9375 -2.359375 C 3.875 -2.9375 3.390625 -3.046875 3.03125 -3.046875 C 2.453125 -3.046875 2.0625 -2.703125 1.859375 -2.421875 C 1.8125 -2.90625 1.40625 -3.046875 1.125 -3.046875 C 0.828125 -3.046875 0.671875 -2.84375 0.578125 -2.671875 C 0.421875 -2.421875 0.328125 -2.03125 0.328125 -2 C 0.328125 -1.90625 0.421875 -1.90625 0.4375 -1.90625 C 0.546875 -1.90625 0.546875 -1.921875 0.59375 -2.109375 C 0.703125 -2.515625 0.828125 -2.859375 1.09375 -2.859375 C 1.28125 -2.859375 1.328125 -2.703125 1.328125 -2.515625 C 1.328125 -2.390625 1.265625 -2.125 1.21875 -1.9375 L 1.0625 -1.328125 L 0.84375 -0.4375 C 0.8125 -0.34375 0.78125 -0.171875 0.78125 -0.15625 C 0.78125 0 0.90625 0.0625 1.015625 0.0625 C 1.140625 0.0625 1.25 -0.015625 1.28125 -0.078125 C 1.3125 -0.140625 1.375 -0.359375 1.40625 -0.515625 L 1.5625 -1.140625 C 1.59375 -1.28125 1.640625 -1.4375 1.671875 -1.59375 C 1.75 -1.875 1.765625 -1.9375 1.96875 -2.21875 C 2.15625 -2.5 2.484375 -2.859375 3 -2.859375 C 3.40625 -2.859375 3.40625 -2.5 3.40625 -2.375 C 3.40625 -2.203125 3.390625 -2.109375 3.296875 -1.71875 L 3 -0.5625 C 2.96875 -0.421875 2.90625 -0.1875 2.90625 -0.15625 C 2.90625 0 3.03125 0.0625 3.140625 0.0625 C 3.265625 0.0625 3.375 -0.015625 3.40625 -0.078125 C 3.453125 -0.140625 3.5 -0.359375 3.53125 -0.515625 L 3.6875 -1.140625 C 3.734375 -1.28125 3.765625 -1.4375 3.8125 -1.59375 C 3.890625 -1.890625 3.890625 -1.90625 4.015625 -2.125 C 4.25 -2.46875 4.59375 -2.859375 5.125 -2.859375 C 5.515625 -2.859375 5.53125 -2.546875 5.53125 -2.375 C 5.53125 -1.953125 5.234375 -1.1875 5.125 -0.90625 C 5.046875 -0.703125 5.03125 -0.640625 5.03125 -0.53125 C 5.03125 -0.15625 5.328125 0.0625 5.6875 0.0625 C 6.375 0.0625 6.671875 -0.890625 6.671875 -0.984375 Z M 6.671875 -0.984375 "/> <path d="M 5 -1.734375 C 5 -1.75 4.984375 -1.828125 4.890625 -1.828125 C 4.796875 -1.828125 4.78125 -1.796875 4.75 -1.671875 C 4.484375 -1.015625 4.171875 -0.25 2.90625 -0.25 L 2.125 -0.25 C 1.90625 -0.25 1.90625 -0.25 1.90625 -0.3125 C 1.90625 -0.3125 1.90625 -0.359375 1.921875 -0.46875 L 2.859375 -4.171875 C 2.921875 -4.421875 2.9375 -4.484375 3.578125 -4.484375 C 3.796875 -4.484375 3.859375 -4.484375 3.859375 -4.640625 C 3.859375 -4.640625 3.859375 -4.734375 3.75 -4.734375 C 3.59375 -4.734375 3.40625 -4.71875 3.234375 -4.71875 L 2.671875 -4.703125 L 2.203125 -4.71875 C 2.046875 -4.71875 1.890625 -4.734375 1.75 -4.734375 C 1.703125 -4.734375 1.609375 -4.734375 1.609375 -4.578125 C 1.609375 -4.484375 1.6875 -4.484375 1.828125 -4.484375 C 1.828125 -4.484375 1.96875 -4.484375 2.09375 -4.46875 C 2.234375 -4.453125 2.25 -4.453125 2.25 -4.375 C 2.25 -4.375 2.25 -4.328125 2.21875 -4.21875 L 1.296875 -0.546875 C 1.234375 -0.3125 1.21875 -0.25 0.6875 -0.25 C 0.5625 -0.25 0.484375 -0.25 0.484375 -0.109375 C 0.484375 0 0.5625 0 0.6875 0 L 4.171875 0 C 4.34375 0 4.359375 0 4.40625 -0.140625 C 4.484375 -0.328125 5 -1.671875 5 -1.734375 Z M 5 -1.734375 "/>
</g> </g>
<g id="glyph-4-3"> <g id="glyph-5-2">
<path d="M 3.84375 -2.609375 C 3.875 -2.703125 3.875 -2.71875 3.875 -2.765625 C 3.875 -2.90625 3.765625 -2.984375 3.640625 -2.984375 C 3.578125 -2.984375 3.4375 -2.953125 3.359375 -2.8125 C 3.34375 -2.78125 3.28125 -2.546875 3.25 -2.421875 L 3.109375 -1.84375 L 2.828125 -0.734375 C 2.828125 -0.734375 2.515625 -0.125 1.984375 -0.125 C 1.515625 -0.125 1.515625 -0.578125 1.515625 -0.703125 C 1.515625 -1.078125 1.671875 -1.515625 1.875 -2.046875 C 1.953125 -2.265625 2 -2.34375 2 -2.46875 C 2 -2.796875 1.703125 -3.046875 1.328125 -3.046875 C 0.640625 -3.046875 0.328125 -2.109375 0.328125 -2 C 0.328125 -1.90625 0.421875 -1.90625 0.4375 -1.90625 C 0.546875 -1.90625 0.546875 -1.9375 0.5625 -2.015625 C 0.734375 -2.59375 1.03125 -2.859375 1.3125 -2.859375 C 1.4375 -2.859375 1.484375 -2.78125 1.484375 -2.609375 C 1.484375 -2.453125 1.421875 -2.3125 1.390625 -2.21875 C 1.0625 -1.375 0.984375 -1.109375 0.984375 -0.8125 C 0.984375 -0.6875 0.984375 -0.359375 1.265625 -0.140625 C 1.46875 0.03125 1.765625 0.0625 1.953125 0.0625 C 2.234375 0.0625 2.484375 -0.03125 2.703125 -0.25 C 2.609375 0.140625 2.546875 0.421875 2.25 0.78125 C 2.0625 0.984375 1.78125 1.21875 1.421875 1.21875 C 1.375 1.21875 1.046875 1.21875 0.90625 0.984375 C 1.28125 0.953125 1.28125 0.609375 1.28125 0.609375 C 1.28125 0.390625 1.078125 0.34375 1 0.34375 C 0.828125 0.34375 0.609375 0.484375 0.609375 0.796875 C 0.609375 1.15625 0.9375 1.40625 1.421875 1.40625 C 2.125 1.40625 2.96875 0.875 3.1875 0 Z M 3.84375 -2.609375 "/> <path d="M 6.6875 -0.984375 C 6.6875 -1.078125 6.609375 -1.078125 6.578125 -1.078125 C 6.484375 -1.078125 6.484375 -1.046875 6.453125 -0.96875 C 6.296875 -0.40625 6 -0.125 5.71875 -0.125 C 5.578125 -0.125 5.546875 -0.21875 5.546875 -0.375 C 5.546875 -0.53125 5.578125 -0.625 5.703125 -0.921875 C 5.78125 -1.140625 6.078125 -1.875 6.078125 -2.265625 C 6.078125 -2.375 6.078125 -2.671875 5.8125 -2.875 C 5.703125 -2.96875 5.5 -3.0625 5.171875 -3.0625 C 4.546875 -3.0625 4.15625 -2.65625 3.9375 -2.359375 C 3.890625 -2.953125 3.390625 -3.0625 3.03125 -3.0625 C 2.46875 -3.0625 2.078125 -2.703125 1.859375 -2.421875 C 1.8125 -2.90625 1.40625 -3.0625 1.125 -3.0625 C 0.828125 -3.0625 0.671875 -2.84375 0.578125 -2.6875 C 0.421875 -2.421875 0.328125 -2.03125 0.328125 -2 C 0.328125 -1.90625 0.421875 -1.90625 0.4375 -1.90625 C 0.546875 -1.90625 0.546875 -1.921875 0.59375 -2.109375 C 0.703125 -2.53125 0.828125 -2.859375 1.109375 -2.859375 C 1.28125 -2.859375 1.328125 -2.71875 1.328125 -2.53125 C 1.328125 -2.390625 1.265625 -2.140625 1.21875 -1.953125 L 1.0625 -1.328125 L 0.84375 -0.4375 C 0.8125 -0.34375 0.78125 -0.171875 0.78125 -0.15625 C 0.78125 0 0.90625 0.0625 1.015625 0.0625 C 1.140625 0.0625 1.25 -0.015625 1.28125 -0.078125 C 1.3125 -0.140625 1.375 -0.375 1.40625 -0.515625 L 1.5625 -1.140625 C 1.609375 -1.296875 1.640625 -1.4375 1.671875 -1.609375 C 1.75 -1.890625 1.765625 -1.9375 1.96875 -2.234375 C 2.171875 -2.5 2.484375 -2.859375 3.015625 -2.859375 C 3.40625 -2.859375 3.421875 -2.515625 3.421875 -2.375 C 3.421875 -2.203125 3.40625 -2.109375 3.296875 -1.734375 L 3.015625 -0.5625 C 2.96875 -0.421875 2.90625 -0.1875 2.90625 -0.15625 C 2.90625 0 3.03125 0.0625 3.15625 0.0625 C 3.28125 0.0625 3.390625 -0.015625 3.421875 -0.078125 C 3.453125 -0.140625 3.515625 -0.375 3.546875 -0.515625 L 3.703125 -1.140625 C 3.734375 -1.296875 3.78125 -1.4375 3.8125 -1.609375 C 3.890625 -1.90625 3.890625 -1.921875 4.03125 -2.125 C 4.25 -2.46875 4.59375 -2.859375 5.140625 -2.859375 C 5.53125 -2.859375 5.546875 -2.546875 5.546875 -2.375 C 5.546875 -1.96875 5.25 -1.1875 5.140625 -0.90625 C 5.0625 -0.703125 5.03125 -0.640625 5.03125 -0.53125 C 5.03125 -0.15625 5.34375 0.0625 5.703125 0.0625 C 6.390625 0.0625 6.6875 -0.890625 6.6875 -0.984375 Z M 6.6875 -0.984375 "/>
</g>
<g id="glyph-5-3">
<path d="M 3.859375 -2.609375 C 3.890625 -2.71875 3.890625 -2.71875 3.890625 -2.765625 C 3.890625 -2.90625 3.78125 -2.984375 3.65625 -2.984375 C 3.578125 -2.984375 3.453125 -2.953125 3.375 -2.828125 C 3.34375 -2.78125 3.296875 -2.5625 3.265625 -2.421875 L 3.109375 -1.84375 L 2.84375 -0.734375 C 2.84375 -0.734375 2.53125 -0.125 1.984375 -0.125 C 1.515625 -0.125 1.515625 -0.578125 1.515625 -0.703125 C 1.515625 -1.078125 1.671875 -1.515625 1.875 -2.046875 C 1.96875 -2.265625 2 -2.359375 2 -2.46875 C 2 -2.796875 1.71875 -3.0625 1.34375 -3.0625 C 0.640625 -3.0625 0.328125 -2.109375 0.328125 -2 C 0.328125 -1.90625 0.421875 -1.90625 0.4375 -1.90625 C 0.546875 -1.90625 0.546875 -1.9375 0.5625 -2.015625 C 0.75 -2.59375 1.046875 -2.859375 1.3125 -2.859375 C 1.4375 -2.859375 1.484375 -2.78125 1.484375 -2.625 C 1.484375 -2.46875 1.421875 -2.3125 1.390625 -2.21875 C 1.0625 -1.375 0.984375 -1.109375 0.984375 -0.8125 C 0.984375 -0.6875 0.984375 -0.375 1.265625 -0.140625 C 1.484375 0.03125 1.765625 0.0625 1.953125 0.0625 C 2.234375 0.0625 2.484375 -0.03125 2.71875 -0.25 C 2.625 0.140625 2.546875 0.4375 2.25 0.78125 C 2.0625 0.984375 1.796875 1.21875 1.421875 1.21875 C 1.375 1.21875 1.046875 1.21875 0.90625 0.984375 C 1.28125 0.953125 1.28125 0.609375 1.28125 0.609375 C 1.28125 0.390625 1.078125 0.34375 1 0.34375 C 0.828125 0.34375 0.609375 0.484375 0.609375 0.8125 C 0.609375 1.15625 0.9375 1.421875 1.421875 1.421875 C 2.125 1.421875 2.984375 0.875 3.203125 0 Z M 3.859375 -2.609375 "/>
</g> </g>
</g> </g>
<clipPath id="clip-0"> <clipPath id="clip-0">
<path clip-rule="nonzero" d="M 1 7 L 152 7 L 152 105.621094 L 1 105.621094 Z M 1 7 "/> <path clip-rule="nonzero" d="M 0.273438 14 L 129 14 L 129 104.84375 L 0.273438 104.84375 Z M 0.273438 14 "/>
</clipPath> </clipPath>
<clipPath id="clip-1"> <clipPath id="clip-1">
<path clip-rule="nonzero" d="M 207 66 L 250 66 L 250 105.621094 L 207 105.621094 Z M 207 66 "/> <path clip-rule="nonzero" d="M 166 69 L 209 69 L 209 104.84375 L 166 104.84375 Z M 166 69 "/>
</clipPath> </clipPath>
<clipPath id="clip-2"> <clipPath id="clip-2">
<path clip-rule="nonzero" d="M 235 11 L 256.019531 11 L 256.019531 44 L 235 44 Z M 235 11 "/> <path clip-rule="nonzero" d="M 198 90 L 209.519531 90 L 209.519531 92 L 198 92 Z M 198 90 "/>
</clipPath>
<clipPath id="clip-3">
<path clip-rule="nonzero" d="M 181 75 L 209.519531 75 L 209.519531 104.84375 L 181 104.84375 Z M 181 75 "/>
</clipPath>
<clipPath id="clip-4">
<path clip-rule="nonzero" d="M 188 15 L 209.519531 15 L 209.519531 47 L 188 47 Z M 188 15 "/>
</clipPath>
<clipPath id="clip-5">
<path clip-rule="nonzero" d="M 0.273438 15 L 32 15 L 32 47 L 0.273438 47 Z M 0.273438 15 "/>
</clipPath>
<clipPath id="clip-6">
<path clip-rule="nonzero" d="M 83 75 L 116 75 L 116 104.84375 L 83 104.84375 Z M 83 75 "/>
</clipPath> </clipPath>
</defs> </defs>
<path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" d="M 1.769531 104.632812 L 150.519531 104.632812 L 150.519531 7.867188 L 1.769531 7.867188 Z M 1.769531 104.632812 "/> <path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" d="M 1.265625 103.855469 L 128.140625 103.855469 L 128.140625 14.917969 L 1.265625 14.917969 Z M 1.265625 103.855469 "/>
<g clip-path="url(#clip-0)"> <g clip-path="url(#clip-0)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -34.787882 -77.497917 L 114.928981 -77.497917 L 114.928981 19.896676 L -34.787882 19.896676 Z M -34.787882 -77.497917 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -25.132696 -73.51387 L 102.439135 -73.51387 L 102.439135 15.912098 L -25.132696 15.912098 Z M -25.132696 -73.51387 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
</g>
<path fill-rule="nonzero" fill="rgb(79.998779%, 88.941956%, 94.822693%)" fill-opacity="1" d="M 53.382812 72.507812 L 146.558594 72.507812 L 146.558594 14.730469 L 53.382812 14.730469 Z M 53.382812 72.507812 "/>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.974002 -0.00135521 C 6.974002 3.851652 3.852279 6.973375 -0.000728182 6.973375 C -3.849804 6.973375 -6.975458 3.851652 -6.975458 -0.00135521 C -6.975458 -3.850431 -3.849804 -6.972153 -0.000728182 -6.972153 C 3.852279 -6.972153 6.974002 -3.850431 6.974002 -0.00135521 Z M 6.974002 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="32.023763" y="30.532541"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="26.654662" y="42.317937"/> <use xlink:href="#glyph-0-0" x="35.708154" y="10.624647"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 37.931738 -0.00135521 C 37.931738 3.851652 34.806084 6.973375 30.957008 6.973375 C 27.104 6.973375 23.982278 3.851652 23.982278 -0.00135521 C 23.982278 -3.850431 27.104 -6.972153 30.957008 -6.972153 C 34.806084 -6.972153 37.931738 -3.850431 37.931738 -0.00135521 Z M 37.931738 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="62.779851" y="30.532541"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="57.410749" y="42.317937"/> <use xlink:href="#glyph-0-1" x="42.179187" y="10.624647"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 55.4354 -8.505493 L 78.113102 -8.505493 L 78.113102 8.502783 L 55.4354 8.502783 Z M 55.4354 -8.505493 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="99.944285" y="31.072034"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 130.132635 -8.505493 L 152.810336 -8.505493 L 152.810336 8.502783 L 130.132635 8.502783 Z M 130.132635 -8.505493 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="171.611454" y="31.356187"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="179.393869" y="27.763539"/> <use xlink:href="#glyph-0-2" x="52.634301" y="10.624647"/>
</g> <use xlink:href="#glyph-0-3" x="57.038487" y="10.624647"/>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 184.26739 -0.00135521 C 184.26739 3.851652 181.145668 6.973375 177.29266 6.973375 C 173.439653 6.973375 170.31793 3.851652 170.31793 -0.00135521 C 170.31793 -3.850431 173.439653 -6.972153 177.29266 -6.972153 C 181.145668 -6.972153 184.26739 -3.850431 184.26739 -0.00135521 Z M 184.26739 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <use xlink:href="#glyph-0-4" x="61.992578" y="10.624647"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="208.168834" y="30.532541"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 73.442313 -40.682038 L 96.120014 -40.682038 L 96.120014 -23.673762 L 73.442313 -23.673762 Z M 73.442313 -40.682038 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="116.672552" y="62.986592"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 37.432419 -40.682038 L 60.110121 -40.682038 L 60.110121 -23.673762 L 37.432419 -23.673762 Z M 37.432419 -40.682038 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-2" x="76.919941" y="62.244416"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="85.148457" y="63.728768"/> <use xlink:href="#glyph-0-5" x="67.220135" y="10.624647"/>
<use xlink:href="#glyph-0-6" x="71.073427" y="10.624647"/>
<use xlink:href="#glyph-0-3" x="74.954461" y="10.624647"/>
<use xlink:href="#glyph-0-7" x="79.908552" y="10.624647"/>
<use xlink:href="#glyph-0-7" x="82.661045" y="10.624647"/>
<use xlink:href="#glyph-0-8" x="85.413538" y="10.624647"/>
<use xlink:href="#glyph-0-6" x="89.817725" y="10.624647"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 55.4354 -69.029164 L 78.113102 -69.029164 L 78.113102 -52.020888 L 55.4354 -52.020888 Z M 55.4354 -69.029164 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.972357 0.00096828 C 6.972357 3.850118 3.849833 6.972643 0.000682573 6.972643 C -3.852395 6.972643 -6.97492 3.850118 -6.97492 0.00096828 C -6.97492 -3.852109 -3.852395 -6.974634 0.000682573 -6.974634 C 3.849833 -6.974634 6.972357 -3.852109 6.972357 0.00096828 Z M 6.972357 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-2" x="95.599525" y="90.407359"/> <use xlink:href="#glyph-1-0" x="21.94773" y="33.643223"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-1" x="103.827047" y="91.892705"/> <use xlink:href="#glyph-2-0" x="16.573248" y="45.440429"/>
</g> </g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 235.316406 87.769531 C 235.316406 83.941406 232.214844 80.839844 228.386719 80.839844 C 224.5625 80.839844 221.460938 83.941406 221.460938 87.769531 C 221.460938 91.597656 224.5625 94.699219 228.386719 94.699219 C 232.214844 94.699219 235.316406 91.597656 235.316406 87.769531 Z M 235.316406 87.769531 "/> <path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 29.427042 0.00096828 C 29.427042 3.850118 26.304517 6.972643 22.45144 6.972643 C 18.598362 6.972643 15.479765 3.850118 15.479765 0.00096828 C 15.479765 -3.852109 18.598362 -6.974634 22.45144 -6.974634 C 26.304517 -6.974634 29.427042 -3.852109 29.427042 0.00096828 Z M 29.427042 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="44.276096" y="33.643223"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="38.902609" y="45.440429"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 46.93282 -8.502511 L 69.611383 -8.502511 L 69.611383 8.504448 L 46.93282 8.504448 Z M 46.93282 -8.502511 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="81.477775" y="34.183257"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 113.126418 -8.502511 L 135.804982 -8.502511 L 135.804982 8.504448 L 113.126418 8.504448 Z M 113.126418 -8.502511 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="144.759217" y="34.467694"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="152.550425" y="30.871446"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 158.754557 0.00096828 C 158.754557 3.850118 155.632032 6.972643 151.778954 6.972643 C 147.929804 6.972643 144.807279 3.850118 144.807279 0.00096828 C 144.807279 -3.852109 147.929804 -6.974634 151.778954 -6.974634 C 155.632032 -6.974634 158.754557 -3.852109 158.754557 0.00096828 Z M 158.754557 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="172.896678" y="33.643223"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 66.355317 -40.682191 L 89.029953 -40.682191 L 89.029953 -23.675232 L 66.355317 -23.675232 Z M 66.355317 -40.682191 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="99.634056" y="66.129798"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 27.510322 -40.682191 L 50.188886 -40.682191 L 50.188886 -23.675232 L 27.510322 -23.675232 Z M 27.510322 -40.682191 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="57.022092" y="65.386878"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-0" x="65.257859" y="66.872717"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 46.93282 -69.028432 L 69.611383 -69.028432 L 69.611383 -52.021473 L 46.93282 -52.021473 Z M 46.93282 -69.028432 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="77.129656" y="93.578045"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-1" x="85.365423" y="95.064879"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 194.433594 90.9375 C 194.433594 87.105469 191.328125 84 187.496094 84 C 183.667969 84 180.5625 87.105469 180.5625 90.9375 C 180.5625 94.769531 183.667969 97.875 187.496094 97.875 C 191.328125 97.875 194.433594 94.769531 194.433594 90.9375 Z M 194.433594 90.9375 "/>
<g clip-path="url(#clip-1)"> <g clip-path="url(#clip-1)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 200.277029 -60.525026 C 200.277029 -56.672019 197.155307 -53.550296 193.302299 -53.550296 C 189.453224 -53.550296 186.331501 -56.672019 186.331501 -60.525026 C 186.331501 -64.378034 189.453224 -67.499756 193.302299 -67.499756 C 197.155307 -67.499756 200.277029 -64.378034 200.277029 -60.525026 Z M 200.277029 -60.525026 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 169.096202 -60.524953 C 169.096202 -56.671875 165.973677 -53.54935 162.120599 -53.54935 C 158.271449 -53.54935 155.148925 -56.671875 155.148925 -60.524953 C 155.148925 -64.378031 158.271449 -67.500555 162.120599 -67.500555 C 165.973677 -67.500555 169.096202 -64.378031 169.096202 -60.524953 Z M 169.096202 -60.524953 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="224.076436" y="90.66568"/> <use xlink:href="#glyph-1-0" x="183.182187" y="93.836624"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.974002 -0.00135521 L 19.346874 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.972357 0.00096828 L 10.845074 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052886 -0.00135521 L 1.610132 1.681387 L 3.088429 -0.00135521 L 1.610132 -1.684097 Z M 6.052886 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 52.736204, 27.635372)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051986 0.00096828 L 1.609752 1.682026 L 3.086569 0.00096828 L 1.609752 -1.684017 Z M 6.051986 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 34.223259, 30.74315)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 37.931738 -0.00135521 L 50.30461 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 29.427042 0.00096828 L 41.79931 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054581 -0.00135521 L 1.607896 1.681387 L 3.086193 -0.00135521 L 1.607896 -1.684097 Z M 6.054581 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 83.492331, 27.635372)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.05411 0.00096828 L 1.607949 1.682026 L 3.088693 0.00096828 L 1.607949 -1.684017 Z M 6.05411 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 65.010209, 30.74315)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 78.61242 -0.00135521 L 125.001844 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 70.106274 0.00096828 L 107.992908 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053676 -0.00135521 L 1.606991 1.681387 L 3.089219 -0.00135521 L 1.606991 -1.684097 Z M 6.053676 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 157.708075, 27.635372)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053698 0.00096828 L 1.607537 1.682026 L 3.088281 0.00096828 L 1.607537 -1.684017 Z M 6.053698 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 130.84265, 30.74315)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-3" x="155.670072" y="23.841035"/> <use xlink:href="#glyph-3-3" x="128.802853" y="26.945011"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 153.309654 -0.00135521 L 165.686458 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 136.3038 0.00096828 L 140.172589 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052308 -0.00135521 L 1.609554 1.681387 L 3.087851 -0.00135521 L 1.609554 -1.684097 Z M 6.052308 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 198.127402, 27.635372)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051531 0.00096828 L 1.609297 1.682026 L 3.086114 0.00096828 L 1.609297 -1.684017 Z M 6.051531 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 162.844806, 30.74315)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 106.959547 -0.00135521 L 106.959547 -32.1779 L 101.250805 -32.1779 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 98.456443 0.00096828 L 98.456443 -32.178712 L 94.163462 -32.178712 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053877 -0.0000204689 L 1.607192 1.682722 L 3.08942 -0.0000204689 L 1.607192 -1.682763 Z M 6.053877 -0.0000204689 " transform="matrix(-0.993542, 0, 0, 0.993542, 139.749156, 59.605489)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055228 0.000791884 L 1.609067 1.681849 L 3.085883 0.000791884 L 1.609067 -1.684193 Z M 6.055228 0.000791884 " transform="matrix(-0.994538, 0, 0, 0.994538, 122.73309, 62.745306)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 144.582031 27.636719 C 144.582031 26.542969 143.695312 25.65625 142.601562 25.65625 C 141.507812 25.65625 140.621094 26.542969 140.621094 27.636719 C 140.621094 28.730469 141.507812 29.613281 142.601562 29.613281 C 143.695312 29.613281 144.582031 28.730469 144.582031 27.636719 Z M 144.582031 27.636719 "/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 126.160156 30.742188 C 126.160156 29.648438 125.273438 28.761719 124.179688 28.761719 C 123.082031 28.761719 122.195312 29.648438 122.195312 30.742188 C 122.195312 31.835938 123.082031 32.726562 124.179688 32.726562 C 125.273438 32.726562 126.160156 31.835938 126.160156 30.742188 Z M 126.160156 30.742188 "/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 72.942995 -32.1779 L 65.240911 -32.1779 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 65.856498 -32.178712 L 55.318468 -32.178712 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054711 -0.0000204689 L 1.608025 1.682722 L 3.086322 -0.0000204689 L 1.608025 -1.682763 Z M 6.054711 -0.0000204689 " transform="matrix(-0.993542, 0, 0, 0.993542, 103.972641, 59.605489)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052384 0.000791884 L 1.610151 1.681849 L 3.086967 0.000791884 L 1.610151 -1.684193 Z M 6.052384 0.000791884 " transform="matrix(-0.994538, 0, 0, 0.994538, 84.101356, 62.745306)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 36.933101 -32.1779 L 30.957008 -32.1779 L 30.957008 -11.607557 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 27.011504 -32.178712 L 22.45144 -32.178712 L 22.45144 -11.609325 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054494 -0.00096764 L 1.607809 1.681774 L 3.086106 -0.00096764 L 1.607809 -1.68371 Z M 6.054494 -0.00096764 " transform="matrix(0, -0.993542, -0.993542, 0, 67.088882, 41.988051)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053434 0.000480462 L 1.607273 1.681538 L 3.088018 0.000480462 L 1.607273 -1.684505 Z M 6.053434 0.000480462 " transform="matrix(0, -0.994538, -0.994538, 0, 48.590322, 45.110213)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 204.912433 -60.525026 L 220.120018 -60.525026 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053469 0.000306185 L 1.606783 1.683048 L 3.089012 0.000306185 L 1.606783 -1.682436 Z M 6.053469 0.000306185 " transform="matrix(-0.993542, 0, 0, 0.993542, 242.740938, 87.769227)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-4" x="245.293526" y="83.974175"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 184.26739 -0.00135521 L 215.488546 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 253.621094 27.636719 L 249.207031 25.964844 L 250.675781 27.636719 L 249.207031 29.308594 Z M 253.621094 27.636719 "/>
<g clip-path="url(#clip-2)"> <g clip-path="url(#clip-2)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052366 -0.00135521 L 1.609612 1.681387 L 3.087909 -0.00135521 L 1.609612 -1.684097 Z M 6.052366 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 247.607814, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 173.730893 -60.524953 L 183.271286 -60.524953 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 195.84375 90.9375 L 200.265625 92.609375 L 198.792969 90.9375 L 200.265625 89.261719 Z M 195.84375 90.9375 "/>
<g clip-path="url(#clip-3)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054077 0.000232789 L 1.607916 1.68129 L 3.08866 0.000232789 L 1.607916 -1.684752 Z M 6.054077 0.000232789 " transform="matrix(-0.994538, 0, 0, 0.994538, 201.864758, 90.937268)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-5" x="246.02676" y="21.916544"/> <use xlink:href="#glyph-3-4" x="198.782506" y="87.138413"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 193.302299 -0.00135521 L 193.302299 -48.918824 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 158.754557 0.00096828 L 178.636595 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052234 -0.00153057 L 1.609481 1.681211 L 3.087777 -0.00153057 L 1.609481 -1.684273 Z M 6.052234 -0.00153057 " transform="matrix(0, 0.993542, 0.993542, 0, 228.388239, 73.416538)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 207.117188 30.742188 L 202.699219 29.070312 L 204.167969 30.742188 L 202.699219 32.417969 Z M 207.117188 30.742188 "/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 230.367188 27.636719 C 230.367188 26.542969 229.480469 25.65625 228.386719 25.65625 C 227.292969 25.65625 226.410156 26.542969 226.410156 27.636719 C 226.410156 28.730469 227.292969 29.613281 228.386719 29.613281 C 229.480469 29.613281 230.367188 28.730469 230.367188 27.636719 Z M 230.367188 27.636719 "/> <g clip-path="url(#clip-4)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -11.60693 -0.00135521 L -26.818447 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052037 0.00096828 L 1.609804 1.682026 L 3.086621 0.00096828 L 1.609804 -1.684017 Z M 6.052037 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 201.098208, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055121 -0.00135521 L 1.608436 1.681387 L 3.086733 -0.00135521 L 1.608436 -1.684097 Z M 6.055121 -0.00135521 " transform="matrix(0.993542, 0, 0, -0.993542, 21.980076, 27.635372)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-6" x="13.484268" y="23.841035"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 186.331501 -60.525026 L 83.243892 -60.525026 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052318 0.000306185 L 1.609564 1.683048 L 3.087861 0.000306185 L 1.609564 -1.682436 Z M 6.052318 0.000306185 " transform="matrix(-0.993542, 0, 0, 0.993542, 121.860889, 87.769227)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-5" x="118.230426" y="82.049684"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-2" x="123.082886" y="83.534035"/> <use xlink:href="#glyph-3-5" x="199.516475" y="25.018591"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 177.29266 11.608779 L 177.29266 26.816363 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 162.120599 0.00096828 L 162.120599 -48.918587 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053283 0.000390078 L 1.61053 1.683132 L 3.088826 0.000390078 L 1.61053 -1.682352 Z M 6.053283 0.000390078 " transform="matrix(0, 0.993542, 0.993542, 0, 212.480081, 13.282684)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052709 -0.00160062 L 1.610476 1.683384 L 3.087292 -0.00160062 L 1.610476 -1.682658 Z M 6.052709 -0.00160062 " transform="matrix(0, 0.994538, 0.994538, 0, 187.497686, 76.570196)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 189.480469 30.742188 C 189.480469 29.648438 188.59375 28.761719 187.496094 28.761719 C 186.402344 28.761719 185.515625 29.648438 185.515625 30.742188 C 185.515625 31.835938 186.402344 32.726562 187.496094 32.726562 C 188.59375 32.726562 189.480469 31.835938 189.480469 30.742188 Z M 189.480469 30.742188 "/>
<use xlink:href="#glyph-2-7" x="216.272163" y="11.66021"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -11.605683 0.00096828 L -21.146077 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 17.914062 30.742188 L 13.492188 29.070312 L 14.964844 30.742188 L 13.492188 32.417969 Z M 17.914062 30.742188 "/>
<g clip-path="url(#clip-5)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053149 0.00096828 L 1.606988 1.682026 L 3.087732 0.00096828 L 1.606988 -1.684017 Z M 6.053149 0.00096828 " transform="matrix(0.994538, 0, 0, -0.994538, 11.893978, 30.74315)"/>
</g> </g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> <g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-3" x="221.423679" y="13.144561"/> <use xlink:href="#glyph-3-6" x="9.02769" y="26.945011"/>
</g> </g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 54.940014 -60.525026 L -0.000728182 -60.525026 L -0.000728182 -11.607557 " transform="matrix(0.993542, 0, 0, -0.993542, 36.332755, 27.635372)"/> <path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 155.148925 -60.524953 L 74.740965 -60.524953 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054494 0.000728182 L 1.607809 1.68347 L 3.086106 0.000728182 L 1.607809 -1.682014 Z M 6.054494 0.000728182 " transform="matrix(0, -0.993542, -0.993542, 0, 36.332755, 41.988051)"/> <path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 97.398438 90.9375 L 101.816406 92.609375 L 100.347656 90.9375 L 101.816406 89.261719 Z M 97.398438 90.9375 "/>
<g clip-path="url(#clip-6)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051837 0.000232789 L 1.609604 1.68129 L 3.08642 0.000232789 L 1.609604 -1.684752 Z M 6.051837 0.000232789 " transform="matrix(-0.994538, 0, 0, 0.994538, 103.417218, 90.937268)"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-5" x="99.783237" y="85.211993"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-2" x="104.640559" y="86.697833"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 151.778954 11.607334 L 151.778954 21.147727 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051508 -0.000935665 L 1.609275 1.684049 L 3.086091 -0.000935665 L 1.609275 -1.681993 Z M 6.051508 -0.000935665 " transform="matrix(0, 0.994538, 0.994538, 0, 177.211868, 16.376078)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-7" x="181.008128" y="20.390013"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-3" x="186.164806" y="21.875852"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 46.434001 -60.524953 L 0.000682573 -60.524953 L 0.000682573 -11.609325 " transform="matrix(0.994538, 0, 0, -0.994538, 26.26104, 30.74315)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053434 -0.000682573 L 1.607273 1.684303 L 3.088018 -0.000682573 L 1.607273 -1.68174 Z M 6.053434 -0.000682573 " transform="matrix(0, -0.994538, -0.994538, 0, 26.26104, 45.110213)"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,49 +1,3 @@
@inproceedings{mahony05_compl_filter_desig_special_orthog,
author = {R. Mahony and T. Hamel and J.-M. Pflimlin},
title = {Complementary Filter Design on the Special Orthogonal Group
SO(3)},
booktitle = {Proceedings of the 44th IEEE Conference on Decision and
Control},
year = 2005,
doi = {10.1109/cdc.2005.1582367},
url = {https://doi.org/10.1109/cdc.2005.1582367},
keywords = {complementary filters},
}
@article{plummer06_optim_compl_filter_their_applic_motion_measur,
author = {A. R. Plummer},
title = {Optimal Complementary Filters and Their Application in
Motion Measurement},
journal = {Proceedings of the Institution of Mechanical Engineers,
Part I: Journal of Systems and Control Engineering},
volume = 220,
number = 6,
pages = {489-507},
year = 2006,
doi = {10.1243/09596518JSCE229},
url = {https://doi.org/10.1243/09596518JSCE229},
keywords = {complementary filters},
}
@inproceedings{jensen13_basic_uas,
author = {Austin Jensen and Cal Coopmans and YangQuan Chen},
title = {Basics and guidelines of complementary filters for small
UAS navigation},
booktitle = {2013 International Conference on Unmanned Aircraft Systems
(ICUAS)},
year = 2013,
doi = {10.1109/icuas.2013.6564726},
url = {https://doi.org/10.1109/icuas.2013.6564726},
keywords = {complementary filters},
month = 5,
}
@article{geng95_intel_contr_system_multip_degree, @article{geng95_intel_contr_system_multip_degree,
author = {Z. Jason Geng and George G. Pan and Leonard S. Haynes and author = {Z. Jason Geng and George G. Pan and Leonard S. Haynes and
Ben K. Wada and John A. Garba}, Ben K. Wada and John A. Garba},
@ -61,38 +15,6 @@
@book{preumont18_vibrat_contr_activ_struc_fourt_edition,
author = {Andre Preumont},
title = {Vibration Control of Active Structures - Fourth Edition},
year = 2018,
publisher = {Springer International Publishing},
url = {https://doi.org/10.1007/978-3-319-72296-2},
doi = {10.1007/978-3-319-72296-2},
keywords = {favorite, parallel robot},
series = {Solid Mechanics and Its Applications},
}
@article{wang16_inves_activ_vibrat_isolat_stewar,
author = {Wang, Chaoxin and Xie, Xiling and Chen, Yanhao and Zhang,
Zhiyi},
title = {Investigation on Active Vibration Isolation of a Stewart
Platform With Piezoelectric Actuators},
journal = {Journal of Sound and Vibration},
volume = 383,
pages = {1-19},
year = 2016,
doi = {10.1016/j.jsv.2016.07.021},
url = {https://doi.org/10.1016/j.jsv.2016.07.021},
issn = {0022-460X},
keywords = {parallel robot},
month = {Nov},
publisher = {Elsevier BV},
}
@inproceedings{li01_simul_vibrat_isolat_point_contr, @inproceedings{li01_simul_vibrat_isolat_point_contr,
author = {Xiaochun Li and Jerry C. Hamann and John E. McInroy}, author = {Xiaochun Li and Jerry C. Hamann and John E. McInroy},
title = {Simultaneous Vibration Isolation and Pointing Control of title = {Simultaneous Vibration Isolation and Pointing Control of
@ -125,6 +47,25 @@
@article{wang16_inves_activ_vibrat_isolat_stewar,
author = {Wang, Chaoxin and Xie, Xiling and Chen, Yanhao and Zhang,
Zhiyi},
title = {Investigation on Active Vibration Isolation of a Stewart
Platform With Piezoelectric Actuators},
journal = {Journal of Sound and Vibration},
volume = 383,
pages = {1-19},
year = 2016,
doi = {10.1016/j.jsv.2016.07.021},
url = {https://doi.org/10.1016/j.jsv.2016.07.021},
issn = {0022-460X},
keywords = {parallel robot},
month = {Nov},
publisher = {Elsevier BV},
}
@inproceedings{xie17_model_contr_hybrid_passiv_activ, @inproceedings{xie17_model_contr_hybrid_passiv_activ,
author = {Xie, Xiling and Wang, Chaoxin and Zhang, Zhiyi}, author = {Xie, Xiling and Wang, Chaoxin and Zhang, Zhiyi},
title = {Modeling and Control of A Hybrid Passive/Active Stewart title = {Modeling and Control of A Hybrid Passive/Active Stewart
@ -183,56 +124,6 @@
@article{beijen14_two_sensor_contr_activ_vibrat,
author = {Michiel A. Beijen and Dirk Tjepkema and Johannes van Dijk},
title = {Two-Sensor Control in Active Vibration Isolation Using Hard
Mounts},
journal = {Control Engineering Practice},
volume = 26,
pages = {82-90},
year = 2014,
doi = {10.1016/j.conengprac.2013.12.015},
url = {https://doi.org/10.1016/j.conengprac.2013.12.015},
keywords = {complementary filters},
}
@article{yong16_high_speed_vertic_posit_stage,
author = "Yuen K. Yong and Andrew J. Fleming",
title = {High-Speed Vertical Positioning Stage With Integrated
Dual-Sensor Arrangement},
journal = "Sensors and Actuators A: Physical",
volume = 248,
pages = "184 - 192",
year = 2016,
doi = {10.1016/j.sna.2016.06.042},
url = {https://doi.org/https://doi.org/10.1016/j.sna.2016.06.042},
issn = "0924-4247",
keywords = {sesnsor fusion, complementary filters},
}
@article{yang19_dynam_model_decoup_contr_flexib,
author = {Yang, XiaoLong and Wu, HongTao and Chen, Bai and Kang,
ShengZheng and Cheng, ShiLi},
title = {Dynamic Modeling and Decoupled Control of a Flexible
Stewart Platform for Vibration Isolation},
journal = {Journal of Sound and Vibration},
volume = 439,
pages = {398-412},
year = 2019,
doi = {10.1016/j.jsv.2018.10.007},
url = {https://doi.org/10.1016/j.jsv.2018.10.007},
issn = {0022-460X},
keywords = {parallel robot, flexure, decoupled control},
month = 1,
publisher = {Elsevier BV},
}
@inproceedings{thayer98_stewar, @inproceedings{thayer98_stewar,
author = {D. Thayer and J. Vagners}, author = {D. Thayer and J. Vagners},
title = {A look at the pole/zero structure of a Stewart platform title = {A look at the pole/zero structure of a Stewart platform
@ -264,6 +155,25 @@
@article{yang19_dynam_model_decoup_contr_flexib,
author = {Yang, XiaoLong and Wu, HongTao and Chen, Bai and Kang,
ShengZheng and Cheng, ShiLi},
title = {Dynamic Modeling and Decoupled Control of a Flexible
Stewart Platform for Vibration Isolation},
journal = {Journal of Sound and Vibration},
volume = 439,
pages = {398-412},
year = 2019,
doi = {10.1016/j.jsv.2018.10.007},
url = {https://doi.org/10.1016/j.jsv.2018.10.007},
issn = {0022-460X},
keywords = {parallel robot, flexure, decoupled control},
month = 1,
publisher = {Elsevier BV},
}
@inproceedings{mcinroy99_dynam, @inproceedings{mcinroy99_dynam,
author = {J.E. McInroy}, author = {J.E. McInroy},
title = {Dynamic modeling of flexure jointed hexapods for control title = {Dynamic modeling of flexure jointed hexapods for control
@ -308,6 +218,180 @@
@article{furutani04_nanom_cuttin_machin_using_stewar,
author = {Katsushi Furutani and Michio Suzuki and Ryusei Kudoh},
title = {Nanometre-Cutting Machine Using a Stewart-Platform Parallel
Mechanism},
journal = {Measurement Science and Technology},
volume = 15,
number = 2,
pages = {467-474},
year = 2004,
doi = {10.1088/0957-0233/15/2/022},
url = {https://doi.org/10.1088/0957-0233/15/2/022},
keywords = {parallel robot, cubic configuration},
}
@article{du14_piezo_actuat_high_precis_flexib,
author = {Zhijiang Du and Ruochong Shi and Wei Dong},
title = {A Piezo-Actuated High-Precision Flexible Parallel Pointing
Mechanism: Conceptual Design, Development, and Experiments},
journal = {IEEE Transactions on Robotics},
volume = 30,
number = 1,
pages = {131-137},
year = 2014,
doi = {10.1109/tro.2013.2288800},
url = {https://doi.org/10.1109/tro.2013.2288800},
keywords = {parallel robot},
}
@inproceedings{obrien98_lesson,
author = {J.F. O'Brien and J.E. McInroy and D. Bodtke and M. Bruch
and J.C. Hamann},
title = {Lessons learned in nonlinear systems and flexible robots
through experiments on a 6 legged platform},
booktitle = {Proceedings of the 1998 American Control Conference. ACC
(IEEE Cat. No.98CH36207)},
year = 1998,
doi = {10.1109/acc.1998.703532},
url = {https://doi.org/10.1109/acc.1998.703532},
keywords = {parallel robot},
}
@article{kim00_robus_track_contr_desig_dof_paral_manip,
author = {Dong Hwan Kim and Ji-Yoon Kang and Kyo-Il Lee},
title = {Robust Tracking Control Design for a 6 Dof Parallel
Manipulator},
journal = {Journal of Robotic Systems},
volume = 17,
number = 10,
pages = {527-547},
year = 2000,
doi = {10.1002/1097-4563(200010)17:10$<$527::AID-ROB2>3.0.CO;2-A},
url =
{https://doi.org/10.1002/1097-4563(200010)17:10$<$527::AID-ROB2>3.0.CO;2-A},
keywords = {parallel robot},
}
@inproceedings{abbas14_vibrat_stewar_platf,
author = {Hussain Abbas and Huang Hai},
title = {Vibration isolation concepts for non-cubic Stewart Platform
using modal control},
booktitle = {Proceedings of 2014 11th International Bhurban Conference
on Applied Sciences \& Technology (IBCAST) Islamabad,
Pakistan, 14th - 18th January, 2014},
year = 2014,
doi = {10.1109/ibcast.2014.6778139},
url = {https://doi.org/10.1109/ibcast.2014.6778139},
keywords = {parallel robot},
month = 1,
}
@article{lei08_multi_objec_robus_activ_vibrat,
author = {Liu Lei and Wang Benli},
title = {Multi Objective Robust Active Vibration Control for Flexure
Jointed Struts of Stewart Platforms Via $H_\infty$ and $\mu$
Synthesis},
journal = {Chinese Journal of Aeronautics},
volume = 21,
number = 2,
pages = {125-133},
year = 2008,
doi = {10.1016/s1000-9361(08)60016-3},
url = {https://doi.org/10.1016/s1000-9361(08)60016-3},
keywords = {parallel robot},
}
@article{jiao18_dynam_model_exper_analy_stewar,
author = {Jian Jiao and Ying Wu and Kaiping Yu and Rui Zhao},
title = {Dynamic Modeling and Experimental Analyses of Stewart
Platform With Flexible Hinges},
journal = {Journal of Vibration and Control},
volume = 25,
number = 1,
pages = {151-171},
year = 2018,
doi = {10.1177/1077546318772474},
url = {https://doi.org/10.1177/1077546318772474},
keywords = {parallel robot, flexure},
}
@inproceedings{mahony05_compl_filter_desig_special_orthog,
author = {R. Mahony and T. Hamel and J.-M. Pflimlin},
title = {Complementary Filter Design on the Special Orthogonal Group
SO(3)},
booktitle = {Proceedings of the 44th IEEE Conference on Decision and
Control},
year = 2005,
doi = {10.1109/cdc.2005.1582367},
url = {https://doi.org/10.1109/cdc.2005.1582367},
keywords = {complementary filters},
}
@article{plummer06_optim_compl_filter_their_applic_motion_measur,
author = {A. R. Plummer},
title = {Optimal Complementary Filters and Their Application in
Motion Measurement},
journal = {Proceedings of the Institution of Mechanical Engineers,
Part I: Journal of Systems and Control Engineering},
volume = 220,
number = 6,
pages = {489-507},
year = 2006,
doi = {10.1243/09596518JSCE229},
url = {https://doi.org/10.1243/09596518JSCE229},
keywords = {complementary filters},
}
@inproceedings{jensen13_basic_uas,
author = {Austin Jensen and Cal Coopmans and YangQuan Chen},
title = {Basics and guidelines of complementary filters for small
UAS navigation},
booktitle = {2013 International Conference on Unmanned Aircraft Systems
(ICUAS)},
year = 2013,
doi = {10.1109/icuas.2013.6564726},
url = {https://doi.org/10.1109/icuas.2013.6564726},
keywords = {complementary filters},
month = 5,
}
@article{beijen14_two_sensor_contr_activ_vibrat,
author = {Michiel A. Beijen and Dirk Tjepkema and Johannes van Dijk},
title = {Two-Sensor Control in Active Vibration Isolation Using Hard
Mounts},
journal = {Control Engineering Practice},
volume = 26,
pages = {82-90},
year = 2014,
doi = {10.1016/j.conengprac.2013.12.015},
url = {https://doi.org/10.1016/j.conengprac.2013.12.015},
keywords = {complementary filters},
}
@article{bendat57_optim_filter_indep_measur_two, @article{bendat57_optim_filter_indep_measur_two,
author = {J. Bendat}, author = {J. Bendat},
title = {Optimum Filters for Independent Measurements of Two Related title = {Optimum Filters for Independent Measurements of Two Related
@ -416,6 +500,22 @@
@article{yong16_high_speed_vertic_posit_stage,
author = "Yuen K. Yong and Andrew J. Fleming",
title = {High-Speed Vertical Positioning Stage With Integrated
Dual-Sensor Arrangement},
journal = "Sensors and Actuators A: Physical",
volume = 248,
pages = "184 - 192",
year = 2016,
doi = {10.1016/j.sna.2016.06.042},
url = {https://doi.org/https://doi.org/10.1016/j.sna.2016.06.042},
issn = "0924-4247",
keywords = {sesnsor fusion, complementary filters},
}
@inproceedings{baerveldt97_low_cost_low_weigh_attit, @inproceedings{baerveldt97_low_cost_low_weigh_attit,
author = {A.-J. Baerveldt and R. Klang}, author = {A.-J. Baerveldt and R. Klang},
title = {A Low-Cost and Low-Weight Attitude Estimation System for an title = {A Low-Cost and Low-Weight Attitude Estimation System for an
@ -643,153 +743,6 @@
@article{furutani04_nanom_cuttin_machin_using_stewar,
author = {Katsushi Furutani and Michio Suzuki and Ryusei Kudoh},
title = {Nanometre-Cutting Machine Using a Stewart-Platform Parallel
Mechanism},
journal = {Measurement Science and Technology},
volume = 15,
number = 2,
pages = {467-474},
year = 2004,
doi = {10.1088/0957-0233/15/2/022},
url = {https://doi.org/10.1088/0957-0233/15/2/022},
keywords = {parallel robot, cubic configuration},
}
@article{du14_piezo_actuat_high_precis_flexib,
author = {Zhijiang Du and Ruochong Shi and Wei Dong},
title = {A Piezo-Actuated High-Precision Flexible Parallel Pointing
Mechanism: Conceptual Design, Development, and Experiments},
journal = {IEEE Transactions on Robotics},
volume = 30,
number = 1,
pages = {131-137},
year = 2014,
doi = {10.1109/tro.2013.2288800},
url = {https://doi.org/10.1109/tro.2013.2288800},
keywords = {parallel robot},
}
@inproceedings{obrien98_lesson,
author = {J.F. O'Brien and J.E. McInroy and D. Bodtke and M. Bruch
and J.C. Hamann},
title = {Lessons learned in nonlinear systems and flexible robots
through experiments on a 6 legged platform},
booktitle = {Proceedings of the 1998 American Control Conference. ACC
(IEEE Cat. No.98CH36207)},
year = 1998,
doi = {10.1109/acc.1998.703532},
url = {https://doi.org/10.1109/acc.1998.703532},
keywords = {parallel robot},
}
@article{kim00_robus_track_contr_desig_dof_paral_manip,
author = {Dong Hwan Kim and Ji-Yoon Kang and Kyo-Il Lee},
title = {Robust Tracking Control Design for a 6 Dof Parallel
Manipulator},
journal = {Journal of Robotic Systems},
volume = 17,
number = 10,
pages = {527-547},
year = 2000,
doi = {10.1002/1097-4563(200010)17:10$<$527::AID-ROB2>3.0.CO;2-A},
url =
{https://doi.org/10.1002/1097-4563(200010)17:10$<$527::AID-ROB2>3.0.CO;2-A},
keywords = {parallel robot},
}
@inproceedings{abbas14_vibrat_stewar_platf,
author = {Hussain Abbas and Huang Hai},
title = {Vibration isolation concepts for non-cubic Stewart Platform
using modal control},
booktitle = {Proceedings of 2014 11th International Bhurban Conference
on Applied Sciences \& Technology (IBCAST) Islamabad,
Pakistan, 14th - 18th January, 2014},
year = 2014,
doi = {10.1109/ibcast.2014.6778139},
url = {https://doi.org/10.1109/ibcast.2014.6778139},
keywords = {parallel robot},
month = 1,
}
@article{lei08_multi_objec_robus_activ_vibrat,
author = {Liu Lei and Wang Benli},
title = {Multi Objective Robust Active Vibration Control for Flexure
Jointed Struts of Stewart Platforms Via $H_\infty$ and $\mu$
Synthesis},
journal = {Chinese Journal of Aeronautics},
volume = 21,
number = 2,
pages = {125-133},
year = 2008,
doi = {10.1016/s1000-9361(08)60016-3},
url = {https://doi.org/10.1016/s1000-9361(08)60016-3},
keywords = {parallel robot},
}
@article{jiao18_dynam_model_exper_analy_stewar,
author = {Jian Jiao and Ying Wu and Kaiping Yu and Rui Zhao},
title = {Dynamic Modeling and Experimental Analyses of Stewart
Platform With Flexible Hinges},
journal = {Journal of Vibration and Control},
volume = 25,
number = 1,
pages = {151-171},
year = 2018,
doi = {10.1177/1077546318772474},
url = {https://doi.org/10.1177/1077546318772474},
keywords = {parallel robot, flexure},
}
@phdthesis{rankers98_machin,
author = {Rankers, Adrian Mathias},
keywords = {favorite},
school = {University of Twente},
title = {Machine dynamics in mechatronic systems: An engineering
approach.},
year = 1998,
}
@book{preumont94_random_vibrat_spect_analy,
author = {Andr{\'e} Preumont},
title = {Random Vibration and Spectral Analysis},
year = 1994,
publisher = {Springer Netherlands},
url = {https://doi.org/10.1007/978-94-017-2840-9},
doi = {10.1007/978-94-017-2840-9},
series = {Solid Mechanics and Its Applications},
}
@article{heertjes05_activ_vibrat_isolat_metrol_frames,
author = {Heertjes, Marcel and de Graaff, Koen and van der Toorn,
Jan-Gerard},
title = {Active Vibration Isolation of Metrology Frames; a Modal
Decoupled Control Design},
year = {2005},
keywords = {Decoupled Control},
}
@article{holterman05_activ_dampin_based_decoup_colloc_contr, @article{holterman05_activ_dampin_based_decoup_colloc_contr,
author = {J. Holterman and T.J.A. deVries}, author = {J. Holterman and T.J.A. deVries},
title = {Active Damping Based on Decoupled Collocated Control}, title = {Active Damping Based on Decoupled Collocated Control},
@ -805,6 +758,31 @@
@article{butler11_posit_contr_lithog_equip,
author = {Hans Butler},
title = {Position Control in Lithographic Equipment},
journal = {IEEE Control Systems},
volume = 31,
number = 5,
pages = {28-47},
year = 2011,
doi = {10.1109/mcs.2011.941882},
url = {https://doi.org/10.1109/mcs.2011.941882},
}
@phdthesis{rankers98_machin,
author = {Rankers, Adrian Mathias},
keywords = {favorite},
school = {University of Twente},
title = {Machine dynamics in mechatronic systems: An engineering
approach.},
year = 1998,
}
@inbook{lang17_under, @inbook{lang17_under,
author = {Lang, George Fox}, author = {Lang, George Fox},
booktitle = {Topics in Modal Analysis \& Testing, Volume 10}, booktitle = {Topics in Modal Analysis \& Testing, Volume 10},
@ -817,6 +795,19 @@
@book{preumont18_vibrat_contr_activ_struc_fourt_edition,
author = {Andre Preumont},
title = {Vibration Control of Active Structures - Fourth Edition},
year = 2018,
publisher = {Springer International Publishing},
url = {https://doi.org/10.1007/978-3-319-72296-2},
doi = {10.1007/978-3-319-72296-2},
keywords = {favorite, parallel robot},
series = {Solid Mechanics and Its Applications},
}
@book{brunton22_data, @book{brunton22_data,
author = {Brunton, Steven L and Kutz, J Nathan}, author = {Brunton, Steven L and Kutz, J Nathan},
title = {Data-driven science and engineering: Machine learning, title = {Data-driven science and engineering: Machine learning,
@ -857,33 +848,23 @@
@article{oomen18_advan_motion_contr_precis_mechat, @book{schmidt20_desig_high_perfor_mechat_third_revis_edition,
author = {Tom Oomen}, author = {Schmidt, R Munnig and Schitter, Georg and Rankers, Adrian},
title = {Advanced Motion Control for Precision Mechatronics: title = {The Design of High Performance Mechatronics - Third Revised
Control, Identification, and Learning of Complex Systems}, Edition},
journal = {IEEJ Journal of Industry Applications}, year = 2020,
volume = 7, publisher = {Ios Press},
number = 2,
pages = {127-140},
year = 2018,
doi = {10.1541/ieejjia.7.127},
url = {https://doi.org/10.1541/ieejjia.7.127},
keywords = {favorite}, keywords = {favorite},
} }
@article{lurie02_system_archit_trades_using_bode, @techreport{bibel92_guidel_h,
author = {Boris J. Lurie and Ali Ghavimi and Fred Y. Hadaegh and author = {Bibel, John E and Malyevac, D Stephen},
Edward Mettler}, institution = {NAVAL SURFACE WARFARE CENTER DAHLGREN DIV VA},
title = {System Architecture Trades Using Bode-Step Control Design}, title = {Guidelines for the selection of weighting functions for
journal = {Journal of Guidance, Control, and Dynamics}, H-infinity control},
volume = 25, year = 1992,
number = 2,
pages = {309-315},
year = 2002,
doi = {10.2514/2.4883},
url = {https://doi.org/10.2514/2.4883},
} }
@ -900,11 +881,31 @@
@techreport{bibel92_guidel_h, @article{verma20_virtual_sensor_fusion_high_precis_contr,
author = {Bibel, John E and Malyevac, D Stephen}, author = {Mohit Verma and Thomas Dehaeze and Guoying Zhao and
institution = {NAVAL SURFACE WARFARE CENTER DAHLGREN DIV VA}, Jennifer Watchi and Christophe Collette},
title = {Guidelines for the selection of weighting functions for title = {Virtual Sensor Fusion for High Precision Control},
H-infinity control}, journal = {Mechanical Systems and Signal Processing},
year = 1992, volume = 150,
pages = 107241,
year = 2020,
doi = {10.1016/j.ymssp.2020.107241},
url = {https://doi.org/10.1016/j.ymssp.2020.107241},
keywords = {complementary filters},
}
@article{saxena12_advan_inter_model_contr_techn,
author = {Sahaj Saxena and YogeshV Hote},
title = {Advances in Internal Model Control Technique: a Review and
Future Prospects},
journal = {IETE Technical Review},
volume = 29,
number = 6,
pages = 461,
year = 2012,
doi = {10.4103/0256-4602.105001},
url = {https://doi.org/10.4103/0256-4602.105001},
} }

View File

@ -1,4 +1,4 @@
#+TITLE: Control Optimization #+TITLE: Control of Parallel Manipulators
:DRAWER: :DRAWER:
#+LANGUAGE: en #+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com #+EMAIL: dehaeze.thomas@gmail.com
@ -104,6 +104,9 @@ Discussion about:
- *Decoupling strategies* - *Decoupling strategies*
- file:~/Cloud/research/matlab/decoupling-strategies/svd-control.org - file:~/Cloud/research/matlab/decoupling-strategies/svd-control.org
- *Control optimization* - *Control optimization*
- file:~/Cloud/research/papers/published/verma19_virtu_senso_fusio_high_preci_contr/elsarticle-template-harv.pdf
- file:~/Cloud/research/papers/dehaeze20_virtu_senso_fusio/index.org
** Unused ** Unused
*** Table with multi sensor control *** Table with multi sensor control
@ -804,6 +807,61 @@ sprintf('Hh: num = (%s) + (%s) * z^-1', num(2), num(1))
sprintf('Hh: den = (%s) + (%s) * z^-1', den(2), den(1)) sprintf('Hh: den = (%s) + (%s) * z^-1', den(2), den(1))
#+end_src #+end_src
*** Response time to change of reference signal
For the nominal system, the model is accurate and the transfer function from reference signal $r$ to output $y$ is $1$ eqref:eq:detail_control_cf_cl_performance_y and does not depends of the complementary filters.
However, one can add a pre-filter as shown in Figure ref:fig:detail_control_cf_arch_class_prefilter.
#+begin_src latex :file detail_control_cf_arch_class_prefilter.pdf
\tikzset{block/.default={0.8cm}{0.6cm}}
\tikzset{addb/.append style={scale=0.7}}
\tikzset{node distance=0.6}
\def\cdist{0.7}
\begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[block, left=of addfb] (Kr){$K_r$};
\node[block, right=of addfb] (K){$K$};
\node[block, right=of K] (G){$G^\prime$};
\node[addb={+}{}{}{}{}, right=of G] (adddy){};
\node[addb={+}{}{}{}{}, below right=0.7 and 0.3 of adddy] (addn) {};
\node[block, left=of addn] (Hl) {$H_L$};
\draw[->] (addfb.east) -- (K.west) node[above left]{};
\draw[->] (K.east) -- (G.west) node[above left]{$u$};
\draw[->] (G.east) -- (adddy.west);
\draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
\draw[->] (G-|addn)node[branch]{} -- (addn.north);
\draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
\draw[<-] (Kr.west) -- ++(-\cdist, 0) node[above right]{$r$};
\draw[->] (Kr.east) -- (addfb.west);
\draw[->] (addn.west) -- (Hl.east);
\draw[->] (Hl.west) -| (addfb.south);
\draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
\end{tikzpicture}
#+end_src
#+name: fig:detail_control_cf_arch_class_prefilter
#+caption: Prefilter used to limit input usage
#+RESULTS:
[[file:figs/detail_control_cf_arch_class_prefilter.png]]
The transfer function from $y$ to $r$ becomes $\frac{y}{r} = K_r$ and $K_r$ can we chosen to obtain acceptable response to change of the reference signal.
Typically, $K_r$ is a low pass filter of the form
\begin{equation}
K_r(s) = \frac{1}{1 + \tau s}
\end{equation}
with $\tau$ corresponding to the desired response time.
*** Input usage
Input usage due to disturbances $d_y$ and measurement noise $n$ is determined by $\big|\frac{u}{d_y}\big| = \big|\frac{u}{n}\big| = \big|G^{-1}H_L\big|$.
Thus it can be limited by setting an upper bound on $|H_L|$.
Input usage due to reference signal $r$ is determined by $\big|\frac{u}{r}\big| = \big|G^{-1} K_r\big|$ when using a pre-filter (Figure ref:fig:detail_control_cf_arch_class_prefilter) and $\big|\frac{u}{r}\big| = \big|G^{-1}\big|$ otherwise.
Proper choice of $|K_r|$ is then useful to limit input usage due to change of reference signal.
** DONE [#A] Fix the outline ** DONE [#A] Fix the outline
CLOSED: [2025-04-03 Thu 12:01] CLOSED: [2025-04-03 Thu 12:01]
@ -3206,60 +3264,35 @@ SVD decoupling can be implemented using measured data without requiring a model,
:END: :END:
<<sec:detail_control_cf>> <<sec:detail_control_cf>>
# file:~/Cloud/research/papers/published/verma19_virtu_senso_fusio_high_preci_contr/elsarticle-template-harv.pdf
# file:~/Cloud/research/papers/dehaeze20_virtu_senso_fusio/index.org
** Introduction :ignore: ** Introduction :ignore:
Once the system is properly decoupled using one of the approaches described in Section ref:sec:detail_control_decoupling, a diagonal controller can be tuned. Once the system is properly decoupled using one of the approaches described in Section ref:sec:detail_control_decoupling, SISO controllers can be individually tuned for each decoupled "directions".
This consists in tuning several SISO controllers. Several ways to design a controller to obtain a given performance while ensuring good robustness properties can be implemented.
There are several ways to design a controller to obtain a given performance while ensuring good robustness properties.
Performances of a feedback system (such as response time, disturbance rejection, ) depends on the obtained closed-loop transfer functions. # Add reference
For instance sensitivity, transmissibility, etc... Gang of Four. In some cases, "fixed" controller structures are utilized, such as PI and PID controllers [[cite:&furutani04_nanom_cuttin_machin_using_stewar;&du14_piezo_actuat_high_precis_flexib;&yang19_dynam_model_decoup_contr_flexib]].
The specifications can usually be expressed in terms of the shape of these closed-loop transfer functions [[cite:&skogestad07_multiv_feedb_contr, chapt. 3]]. In such cases, the controller coefficients are manually tuned to obtain acceptable performance and robustness.
In some cases, "fixed" controller structures are used, with as PI and PID controllers. Another popular method is Open-Loop shaping, that was used during the conceptual phase after the plan was decoupled in the frame of the struts.
In such case the controller coefficients are manually tuned to obtain acceptable performance and robustness. The idea of open-loop shaping is to tune the controller (using a series of standard leads, lags, notches, low pass filters) such that the open-loop transfer function $G(s)K(s)$ is made according to specification (i.e.
In many cases, PID+LPF can already lead to performances close to optimal, depending on the plant. bandwidth, gain and phase margins, gain at a specific frequency, etc...) [[cite:&schmidt20_desig_high_perfor_mechat_third_revis_edition, chapt. 4.4.7]].
Open-Loop shaping is very popular because the open-loop transfer function depends linearly on the controller, making it relatively straightforward to tune the controller to achieve desired open-loop characteristics.
Another key advantage is that controllers can be tuned directly from measured frequency response functions without requiring an explicit plant model.
However, the behavior (i.e. performance) of a feedback system is a function of closed-loop transfer functions [[cite:&skogestad07_multiv_feedb_contr, chapt. 3]].
Specifications can therefore be expressed in terms of the magnitude of closed-loop transfer functions, such as the sensitivity, plant sensitivity, and complementary sensitivity transfer functions.
With open-loop shaping, closed-loop transfer functions are changed only indirectly, which may make it difficult to directly address the specifications that are in terms of the closed-loop transfer functions.
Decoupled Open-Loop Shaping: In order to synthesize a controller that directly shapes the closed-loop transfer functions (and therefore the performance metric), $\mathcal{H}_\infty$ loop-shaping may be used [[cite:&skogestad07_multiv_feedb_contr]].
- Explain procedure when applying open-loop shaping [[cite:&schmidt20_desig_high_perfor_mechat_third_revis_edition, chapt. 4.4.7]] This approach requires a good model of the plant and expertise in selecting weighting functions that will define the wanted shape of different closed-loop transfer functions [[cite:&bibel92_guidel_h]].
[[cite:&steinbuch16_model_based]] $\mathcal{H}_{\infty}$ synthesis has been applied for the Stewart platform [[cite:&jiao18_dynam_model_exper_analy_stewar]], but comparative studies with more simple decentralized controllers did not show large improvements [[cite:&thayer02_six_axis_vibrat_isolat_system;&hauge04_sensor_contr_space_based_six]].
#+begin_quote
The key idea of loop-shaping is the modification of the controller such that the open-
loop is made according to specifications. The reason this works so well, is that the controller
enters linearly into the open-loop transfer l(j!) = g(j!)k(j!), so that it is fast and easy
to reason what is to be changed in the controller. However, in practice all specifications are
of course given in terms of the final system performance, i.e. as closed-loop specifications.
So we should convert the closed loop specs into specs on the open-loop.
#+end_quote
- The controller is usually manually tuned using a series of Integrators, Leads, Lags, Notches, low pass filters
- There are lots of tools to check stability, robustness margins and performances
- Open-Loop shaping is very popular as the open-loop gain depends linearly on the controller.
So the open-loop transfer function can easily be shaped by modifying the controller response.
- Different techniques for open loop shaping (choice of optimal open-loop gain shape) [[cite:&lurie02_system_archit_trades_using_bode]]
- But this is open-loop shaping, and it does not directly work on the closed loop transfer functions
- The huge advantage of this technique, is that one can tune the controllers based on the measured FRF of the system.
No plant model is required.
- This is what was done during the conceptual phase after the plan was decoupled in the frame of the struts.
In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions (i.e., directly addressing the closed-loop performances).
Model based control: In Section ref:ssec:detail_control_cf_control_arch, the proposed control architecture including the complementary filters is presented.
- Review of model based design (LQG, H-Infinity) applied to Stewart platform [[file:~/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org::*Multivariable Control][Multivariable Control]] In Section ref:ssec:detail_control_cf_trans_perf, typical performance requirements are translated into the shape of the complementary filters.
$\hinf$ loop-shaping [[cite:&skogestad07_multiv_feedb_contr]]. The design of the complementary filters is briefly discussed in Section ref:ssec:detail_control_cf_analytical_complementary_filters, and analytical formulas are proposed such that it is possible to change the closed-loop behavior of the system in real time.
- Difficulty to specify robustness to change of payload mass Finally, in Section ref:ssec:detail_control_cf_simulations, a numerical example is used to show how the proposed control architecture can be implemented in practice.
- Requires high level of expertise.
Far from standard in industry.
Application to Stewart platforms is not demonstrated (or performance increased compared to decoupled control and manual loop shaping).
In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions.
In this paper, we propose a new controller synthesis method
- based on the use of complementary high pass and low pass filters
- inverse based control
- direct translation of requirements such as disturbance rejection and robustness to plant uncertainty
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
@ -3289,8 +3322,11 @@ freqs = logspace(-1, 3, 1000);
<<ssec:detail_control_cf_control_arch>> <<ssec:detail_control_cf_control_arch>>
**** Virtual Sensor Fusion **** Virtual Sensor Fusion
Let's consider the control architecture represented in Figure ref:fig:detail_control_cf_arch where $G^\prime$ is the physical plant to control, $G$ is a model of the plant, $k$ is a gain, $H_L$ and $H_H$ are complementary filters ($H_L(s) + H_H(s) = 1$). The concept of using complementary filters in control architecture originates from sensor fusion techniques [[cite:&collette15_sensor_fusion_method_high_perfor]], where two sensors are combined using complementary filters.
The signals are the reference signal $r$, the output perturbation $d_y$, the measurement noise $n$ and the control input $u$. Building upon this concept, "virtual sensor fusion" [[cite:&verma20_virtual_sensor_fusion_high_precis_contr]] replaces one physical sensor with a model $G$ of the plant.
The control architecture is illustrated in Figure ref:fig:detail_control_cf_arch, where $G^\prime$ represents the physical plant to be controlled, $G$ is a model of the plant, $k$ is the controller, and $H_L$ and $H_H$ are complementary filters satisfying $H_L(s) + H_H(s) = 1$.
In this arrangement, the physical plant is controlled at low frequencies, while the plant model is utilized at high frequencies to enhance robustness.
#+begin_src latex :file detail_control_cf_arch.pdf #+begin_src latex :file detail_control_cf_arch.pdf
\tikzset{block/.default={0.8cm}{0.6cm}} \tikzset{block/.default={0.8cm}{0.6cm}}
@ -3300,15 +3336,15 @@ The signals are the reference signal $r$, the output perturbation $d_y$, the mea
\begin{tikzpicture} \begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){}; \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[block, right=of addfb] (K){$k$}; \node[block, right=0.3 of addfb] (K){$k$};
\node[block, right=2.5 of K] (G){$G^\prime$}; \node[block, right=2.2 of K] (G){$G^\prime$};
\node[addb={+}{}{}{}{}, right=of G] (adddy){}; \node[addb={+}{}{}{}{}, right=0.3 of G] (adddy){};
\coordinate[] (KG) at ($(K.east)+(0.3, 0)$); \coordinate[] (KG) at ($(K.east)+(0.3, 0)$);
\node[block, below=of KG] (Gm){$G$}; \node[block, below=of KG] (Gm){$G$};
\node[block, below=0.4 of Gm] (Hh){$H_H$}; \node[block, below=0.4 of Gm] (Hh){$H_H$};
\node[addb={+}{}{}{}{}, below=0.4 of Hh] (addcf){}; \node[addb={+}{}{}{}{}, below=0.4 of Hh] (addcf){};
\node[block, right= of addcf] (Hl) {$H_L$}; \node[block, right=0.3 of addcf] (Hl) {$H_L$};
\node[addb={+}{}{}{}{}, right=2.5 of Hl] (addn) {}; \node[addb={+}{}{}{}{}, right=2.1 of Hl] (addn) {};
\draw[->] (addfb.east) -- (K.west) node[above left]{}; \draw[->] (addfb.east) -- (K.west) node[above left]{};
@ -3319,12 +3355,12 @@ The signals are the reference signal $r$, the output perturbation $d_y$, the mea
\draw[->] (Hl.west) -- (addcf.east); \draw[->] (Hl.west) -- (addcf.east);
\draw[->] (addcf.west) -| (addfb.south) node[below right]{}; \draw[->] (addcf.west) -| (addfb.south) node[below right]{};
\draw[->] (G.east) -- (adddy.west); \draw[->] (G.east) -- (adddy.west);
\draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$}; \draw[<-] (addn.east) -- ++(0.5, 0) coordinate[](endpos) node[above left]{$n$};
\draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$}; \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
\draw[->] (adddy-|addn) node[branch]{} -- (addn.north); \draw[->] (adddy-|addn) node[branch]{} -- (addn.north);
\draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right](r){$r$}; \draw[<-] (addfb.west) -- ++(-0.5, 0) node[above right](r){$r$};
\draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$}; \draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$};
\draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$}; \draw[<-] (adddy.north) -- ++(0, 0.5) node[below right]{$d_y$};
\begin{scope}[on background layer] \begin{scope}[on background layer]
\node[fit={(Hl.south east) (r.north west)}, inner sep=4pt, draw, fill=black!20!white, dashed, label={RT controller}] (Kfb) {}; \node[fit={(Hl.south east) (r.north west)}, inner sep=4pt, draw, fill=black!20!white, dashed, label={RT controller}] (Kfb) {};
@ -3332,29 +3368,6 @@ The signals are the reference signal $r$, the output perturbation $d_y$, the mea
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
#+name: fig:detail_control_cf_arch
#+caption: Sensor Fusion Architecture
#+RESULTS:
[[file:figs/detail_control_cf_arch.png]]
The dynamics of the closed-loop system is described by eqref:eq:detail_control_cf_sf_cl_tf with $L = k(G H_H + G^\prime H_L)$.
\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf}
\begin{alignat}{5}
y &= \frac{1+kGH_H}{1+L} dy &&+ \frac{kG^{\prime}}{1+L} r &&- \frac{kG^{\prime}H_L}{1+L} n \\
u &= -\frac{kH_L}{1+L} dy &&+ \frac{k}{1+L} r &&- \frac{kH_L}{1+L} n
\end{alignat}
\end{subequations}
The idea of using such architecture comes from sensor fusion [[cite:&collette14_vibrat;&collette15_sensor_fusion_method_high_perfor]] where two sensors are used.
One is measuring the quantity that is required to control, the other is collocated with the actuator in such a way that stability is guaranteed.
The first one is low pass filtered in order to obtain good performance at low frequencies and the second one is high pass filtered to benefits from its good dynamical properties.
Here, the second sensor is replaced by a model $G$ of the plant which is assumed to be stable and minimum phase.
This lead to the idea of virtual sensor fusion presented in [[cite:&verma20_virtual_sensor_fusion_high_precis_contr]].
One may think that the control architecture shown in Figure ref:fig:detail_control_cf_arch is a multi-loop system, but because no non-linear saturation-type element is present in the inner-loop (containing $k$, $G$ and $H_H$ which are all numerically implemented), the structure is equivalent to the architecture shown in Figure ref:fig:detail_control_cf_arch_eq.
#+begin_src latex :file detail_control_cf_arch_eq.pdf #+begin_src latex :file detail_control_cf_arch_eq.pdf
\tikzset{block/.default={0.8cm}{0.6cm}} \tikzset{block/.default={0.8cm}{0.6cm}}
\tikzset{addb/.append style={scale=0.7}} \tikzset{addb/.append style={scale=0.7}}
@ -3363,68 +3376,70 @@ One may think that the control architecture shown in Figure ref:fig:detail_contr
\begin{tikzpicture} \begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){}; \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[addb={+}{}{}{}{-}, right=of addfb] (addK){}; \node[addb={+}{}{}{}{-}, right=0.3 of addfb] (addK){};
\node[block, right=of addK] (K){$k$}; \node[block, right=0.6 of addK] (K){$k$};
\node[block, right=1.8 of K] (G){$G^\prime$}; \node[block, right=1.5 of K] (G){$G^\prime$};
\node[addb={+}{}{}{}{}, right=of G] (adddy){}; \node[addb={+}{}{}{}{}, right=0.3 of G] (adddy){};
\node[block, below right=0.5 and -0.2 of K] (Gm){$G$}; \node[block, below right=0.5 and -0.15 of K] (Gm){$G$};
\node[block, below left =0.5 and -0.2 of K] (Hh){$H_H$}; \node[block, below left =0.5 and -0.15 of K] (Hh){$H_H$};
\node[block, below=1.5 of K] (Hl) {$H_L$}; \node[block, below=1.5 of K] (Hl) {$H_L$};
\node[addb={+}{}{}{}{}, right=3.8 of Hl] (addn) {}; \node[addb={+}{}{}{}{}, right=3.0 of Hl] (addn) {};
\draw[->] (addfb.east) -- (addK.west); \draw[->] (addfb.east) -- (addK.west);
\draw[->] (addK.east) -- (K.west); \draw[->] (addK.east) -- (K.west);
\draw[->] (K.east) -- (G.west) node[above left]{$u$}; \draw[->] (K.east) -- (G.west) node[above left]{$u$};
\draw[->] (G.east) -- (adddy.west); \draw[->] (G.east) -- (adddy.west);
\draw[->] ($(G.west)+(-0.8, 0)$) node[branch](cffb){} |- (Gm.east); \draw[->] ($(G.west)+(-0.5, 0)$) node[branch](cffb){} |- (Gm.east);
\draw[->] (Gm.west) -- (Hh.east); \draw[->] (Gm.west) -- (Hh.east);
\draw[->] (Hh.west) -| (addK.south); \draw[->] (Hh.west) -| (addK.south);
\draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$}; \draw[<-] (addn.east) -- ++(0.5, 0) coordinate[](endpos) node[above left]{$n$};
\draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$}; \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
\draw[->] (adddy-|addn) node[branch]{} -- (addn.north); \draw[->] (adddy-|addn) node[branch]{} -- (addn.north);
\draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right](r){$r$}; \draw[<-] (addfb.west) -- ++(-0.5, 0) node[above right](r){$r$};
\draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$}; \draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$};
\draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$}; \draw[<-] (adddy.north) -- ++(0, 0.5) node[below right]{$d_y$};
\draw[->] (Hl.west) -| (addfb.south) node[below right]{}; \draw[->] (Hl.west) -| (addfb.south) node[below right]{};
\begin{scope}[on background layer] \begin{scope}[on background layer]
\node[fit={(Hl.south -| cffb) (r.north west)}, inner sep=8pt, draw, fill=black!20!white, dashed] (Kfb) {}; \node[fit={(Hl.south -| cffb) (r.north west)}, inner sep=4pt, draw, fill=black!20!white, dashed, label={RT controller}] (Kfb) {};
\end{scope}
\begin{scope}[on background layer]
\node[fit={($(addK.west|-Hh.south)+(-0.1, 0)$) (K.north-|cffb)}, inner sep=4pt, fill=colorblue!20!white, dashed] (Kfb) {};
\end{scope} \end{scope}
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
#+name: fig:detail_control_cf_arch_eq #+name: fig:detail_control_cf_arch_and_eq
#+caption: Equivalent feedback architecture #+caption: Control architecture for virtual sensor fusion (\subref{fig:detail_control_cf_arch}). An equivalent architecture is shown in (\subref{fig:detail_control_cf_arch_eq}). The signals are the reference signal $r$, the output perturbation $d_y$, the measurement noise $n$ and the control input $u$.
#+RESULTS: #+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_arch}Virtual Sensor Fusion}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :scale 0.9
[[file:figs/detail_control_cf_arch.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_arch_eq}Equivalent Architecture}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :scale 0.9
[[file:figs/detail_control_cf_arch_eq.png]] [[file:figs/detail_control_cf_arch_eq.png]]
#+end_subfigure
#+end_figure
The dynamics of the system can be rewritten eqref:eq:detail_control_cf_sf_cl_tf_K with $K = \frac{k}{1 + H_H G k}$. Although the control architecture shown in Figure ref:fig:detail_control_cf_arch appears to be a multi-loop system, it should be noted that no non-linear saturation-type elements are present in the inner loop (containing $k$, $G$, and $H_H$, all numerically implemented).
Consequently, this structure is mathematically equivalent to the single-loop architecture illustrated in Figure ref:fig:detail_control_cf_arch_eq.
\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K}
\begin{alignat}{5}
y &= \frac{1}{1+G^{\prime} K H_L} dy &&+ \frac{G^{\prime} K}{1+G^{\prime} K H_L} r &&- \frac{G^{\prime} K H_L}{1+G^{\prime} K H_L} n \\
u &= \frac{-K H_L}{1+G^{\prime} K H_L} dy &&+ \frac{K}{1+G^{\prime} K H_L} r &&- \frac{K H_L}{1+G^{\prime} K H_L} n
\end{alignat}
\end{subequations}
**** Asymptotic behavior **** Asymptotic behavior
Let's take the extreme case of very high values for $k$. When considering the extreme case of very high values for $k$, the effective controller $K(s)$ converges to the inverse of the plant model multiplied by the inverse of the high-pass filter, as expressed in eqref:eq:detail_control_cf_high_k.
In that case $K(s)$ converges to plant inverse multiply by the inverse of the high pass filter eqref:eq:detail_control_cf_high_k.
\begin{equation}\label{eq:detail_control_cf_high_k} \begin{equation}\label{eq:detail_control_cf_high_k}
\lim_{k\to\infty} K(s) = \lim_{k\to\infty} \frac{k}{1+H_H(s) G(s) k} = \left( H_H(s) G(s) \right)^{-1} \lim_{k\to\infty} K(s) = \lim_{k\to\infty} \frac{k}{1+H_H(s) G(s) k} = \left( H_H(s) G(s) \right)^{-1}
\end{equation} \end{equation}
If the obtained $K$ is improper, a low pass filter can be added to have its causal realization. If the resulting $K$ is improper, a low-pass filter with sufficiently high corner frequency can be added to ensure its causal realization.
Also, we want $K$ to be stable, so $G$ and $H_H$ must be minimum phase transfer functions. Furthermore, for $K$ to be stable, both $G$ and $H_H$ must be minimum phase transfer functions.
With this assumptions, the resulting control architecture is shown on Figure ref:fig:detail_control_cf_arch_class. With these assumptions, the resulting control architecture is illustrated in Figure ref:fig:detail_control_cf_arch_class, where the complementary filters $H_L$ and $H_H$ remain the only tuning parameters.
The only "tuning parameters" are the complementary filters $H_L$ and $H_H$. The dynamics of this closed-loop system are described by eqref:eq:detail_control_cf_sf_cl_tf_K_inf.
#+begin_src latex :file detail_control_cf_arch_class.pdf #+begin_src latex :file detail_control_cf_arch_class.pdf
\tikzset{block/.default={0.8cm}{0.6cm}} \tikzset{block/.default={0.8cm}{0.6cm}}
@ -3462,46 +3477,44 @@ The only "tuning parameters" are the complementary filters $H_L$ and $H_H$.
#+RESULTS: #+RESULTS:
[[file:figs/detail_control_cf_arch_class.png]] [[file:figs/detail_control_cf_arch_class.png]]
The equations describing the dynamics of the closed-loop system of Figure ref:fig:detail_control_cf_arch_class \begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf}
\begin{subequations}
\begin{align} \begin{align}
y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\ y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\
u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u} u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u}
\end{align} \end{align}
\end{subequations} \end{subequations}
At frequencies where the model is accurate: $G^{-1} G^{\prime} \approx 1$, $H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1$ and the closed loop transfer functions are described by eqref:eq:detail_control_cf_sf_cl_tf_K_inf. At frequencies where the model accurately represents the physical plant ($G^{-1} G^{\prime} \approx 1$), the denominator simplifies to $H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1$, and the closed-loop transfer functions are described by eqref:eq:detail_control_cf_sf_cl_tf_K_inf_perfect.
\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf} \begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf_perfect}
\begin{alignat}{5} \begin{alignat}{5}
y &= H_H dy &&+ r &&- H_L n \label{eq:detail_control_cf_cl_performance_y} \\ y &= H_H dy &&+ r &&- H_L n \label{eq:detail_control_cf_cl_performance_y} \\
u &= -G^{-1} H_L dy &&+ G^{-1} r &&- G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u} u &= -G^{-1} H_L dy &&+ G^{-1} r &&- G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u}
\end{alignat} \end{alignat}
\end{subequations} \end{subequations}
The obtained sensitivity transfer function equals to the high pass filter $S = \frac{y}{dy} = H_H$ and the transmissibility transfer function equals to the low pass filter $T = \frac{y}{n} = H_L$. The sensitivity transfer function equals the high-pass filter $S = \frac{y}{dy} = H_H$, and the complementary sensitivity transfer function equals the low-pass filter $T = \frac{y}{n} = H_L$.
Hence, when the plant model closely approximates the actual system, the closed-loop behavior becomes fully determined by the designed complementary filters, enabling direct translation of performance requirements into filter design.
Assuming that we have a good model of the plant, we have then that the closed-loop behavior of the system converges to the designed complementary filters.
** Translating the performance requirements into the shapes of the complementary filters ** Translating the performance requirements into the shapes of the complementary filters
<<ssec:detail_control_cf_trans_perf>> <<ssec:detail_control_cf_trans_perf>>
**** Introduction :ignore: **** Introduction :ignore:
The required performance specifications in a feedback system can usually be translated into requirements on the upper bounds of $|S(j\omega)|$ and $|T(j\omega)|$ [[cite:&bibel92_guidel_h]]. Performance specifications in feedback systems can be expressed as upper bounds on the magnitudes of closed-loop transfer functions such that the sensitivity $|S(j\omega)|$ and complementary sensitivity $|T(j\omega)|$ transfer functions [[cite:&bibel92_guidel_h]].
The process of designing a controller $K(s)$ in order to obtain the desired shapes of $|S(j\omega)|$ and $|T(j\omega)|$ is called closed-loop shaping. The design of a controller $K(s)$ to achieve desired shapes of these closed-loop transfer functions is known as closed-loop shaping.
The equations eqref:eq:detail_control_cf_cl_system_y and eqref:eq:detail_control_cf_cl_system_u describing the dynamics of the studied feedback architecture are not written in terms of the controller $K(s)$ but in terms of the complementary filters $H_L(s)$ and $H_H(s)$. In the proposed control architecture, the closed-loop transfer functions eqref:eq:detail_control_cf_sf_cl_tf_K_inf are expressed in terms of the complementary filters $H_L(s)$ and $H_H(s)$ rather than directly through the controller $K(s)$.
The typical specifications are then translated into the desired shapes of the complementary filters. Therefore, performance requirements must be translated into constraints on the shapes of these complementary filters.
**** Nominal Stability (NS) **** Nominal Stability (NS)
The closed-loop system is stable if all its elements are stable ($K$, $G^\prime$ and $H_L$) and if the sensitivity function ($S = \frac{1}{1 + G^\prime K H_L}$) is stable. A closed-loop system is stable when all its elements (here $K$, $G^\prime$, and $H_L$) are stable and the sensitivity function $S = \frac{1}{1 + G^\prime K H_L}$ is stable.
For the nominal system ($G^\prime = G$), the sensitivity transfer function is equal to the high pass filter: $S(s) = H_H(s)$. For the nominal system ($G^\prime = G$), the sensitivity transfer function equals the high-pass filter: $S(s) = H_H(s)$.
Nominal stability is then guaranteed if $H_L$, $H_H$ and $G$ are stable and if $G$ and $H_H$ are minimum phase (to have $K$ stable). Nominal stability is therefore guaranteed when $H_L$, $H_H$, and $G$ are stable, and both $G$ and $H_H$ are minimum phase (ensuring $K$ is stable).
Therefore stable and minimum phase complementary filters need to be used. Consequently, stable and minimum phase complementary filters must be employed.
**** Nominal Performance (NP) **** Nominal Performance (NP)
Two performance weights $w_H$ and $w_L$ are here defined in such a way that performance specifications are satisfied is eqref:eq:detail_control_cf_weights is satisfied.
Performance specifications can be formalized using weighting functions $w_H$ and $w_L$, where performance is achieved when eqref:eq:detail_control_cf_weights is satisfied.
\begin{subequations}\label{eq:detail_control_cf_weights} \begin{subequations}\label{eq:detail_control_cf_weights}
\begin{align} \begin{align}
@ -3510,89 +3523,32 @@ Two performance weights $w_H$ and $w_L$ are here defined in such a way that perf
\end{align} \end{align}
\end{subequations} \end{subequations}
For the nominal system, we have $S = H_H$ and $T = H_L$, and then nominal performance is ensured by requiring eqref:eq:detail_control_cf_nominal_performance. For the nominal system, where $S = H_H$ and $T = H_L$, nominal performance is ensured by satisfying eqref:eq:detail_control_cf_nominal_performance.
\begin{empheq}[box=\fbox,left=\text{NP} \Longleftrightarrow \empheqlbrace]{align} \label{eq:detail_control_cf_nominal_performance} \begin{equation}\label{eq:detail_control_cf_nominal_performance}
&|w_H(j\omega) H_H(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hh}\\ \Aboxed{\text{NP} \Longleftrightarrow {\begin{cases*}
&|w_L(j\omega) H_L(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hl} |w_H(j\omega) H_H(j\omega)| \le 1 & \forall\omega \\
\end{empheq} |w_L(j\omega) H_L(j\omega)| \le 1 & \forall\omega
\end{cases*}}}
The translation of typical performance requirements on the shapes of the complementary filters is discussed below:
- for disturbance rejections, make $|S| = |H_H|$ small
- for noise attenuation, make $|T| = |H_L|$ small
- closed-loop bandwidth can be limited by requiring that $|T|$ is less than $\frac{1}{\sqrt{2}}$ above the maximum wanted bandwidth
Therefore, by properly choosing the shape of the complementary filters, the nominal performance specifications can be addressed.
Classical stability margins (gain and phase margins) can also be linked to the maximum amplitude of the sensitivity transfer function.
- [ ] Add reference
Typically, having $|S|_{\infty} \le 2$ guarantees a gain margin of at least $2$ and a phase margin of at least $\SI{29}{\degree}$.
**** TODO Response time to change of reference signal
For the nominal system, the model is accurate and the transfer function from reference signal $r$ to output $y$ is $1$ eqref:eq:detail_control_cf_cl_performance_y and does not depends of the complementary filters.
However, one can add a pre-filter as shown in Figure ref:fig:detail_control_cf_arch_class_prefilter.
#+begin_src latex :file detail_control_cf_arch_class_prefilter.pdf
\tikzset{block/.default={0.8cm}{0.6cm}}
\tikzset{addb/.append style={scale=0.7}}
\tikzset{node distance=0.6}
\def\cdist{0.7}
\begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[block, left=of addfb] (Kr){$K_r$};
\node[block, right=of addfb] (K){$K$};
\node[block, right=of K] (G){$G^\prime$};
\node[addb={+}{}{}{}{}, right=of G] (adddy){};
\node[addb={+}{}{}{}{}, below right=0.7 and 0.3 of adddy] (addn) {};
\node[block, left=of addn] (Hl) {$H_L$};
\draw[->] (addfb.east) -- (K.west) node[above left]{};
\draw[->] (K.east) -- (G.west) node[above left]{$u$};
\draw[->] (G.east) -- (adddy.west);
\draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
\draw[->] (G-|addn)node[branch]{} -- (addn.north);
\draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
\draw[<-] (Kr.west) -- ++(-\cdist, 0) node[above right]{$r$};
\draw[->] (Kr.east) -- (addfb.west);
\draw[->] (addn.west) -- (Hl.east);
\draw[->] (Hl.west) -| (addfb.south);
\draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
\end{tikzpicture}
#+end_src
#+name: fig:detail_control_cf_arch_class_prefilter
#+caption: Prefilter used to limit input usage
#+RESULTS:
[[file:figs/detail_control_cf_arch_class_prefilter.png]]
The transfer function from $y$ to $r$ becomes $\frac{y}{r} = K_r$ and $K_r$ can we chosen to obtain acceptable response to change of the reference signal.
Typically, $K_r$ is a low pass filter of the form
\begin{equation}
K_r(s) = \frac{1}{1 + \tau s}
\end{equation} \end{equation}
with $\tau$ corresponding to the desired response time.
**** TODO Input usage Typical performance requirements can therefore be translated into constraints on the complementary filters.
Input usage due to disturbances $d_y$ and measurement noise $n$ is determined by $\big|\frac{u}{d_y}\big| = \big|\frac{u}{n}\big| = \big|G^{-1}H_L\big|$. For disturbance rejection, the magnitude of the sensitivity function $|S(j\omega)| = |H_H(j\omega)|$ should be minimized, particularly at low frequencies where disturbances are usually most prominent.
Thus it can be limited by setting an upper bound on $|H_L|$. Similarly, for noise attenuation, the magnitude of the complementary sensitivity function $|T(j\omega)| = |H_L(j\omega)|$ should be minimized, especially at high frequencies where measurement noise typically dominates.
The closed-loop bandwidth can be effectively limited by ensuring that $|T(j\omega)|$ remains below $\frac{1}{\sqrt{2}}$ at frequencies above the maximum desired bandwidth.
By carefully selecting the shapes of these complementary filters, nominal performance specifications can be directly addressed in an intuitive manner.
Classical stability margins (gain and phase margins) are also related to the maximum amplitude of the sensitivity transfer function.
Input usage due to reference signal $r$ is determined by $\big|\frac{u}{r}\big| = \big|G^{-1} K_r\big|$ when using a pre-filter (Figure ref:fig:detail_control_cf_arch_class_prefilter) and $\big|\frac{u}{r}\big| = \big|G^{-1}\big|$ otherwise. Typically, maintaining $|S|_{\infty} \le 2$ ensures a gain margin of at least 2 and a phase margin of at least $\SI{29}{\degree}$.
Proper choice of $|K_r|$ is then useful to limit input usage due to change of reference signal.
**** Robust Stability (RS) **** Robust Stability (RS)
Robustness stability represents the ability of the control system to remain stable even though there are differences between the actual system $G^\prime$ and the model $G$ that was used for the design of the controller. Robust stability refers to a control system's ability to maintain stability despite discrepancies between the actual system $G^\prime$ and the model $G$ used for controller design.
These differences can have various origins such as unmodelled dynamics or non-linearities. These discrepancies may arise from unmodeled dynamics or nonlinearities.
To represent the differences between the model and the actual system, the input multiplicative uncertainty as represented in Figure ref:fig:detail_control_cf_input_uncertainty is used. To represent these model-plant differences, input multiplicative uncertainty as illustrated in Figure ref:fig:detail_control_cf_input_uncertainty is employed.
The set of possible plants $\Pi_i$ is described by eqref:eq:detail_control_cf_multiplicative_uncertainty.
Then, the set of possible plant is described by eqref:eq:detail_control_cf_multiplicative_uncertainty. With the weighting function $w_I$ selected such that all possible plants $G^\prime$ are contained within the set $\Pi_i$.
$w_I$ should be chosen such that all possible plants $G^\prime$ are contained in the set $\Pi_i$.
\begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty} \begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty}
\Pi_i: \quad G^\prime(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad |\Delta_I(j\omega)| \le 1 \ \forall\omega \Pi_i: \quad G^\prime(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad |\Delta_I(j\omega)| \le 1 \ \forall\omega
@ -3646,47 +3602,45 @@ $w_I$ should be chosen such that all possible plants $G^\prime$ are contained in
#+end_subfigure #+end_subfigure
#+end_figure #+end_figure
Considering input multiplicative uncertainty, the robust stability property can be derived graphically from the Nyquist plot (Figure ref:fig:detail_control_cf_nyquist_uncertainty), and eqref:eq:detail_control_cf_robust_stability_graphically is obtained, as proposed in [[cite:&skogestad07_multiv_feedb_contr, chapt. 7.5.1]]. When considering input multiplicative uncertainty, robust stability can be derived graphically from the Nyquist plot (illustrated in Figure ref:fig:detail_control_cf_nyquist_uncertainty), yielding to eqref:eq:detail_control_cf_robust_stability_graphically, as demonstrated in [[cite:&skogestad07_multiv_feedb_contr, chapt. 7.5.1]].
\begin{equation}\label{eq:detail_control_cf_robust_stability_graphically} \begin{equation}\label{eq:detail_control_cf_robust_stability_graphically}
\text{RS} \Longleftrightarrow \left|w_I(j\omega) L(j\omega) \right| \le \left| 1 + L(j\omega) \right| \quad \forall\omega \text{RS} \Longleftrightarrow \left|w_I(j\omega) L(j\omega) \right| \le \left| 1 + L(j\omega) \right| \quad \forall\omega
\end{equation} \end{equation}
After some algebraic manipulations, robust stability is then guaranteed by having the low pass filter $H_L$ satisfying eqref:eq:detail_control_cf_condition_robust_stability. After algebraic manipulation, robust stability is guaranteed when the low-pass complementary filter $H_L$ satisfies eqref:eq:detail_control_cf_condition_robust_stability.
\begin{equation}\label{eq:detail_control_cf_condition_robust_stability} \begin{equation}\label{eq:detail_control_cf_condition_robust_stability}
\boxed{\text{RS} \Longleftrightarrow |w_I(j\omega) H_L(j\omega)| \le 1 \quad \forall \omega} \boxed{\text{RS} \Longleftrightarrow |w_I(j\omega) H_L(j\omega)| \le 1 \quad \forall \omega}
\end{equation} \end{equation}
**** Robust Performance (RP) **** Robust Performance (RP)
Robust performance is a property for a controlled system to have its performance guaranteed even though the dynamics of the plant is changing within specified bounds.
For robust performance, we then require to have the performance condition valid for all possible plants in the defined uncertainty set eqref:eq:detail_control_cf_robust_perf_S. Robust performance ensures that performance specifications eqref:eq:detail_control_cf_weights are met even as plant dynamics varies within specified bounds.
This requires the performance condition to be valid for all possible plants in the defined uncertainty set $\Pi_i$:
\begin{equation}\label{eq:detail_control_cf_robust_perf_S} \begin{equation}\label{eq:detail_control_cf_robust_perf_S}
\text{RP} \Longleftrightarrow |w_H(j\omega) S(j\omega)| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \text{RP} \Longleftrightarrow |w_H(j\omega) S(j\omega)| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega
\end{equation} \end{equation}
Let's transform condition eqref:eq:detail_control_cf_robust_perf_S into a condition on the complementary filters eqref:eq:detail_control_cf_robust_performance. Transforming this condition into constraints on the complementary filters yields:
\begin{equation}\label{eq:detail_control_cf_robust_performance} \begin{equation}\label{eq:detail_control_cf_robust_performance}
\boxed{\text{RP} \Longleftrightarrow | w_H(j\omega) H_H(j\omega) | + | w_I(j\omega) H_L(j\omega) | \le 1, \ \forall\omega} \boxed{\text{RP} \Longleftrightarrow | w_H(j\omega) H_H(j\omega) | + | w_I(j\omega) H_L(j\omega) | \le 1, \ \forall\omega}
\end{equation} \end{equation}
Obtained condition for robust performance combines both the NP and RS conditions. The robust performance condition effectively combines both nominal performance eqref:eq:detail_control_cf_nominal_performance and robust stability conditions eqref:eq:detail_control_cf_condition_robust_stability.
If both NP and RS conditions are fulfilled, the robust performance will be fulfilled with a factor 2 [[cite:&skogestad07_multiv_feedb_contr, chapt. 7.6]]. If both NP and RS conditions are satisfied, robust performance will be achieved within a factor of 2 [[cite:&skogestad07_multiv_feedb_contr, chapt. 7.6]].
Therefore, for SISO systems, robust stability and nominal performance are usually sufficient. Therefore, for SISO systems, ensuring robust stability and nominal performance is typically sufficient.
** Complementary filter design ** Complementary filter design
<<ssec:detail_control_cf_analytical_complementary_filters>> <<ssec:detail_control_cf_analytical_complementary_filters>>
As was explained in Section ref:sec:detail_control_sensor, complementary filters can easily be shaped with the standard $\mathcal{H}_{\infty}$ synthesis. As proposed in Section ref:sec:detail_control_sensor, complementary filters can be shaped using standard $\mathcal{H}_{\infty}$ synthesis techniques.
As requirements can usually be expressed as upper bounds on the complementary filters' magnitude, this method is very well suited. This approach is particularly well-suited since performance requirements were expressed as upper bounds on the magnitude of the complementary filters (Section ref:ssec:detail_control_cf_trans_perf).
However, analytical formulas for complementary filters may also be used. Alternatively, analytical formulas for complementary filters may be employed.
For some applications, first-order complementary filters as shown in Equation eqref:eq:detail_control_cf_1st_order are sufficient.
For some applications, first order complementary filters eqref:eq:detail_control_cf_1st_order are sufficient.
\begin{subequations}\label{eq:detail_control_cf_1st_order} \begin{subequations}\label{eq:detail_control_cf_1st_order}
\begin{align} \begin{align}
@ -3695,8 +3649,7 @@ For some applications, first order complementary filters eqref:eq:detail_control
\end{align} \end{align}
\end{subequations} \end{subequations}
They can be expressed analytically in the digital domain using the Bilinear transformation. These filters can be transformed into the digital domain using the Bilinear transformation, resulting in the digital filter representations shown in Equation eqref:eq:detail_control_cf_1st_order_z.
In such case, digital filters eqref:eq:detail_control_cf_1st_order_z are obtained.
\begin{subequations}\label{eq:detail_control_cf_1st_order_z} \begin{subequations}\label{eq:detail_control_cf_1st_order_z}
\begin{align} \begin{align}
@ -3705,9 +3658,8 @@ In such case, digital filters eqref:eq:detail_control_cf_1st_order_z are obtaine
\end{align} \end{align}
\end{subequations} \end{subequations}
The main advantage of having analytical formulas for the complementary filters is that the parameter $\omega_0$ may be modified in real time. A significant advantage of using analytical formulas for complementary filters is that key parameters such as $\omega_0$ can be modified in real-time, as illustrated in Figure ref:fig:detail_control_cf_arch_tunable_params.
This is illustrated in Figure ref:fig:detail_control_cf_arch_tunable_params. This real-time tunability allows rapid testing of different control bandwidths to evaluate performance and robustness characteristics.
Therefore, the performance and robustness of different control bandwidth can be tested very quickly.
#+begin_src latex :file detail_control_cf_arch_tunable_params.pdf #+begin_src latex :file detail_control_cf_arch_tunable_params.pdf
\tikzset{block/.default={0.8cm}{0.6cm}} \tikzset{block/.default={0.8cm}{0.6cm}}
@ -3752,8 +3704,9 @@ Therefore, the performance and robustness of different control bandwidth can be
#+RESULTS: #+RESULTS:
[[file:figs/detail_control_cf_arch_tunable_params.png]] [[file:figs/detail_control_cf_arch_tunable_params.png]]
For many applications, slope of $+2$ is wanted at low frequency for the sensitivity transfer function (to follow ramp inputs for instance), and a slope of $-2$ for the complementary sensitivity transfer function. For many practical applications, first order complementary filters are not sufficient.
In that case, complementary filters shown in equation eqref:eq:detail_control_cf_2nd_order are proposed. Specifically, a slope of $+2$ at low frequencies for the sensitivity transfer function (enabling accurate tracking of ramp inputs) and a slope of $-2$ for the complementary sensitivity transfer function are often desired.
For these cases, the second-order complementary filters presented in Equation eqref:eq:detail_control_cf_2nd_order are proposed.
\begin{subequations}\label{eq:detail_control_cf_2nd_order} \begin{subequations}\label{eq:detail_control_cf_2nd_order}
\begin{align} \begin{align}
@ -3762,8 +3715,12 @@ In that case, complementary filters shown in equation eqref:eq:detail_control_cf
\end{align} \end{align}
\end{subequations} \end{subequations}
The effect of $\alpha$ and $\omega_0$ and the obtained shape of the complementary filters is shown in Figure ref:fig:detail_control_cf_analytical_effect. The influence of parameters $\alpha$ and $\omega_0$ on the frequency response of these complementary filters is illustrated in Figure ref:fig:detail_control_cf_analytical_effect.
Such filters can also be implemented in the digital domain with analytical formulas, such as $\alpha$ and $\omega_0$ can be changed in real time. The parameter $\alpha$ primarily affects the damping characteristics near the crossover frequency, while $\omega_0$ determines the frequency at which the transition between high-pass and low-pass behavior occurs.
These filters can also be implemented in the digital domain with analytical formulas, preserving the ability to adjust $\alpha$ and $\omega_0$ in real-time.
The presented analytical formulations offer an attractive balance between design simplicity and performance.
This capability to tune parameters in real-time is particularly valuable during commissioning of the controller.
#+begin_src matlab :exports none :results none #+begin_src matlab :exports none :results none
%% Analytical Complementary Filters - Effect of alpha %% Analytical Complementary Filters - Effect of alpha
@ -3841,43 +3798,45 @@ exportFig('figs/detail_control_cf_analytical_effect_w0.pdf', 'width', 'half', 'h
** Numerical Example ** Numerical Example
<<ssec:detail_control_cf_simulations>> <<ssec:detail_control_cf_simulations>>
**** Procedure **** Procedure :ignore:
In order to apply this control technique, we propose the following procedure: To systematically apply the proposed control technique, the following procedure is recommended:
1. Identify the plant to be controlled in order to obtain the plant model $G$
2. Design the weighting function $w_I$ such that all possible plants $G^\prime$ are contained in the set $\Pi_i$ 1. Identify the plant to be controlled to obtain the plant model $G$.
3. Translate the performance requirements into upper bounds on the complementary filters (as explained in Section ref:ssec:detail_control_cf_trans_perf) 2. Design the weighting function $w_I$ such that all possible plants $G^\prime$ are contained in the uncertainty set $\Pi_i$.
4. Design the weighting functions $w_H$ and $w_L$ and generate the complementary filters using $\mathcal{H}_{\infty}\text{-synthesis}$ (as was explained in Section ref:ssec:detail_control_sensor_hinf_method). 3. Translate performance requirements into upper bounds on the complementary filters as explained in Section ref:ssec:detail_control_cf_trans_perf.
If the synthesis fails to give filters satisfying the upper bounds previously defined, either the requirements have to be reworked or a better model $G$ that will permits to have a smaller $w_I$ should be obtained. 4. Design the weighting functions $w_H$ and $w_L$ and generate the complementary filters using $\mathcal{H}_{\infty}\text{-synthesis}$ as described in Section ref:ssec:detail_control_sensor_hinf_method.
For simple cases, analytical formulas of complementary filters given in Section ref:ssec:detail_control_cf_analytical_complementary_filters can be used. If the synthesis fails to produce filters satisfying the defined upper bounds, either revise the requirements or develop a more accurate model $G$ that will allow for a smaller $w_I$.
6. If $K(s) = \left( G(s) H_H(s) \right)^{-1}$ is not proper, low pass filters should be added high a high corner frequency For simpler cases, the analytical formulas for complementary filters presented in Section ref:ssec:detail_control_cf_analytical_complementary_filters can be employed.
5. If $K(s) = H_H^{-1}(s) G^{-1}(s)$ is not proper, add low-pass filters with sufficiently high corner frequencies to ensure realizability.
**** Plant **** Plant
- To test this control architecture, a simple test model is used (Figure ref:fig:detail_control_cf_test_model). To evaluate this control architecture, a simple test model representative of many synchrotron positioning stages is utilized (Figure ref:fig:detail_control_cf_test_model).
- This model is quite similar to many positioning stages for Synchrotrons. In this model, a payload with mass $m$ is positioned on top of a stage.
A payload (i.e. sample) with mass $m = 5$ is positioned on top of the stage. The objective is to accurately position the sample relative to the X-ray beam.
The goal is to position the sample with respect to the x-ray.
It is supposed that the relative position $y$ between the payload an the x-ray is measured (typically the relative position between the focusing optics and the sample is performed).
There are some disturbance forces acting on the positioning stability, such as stage vibration $d_w$ and direct forces applied on the sample $d_F$ (for instance cable forces).
The positioning stage itself has a stiffness $k$, an internal damping $c$ and the force $F$ can be controlled.
The model of the plant $G(s)$ from actuator force $F$ to displacement $y$ is then The relative position $y$ between the payload and the X-ray is measured, which typically involves measuring the relative position between the focusing optics and the sample.
Various disturbance forces affect positioning stability, including stage vibrations $d_w$ and direct forces applied to the sample $d_F$ (such as cable forces).
The positioning stage itself is characterized by stiffness $k$, internal damping $c$, and a controllable force $F$.
The model of the plant $G(s)$ from actuator force $F$ to displacement $y$ is described by Equation eqref:eq:detail_control_cf_test_plant_tf.
\begin{equation}\label{eq:detail_control_cf_test_plant_tf} \begin{equation}\label{eq:detail_control_cf_test_plant_tf}
G(s) = \frac{1}{m s^2 + c s + k} G(s) = \frac{1}{m s^2 + c s + k}
\end{equation} \end{equation}
The values for the parameters of the models are $m = \SI{20}{\kg}$, $k = 1\si{\N/\mu\m}$ and $c = 10^2\si{\N\per(\m\per\s)}$. The parameter values are set to $m = \SI{20}{\kg}$, $k = 1\si{\N/\mu\m}$, and $c = 10^2\si{\N\per(\m\per\s)}$.
The plant dynamics has some uncertainty related to the limited support compliance, unmodeled flexible dynamics, dynamics of the payload, etc. The plant dynamics include uncertainties related to limited support compliance, unmodeled flexible dynamics, payload dynamics, and other factors.
A multiplicative input uncertainty weight $w_I(s)$ is used to specify the amount of uncertainty as a function of frequency eqref:eq:detail_control_cf_test_plant_uncertainty. These uncertainties are represented using a multiplicative input uncertainty weight eqref:eq:detail_control_cf_test_plant_uncertainty., which specifies the magnitude of uncertainty as a function of frequency:
\begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty} \begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty}
w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2} w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2}
\end{equation} \end{equation}
The nominal plant dynamics as well as the entire set of possible plants $\Pi_i$ are shown in Figure ref:fig:detail_control_cf_bode_plot_mech_sys. Figure ref:fig:detail_control_cf_bode_plot_mech_sys illustrates both the nominal plant dynamics and the complete set of possible plants $\Pi_i$ encompassed by the uncertainty model.
#+begin_src matlab #+begin_src matlab
%% Test model %% Test model
freqs = logspace(0, 3, 1000); % Frequency Vector [Hz] freqs = logspace(0, 3, 1000); % Frequency Vector [Hz]
@ -3949,18 +3908,20 @@ exportFig('figs/detail_control_cf_bode_plot_mech_sys.pdf', 'width', 'half', 'hei
**** Requirements and choice of complementary filters **** Requirements and choice of complementary filters
As explained in Section ref:ssec:detail_control_cf_trans_perf, nominal performance requirements can be expressed as upper bounds on the complementary filter shapes. As discussed in Section ref:ssec:detail_control_cf_trans_perf, nominal performance requirements can be expressed as upper bounds on the shapes of the complementary filters.
- Be able to follow ramp inputs (i.e. constant velocity scans) with no steady-state tracking error. For this example, the requirements are:
This requires to have a $+2$ slope at low frequency for $|S(j\omega)|$ - to track ramp inputs (constant velocity scans) with zero steady-state error, which necessitates a $+2$ slope at low frequencies for the magnitude of the sensitivity function $|S(j\omega)|$
- Filter the measurement noise above 300Hz as the sensor noise is high (say a filtering factor of 100 is needed above that frequency). - filtering of measurement noise above $\SI{300}{Hz}$, where sensor noise is significant (requiring a filtering factor of approximately 100 above this frequency)
- As much disturbance rejection as possible. - maximizing disturbance rejection
The second requirement is to have robust stability meaning that the plant should remain stable while considering the dynamical uncertainties modelled with $w_I$ Additionally, robust stability must be ensured, requiring the closed-loop system to remain stable despite the dynamic uncertainties modeled by $w_I$.
- The low-pass complementary filter magnitude $|H_L(j\omega)|$ should be bellow the inverse magnitude of the uncertainty weight magnitude $|w_I(j\omega)|$ eqref:eq:detail_control_cf_condition_robust_stability This condition is satisfied when the magnitude of the low-pass complementary filter $|H_L(j\omega)|$ remains below the inverse of the uncertainty weight magnitude $|w_I(j\omega)|$, as expressed in Equation eqref:eq:detail_control_cf_condition_robust_stability.
Robust performance is ensured by simultaneous NP and RS. Robust performance is achieved when both nominal performance and robust stability conditions are simultaneously satisfied.
All the requirements on $H_L$ and $H_H$ are represented on Figure ref:fig:detail_control_cf_specs_S_T. All requirements imposed on $H_L$ and $H_H$ are visualized in Figure ref:fig:detail_control_cf_specs_S_T.
While $\mathcal{H}_\infty$ synthesis could be employed to design the complementary filters, analytical formulas were used for this relatively simple example.
Specifically, the second-order complementary filters from Equation eqref:eq:detail_control_cf_2nd_order were selected, providing the desired $+2$ and $-2$ slopes, with parameters $\alpha = 1$ and $\omega_0 = 2\pi \cdot 20$ Hz.
#+name: fig:detail_control_cf_specs_S_T_obtained_filters #+name: fig:detail_control_cf_specs_S_T_obtained_filters
#+caption: Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}). #+caption: Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}).
@ -3980,11 +3941,6 @@ All the requirements on $H_L$ and $H_H$ are represented on Figure ref:fig:detail
#+end_subfigure #+end_subfigure
#+end_figure #+end_figure
While the $\mathcal{H}_\infty$ synthesis of complementary filters could be used, for this simple examples with simple requirements, analytical formulas of complementary filters were used.
For this simple example, analytical formulas proposed to have +2 and -2 slopes eqref:eq:detail_control_cf_2nd_order were used.
$\alpha = 1$ and $\omega_0 = 2\pi \cdot 20$ were used.
#+begin_src matlab #+begin_src matlab
%% Analytical Complementary Filters %% Analytical Complementary Filters
w0 = 2*pi*20; w0 = 2*pi*20;
@ -4017,17 +3973,18 @@ xticks([0.1, 1, 10, 100, 1000]);
**** Controller analysis **** Controller analysis
The controller to be implemented is $K(s) = \tilde{G}^{-1}(s) H_H^{-1}(s)$, with $\tilde{G}^{-1}(s)$ is the plant inverse which needs to be stable and proper. The controller to be implemented takes the form $K(s) = \tilde{G}^{-1}(s) H_H^{-1}(s)$, where $\tilde{G}^{-1}(s)$ represents the plant inverse, which must be both stable and proper.
Therefore, some low pass filters are added at high frequency eqref:eq:detail_control_cf_test_plant_inverse. To ensure properness, low-pass filters with high corner frequencies are added as shown in Equation eqref:eq:detail_control_cf_test_plant_inverse.
\begin{equation}\label{eq:detail_control_cf_test_plant_inverse} \begin{equation}\label{eq:detail_control_cf_test_plant_inverse}
\tilde{G}^{-1}(s) = \frac{m s^2 + c s + k}{1 + \frac{s}{2\pi \cdot 1000} + \left( \frac{s}{2\pi \cdot 1000} \right)^2} \tilde{G}^{-1}(s) = \frac{m s^2 + c s + k}{1 + \frac{s}{2\pi \cdot 1000} + \left( \frac{s}{2\pi \cdot 1000} \right)^2}
\end{equation} \end{equation}
The obtained bode plot of the controller times the complementary high pass filter is shown in Figure ref:fig:detail_control_cf_bode_Kfb. The Bode plot of the controller multiplied by the complementary low-pass filter, $K(s) \cdot H_L(s)$, is presented in Figure ref:fig:detail_control_cf_bode_Kfb.
- two integrators are present at low frequency to be able to follow ramp inputs The frequency response reveals several important characteristics:
- a notch is located at the plant resonance (inverse) - The presence of two integrators at low frequencies, enabling accurate tracking of ramp inputs
- a lead is added near the bandwidth around $\SI{20}{Hz}$ - A notch at the plant resonance frequency (arising from the plant inverse)
- A lead component near the control bandwidth of approximately 20 Hz, enhancing stability margins
#+begin_src matlab #+begin_src matlab
%% Obtained controller %% Obtained controller
@ -4066,10 +4023,12 @@ exportFig('figs/detail_control_cf_bode_Kfb.pdf', 'width', 'half', 'height', 500)
#+end_src #+end_src
**** Robustness and Performance analysis **** Robustness and Performance analysis
The robust stability can be access on the Nyquist plot (Figure ref:fig:detail_control_cf_nyquist_robustness).
Even when considering all the possible plants in the uncertainty set, the nyquist plot stays away from the unstable point, indicating good robustness.
The performance is evaluated by looking at the closed-loop sensitivity and complementary sensitivity transfer functions (Figure ref:fig:detail_control_cf_robust_perf). Robust stability is assessed using the Nyquist plot shown in Figure ref:fig:detail_control_cf_nyquist_robustness.
Even when considering all possible plants within the uncertainty set, the Nyquist plot remains sufficiently distant from the critical point $(-1,0)$, indicating robust stability with adequate margins.
Performance is evaluated by examining the closed-loop sensitivity and complementary sensitivity transfer functions, as illustrated in Figure ref:fig:detail_control_cf_robust_perf.
It is shown that the sensitivity transfer function achieves the desired $+2$ slope at low frequencies and that the complementary sensitivity transfer function nominally provides the wanted noise filtering.
#+begin_src matlab #+begin_src matlab
num_delta_points = 50; num_delta_points = 50;
@ -4195,20 +4154,18 @@ exportFig('figs/detail_control_cf_robust_perf.pdf', 'width', 'half', 'height', '
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
- [ ] Say that the presented control architecture in this section In this section, a control architecture in which complementary filters are used for closed-loop shaping has been presented.
No ambition to overcome fundamental limitations of current architectures. This approach differs from traditional open-loop shaping in that no controller is manually designed; rather, appropriate complementary filters are selected to achieve the desired closed-loop behavior.
Very similar to Internal Model Control [[cite:&saxena12_advan_inter_model_contr_techn]] The method shares conceptual similarities with mixed-sensitivity $\mathcal{H}_{\infty}\text{-synthesis}$, as both approaches aim to shape closed-loop transfer functions, but with notable distinctions in implementation and complexity.
Had no time to proceed to an extensive literature review to find similar control architecture and to compare them.
Whether the propose architecture has advantages compared to already excising architecture in the literature is not clear. While $\mathcal{H}_{\infty}\text{-synthesis}$ synthesis offers greater flexibility and can be readily generalized to MIMO plants, the presented approach provides a simpler alternative that requires minimal design effort.
- [ ] The control architecture was presented for a SISO system, but can be applied to MIMO if decoupling is sufficient. Implementation only necessitates extracting a model of the plant and selecting appropriate analytical complementary filters, making it particularly interesting for applications where simplicity and intuitive parameter tuning are valued.
It will be experimentally demonstrated with the NASS.
- [ ] Discuss how useful it is as the bandwidth can be changed in real time with analytical formulas of second order complementary filters. Due to time constraints, an extensive literature review comparing this approach with similar existing architectures, such as Internal Model Control [[cite:&saxena12_advan_inter_model_contr_techn]], was not conducted.
Maybe make a section about that. Consequently, it remains unclear whether the proposed architecture offers significant advantages over existing methods in the literature.
Maybe give analytical formulas of second order complementary filters in the digital domain?
- [ ] Disadvantages: The control architecture has been presented for SISO systems, but can be applied to MIMO systems when sufficient decoupling is achieved.
- not optimal It will be experimentally validated with the NASS during the experimental phase.
- computationally intensive?
- lead to inverse control which may not be wanted in many cases. Add reference.
* Conclusion * Conclusion
:PROPERTIES: :PROPERTIES:

Binary file not shown.

View File

@ -1,4 +1,4 @@
% Created 2025-04-09 Wed 14:50 % Created 2025-04-11 Fri 14:30
% Intended LaTeX compiler: pdflatex % Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
@ -7,10 +7,10 @@
\bibliography{nass-control.bib} \bibliography{nass-control.bib}
\author{Dehaeze Thomas} \author{Dehaeze Thomas}
\date{\today} \date{\today}
\title{Control Optimization} \title{Control of Parallel Manipulators}
\hypersetup{ \hypersetup{
pdfauthor={Dehaeze Thomas}, pdfauthor={Dehaeze Thomas},
pdftitle={Control Optimization}, pdftitle={Control of Parallel Manipulators},
pdfkeywords={}, pdfkeywords={},
pdfsubject={}, pdfsubject={},
pdfcreator={Emacs 30.1 (Org mode 9.7.26)}, pdfcreator={Emacs 30.1 (Org mode 9.7.26)},
@ -177,7 +177,7 @@ The complementary property of filters \(H_1(s)\) and \(H_2(s)\) requires that th
\begin{equation}\label{eq:detail_control_sensor_comp_filter} \begin{equation}\label{eq:detail_control_sensor_comp_filter}
H_1(s) + H_2(s) = 1 H_1(s) + H_2(s) = 1
\end{equation} \end{equation}
\subsubsection{Sensor Models and Sensor Normalization} \paragraph{Sensor Models and Sensor Normalization}
To analyze sensor fusion architectures, appropriate sensor models are required. To analyze sensor fusion architectures, appropriate sensor models are required.
The model shown in Figure \ref{fig:detail_control_sensor_model} consists of a linear time invariant (LTI) system \(G_i(s)\) representing the sensor dynamics and an input \(n_i\) representing sensor noise. The model shown in Figure \ref{fig:detail_control_sensor_model} consists of a linear time invariant (LTI) system \(G_i(s)\) representing the sensor dynamics and an input \(n_i\) representing sensor noise.
@ -219,7 +219,7 @@ The super sensor output \(\hat{x}\) is therefore described by \eqref{eq:detail_c
\includegraphics[scale=1]{figs/detail_control_sensor_fusion_super_sensor.png} \includegraphics[scale=1]{figs/detail_control_sensor_fusion_super_sensor.png}
\caption{\label{fig:detail_control_sensor_fusion_super_sensor}Sensor fusion architecture with two normalized sensors.} \caption{\label{fig:detail_control_sensor_fusion_super_sensor}Sensor fusion architecture with two normalized sensors.}
\end{figure} \end{figure}
\subsubsection{Noise Sensor Filtering} \paragraph{Noise Sensor Filtering}
First, consider the case where all sensors are perfectly normalized \eqref{eq:detail_control_sensor_perfect_dynamics}. First, consider the case where all sensors are perfectly normalized \eqref{eq:detail_control_sensor_perfect_dynamics}.
The effects of imperfect normalization will be addressed subsequently. The effects of imperfect normalization will be addressed subsequently.
@ -255,7 +255,7 @@ This represents the simplest form of sensor fusion using complementary filters.
However, sensors typically exhibit high noise levels in different frequency regions. However, sensors typically exhibit high noise levels in different frequency regions.
In such cases, to reduce the noise of the super sensor, the norm \(|H_1(j\omega)|\) should be minimized when \(\Phi_{n_1}(\omega)\) exceeds \(\Phi_{n_2}(\omega)\), and the norm \(|H_2(j\omega)|\) should be minimized when \(\Phi_{n_2}(\omega)\) exceeds \(\Phi_{n_1}(\omega)\). In such cases, to reduce the noise of the super sensor, the norm \(|H_1(j\omega)|\) should be minimized when \(\Phi_{n_1}(\omega)\) exceeds \(\Phi_{n_2}(\omega)\), and the norm \(|H_2(j\omega)|\) should be minimized when \(\Phi_{n_2}(\omega)\) exceeds \(\Phi_{n_1}(\omega)\).
Therefore, by appropriately shaping the norm of the complementary filters, the noise of the super sensor can be minimized. Therefore, by appropriately shaping the norm of the complementary filters, the noise of the super sensor can be minimized.
\subsubsection{Sensor Fusion Robustness} \paragraph{Sensor Fusion Robustness}
In practical systems, sensor normalization is rarely perfect, and condition \eqref{eq:detail_control_sensor_perfect_dynamics} is not fully satisfied. In practical systems, sensor normalization is rarely perfect, and condition \eqref{eq:detail_control_sensor_perfect_dynamics} is not fully satisfied.
@ -318,7 +318,7 @@ As established in Section \ref{ssec:detail_control_sensor_fusion_requirements},
A synthesis method enabling precise shaping of these norms would therefore offer substantial practical benefits. A synthesis method enabling precise shaping of these norms would therefore offer substantial practical benefits.
This section develops such an approach by formulating the design objective as a standard \(\mathcal{H}_\infty\) optimization problem. This section develops such an approach by formulating the design objective as a standard \(\mathcal{H}_\infty\) optimization problem.
The methodology for designing appropriate weighting functions (which specify desired complementary filter shapes during synthesis) is examined in detail, and the efficacy of the proposed method is validated with a simple example. The methodology for designing appropriate weighting functions (which specify desired complementary filter shapes during synthesis) is examined in detail, and the efficacy of the proposed method is validated with a simple example.
\subsubsection{Synthesis Objective} \paragraph{Synthesis Objective}
The primary objective is to shape the norms of two filters \(H_1(s)\) and \(H_2(s)\) while ensuring they maintain their complementary property as defined in \eqref{eq:detail_control_sensor_comp_filter}. The primary objective is to shape the norms of two filters \(H_1(s)\) and \(H_2(s)\) while ensuring they maintain their complementary property as defined in \eqref{eq:detail_control_sensor_comp_filter}.
This is equivalent to finding proper and stable transfer functions \(H_1(s)\) and \(H_2(s)\) that satisfy conditions \eqref{eq:detail_control_sensor_hinf_cond_complementarity}, \eqref{eq:detail_control_sensor_hinf_cond_h1}, and \eqref{eq:detail_control_sensor_hinf_cond_h2}. This is equivalent to finding proper and stable transfer functions \(H_1(s)\) and \(H_2(s)\) that satisfy conditions \eqref{eq:detail_control_sensor_hinf_cond_complementarity}, \eqref{eq:detail_control_sensor_hinf_cond_h1}, and \eqref{eq:detail_control_sensor_hinf_cond_h2}.
@ -331,7 +331,7 @@ Weighting transfer functions \(W_1(s)\) and \(W_2(s)\) are strategically selecte
& |H_2(j\omega)| \le \frac{1}{|W_2(j\omega)|} \quad \forall\omega \label{eq:detail_control_sensor_hinf_cond_h2} & |H_2(j\omega)| \le \frac{1}{|W_2(j\omega)|} \quad \forall\omega \label{eq:detail_control_sensor_hinf_cond_h2}
\end{align} \end{align}
\end{subequations} \end{subequations}
\subsubsection{Shaping of Complementary Filters using \(\mathcal{H}_\infty\) synthesis} \paragraph{Shaping of Complementary Filters using \(\mathcal{H}_\infty\) synthesis}
The synthesis objective can be readily expressed as a standard \(\mathcal{H}_\infty\) optimization problem and solved using widely available computational tools. The synthesis objective can be readily expressed as a standard \(\mathcal{H}_\infty\) optimization problem and solved using widely available computational tools.
Consider the generalized plant \(P(s)\) illustrated in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant} and mathematically described by \eqref{eq:detail_control_sensor_generalized_plant}. Consider the generalized plant \(P(s)\) illustrated in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant} and mathematically described by \eqref{eq:detail_control_sensor_generalized_plant}.
@ -376,7 +376,7 @@ Therefore, applying \(\mathcal{H}_\infty\) synthesis to the standard plant \(P(s
It should be noted that there exists only an implication (not an equivalence) between the \(\mathcal{H}_\infty\) norm condition in \eqref{eq:detail_control_sensor_hinf_problem} and the initial synthesis objectives in \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2}. It should be noted that there exists only an implication (not an equivalence) between the \(\mathcal{H}_\infty\) norm condition in \eqref{eq:detail_control_sensor_hinf_problem} and the initial synthesis objectives in \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2}.
Consequently, the optimization may be somewhat conservative with respect to the set of filters on which it operates (see \cite[,Chap. 2.8.3]{skogestad07_multiv_feedb_contr}). Consequently, the optimization may be somewhat conservative with respect to the set of filters on which it operates (see \cite[,Chap. 2.8.3]{skogestad07_multiv_feedb_contr}).
\subsubsection{Weighting Functions Design} \paragraph{Weighting Functions Design}
Weighting functions play a crucial role during synthesis by specifying the maximum allowable norms for the complementary filters. Weighting functions play a crucial role during synthesis by specifying the maximum allowable norms for the complementary filters.
The proper design of these weighting functions is essential for the successful implementation of the proposed \(\mathcal{H}_\infty\) synthesis approach. The proper design of these weighting functions is essential for the successful implementation of the proposed \(\mathcal{H}_\infty\) synthesis approach.
@ -407,7 +407,7 @@ The typical magnitude response of a weighting function generated using \eqref{eq
}\right)^n }\right)^n
\end{equation} \end{equation}
\end{minipage} \end{minipage}
\subsubsection{Validation of the proposed synthesis method} \paragraph{Validation of the proposed synthesis method}
The proposed methodology for designing complementary filters is now applied to a simple example. The proposed methodology for designing complementary filters is now applied to a simple example.
Consider the design of two complementary filters \(H_1(s)\) and \(H_2(s)\) with the following requirements: Consider the design of two complementary filters \(H_1(s)\) and \(H_2(s)\) with the following requirements:
@ -711,7 +711,7 @@ Depending on the symmetry present in the system, certain diagonal elements may e
\end{figure} \end{figure}
\section{Jacobian Decoupling} \section{Jacobian Decoupling}
\label{ssec:detail_control_decoupling_jacobian} \label{ssec:detail_control_decoupling_jacobian}
\subsubsection{Jacobian Matrix} \paragraph{Jacobian Matrix}
The Jacobian matrix serves a dual purpose in the decoupling process: it converts strut velocity \(\dot{\mathcal{L}}\) to payload velocity and angular velocity \(\dot{\bm{\mathcal{X}}}_{\{O\}}\), and it transforms actuator forces \(\bm{\tau}\) to forces/torque applied on the payload \(\bm{\mathcal{F}}_{\{O\}}\), as expressed in equation \eqref{eq:detail_control_decoupling_jacobian}. The Jacobian matrix serves a dual purpose in the decoupling process: it converts strut velocity \(\dot{\mathcal{L}}\) to payload velocity and angular velocity \(\dot{\bm{\mathcal{X}}}_{\{O\}}\), and it transforms actuator forces \(\bm{\tau}\) to forces/torque applied on the payload \(\bm{\mathcal{F}}_{\{O\}}\), as expressed in equation \eqref{eq:detail_control_decoupling_jacobian}.
@ -742,7 +742,7 @@ The transfer function from \(\bm{\mathcal{F}}_{\{O\}\) to \(\bm{\mathcal{X}}_{\{
The frame \(\{O\}\) can be selected according to specific requirements, but the decoupling properties are significantly influenced by this choice. The frame \(\{O\}\) can be selected according to specific requirements, but the decoupling properties are significantly influenced by this choice.
Two natural reference frames are particularly relevant: the center of mass and the center of stiffness. Two natural reference frames are particularly relevant: the center of mass and the center of stiffness.
\subsubsection{Center Of Mass} \paragraph{Center Of Mass}
When the decoupling frame is located at the center of mass (frame \(\{M\}\) in Figure \ref{fig:detail_control_decoupling_model_test}), the Jacobian matrix and its inverse are expressed as in \eqref{eq:detail_control_decoupling_jacobian_CoM_inverse}. When the decoupling frame is located at the center of mass (frame \(\{M\}\) in Figure \ref{fig:detail_control_decoupling_model_test}), the Jacobian matrix and its inverse are expressed as in \eqref{eq:detail_control_decoupling_jacobian_CoM_inverse}.
@ -797,7 +797,7 @@ This phenomenon is illustrated in Figure \ref{fig:detail_control_decoupling_mode
\end{subfigure} \end{subfigure}
\caption{\label{fig:detail_control_jacobian_decoupling_plant_CoM_results}Plant decoupled using the Jacobian matrix expresssed at the center of mass (\subref{fig:detail_control_decoupling_jacobian_plant_CoM}). The physical reason for low frequency coupling is illustrated in (\subref{fig:detail_control_decoupling_model_test_CoM}).} \caption{\label{fig:detail_control_jacobian_decoupling_plant_CoM_results}Plant decoupled using the Jacobian matrix expresssed at the center of mass (\subref{fig:detail_control_decoupling_jacobian_plant_CoM}). The physical reason for low frequency coupling is illustrated in (\subref{fig:detail_control_decoupling_model_test_CoM}).}
\end{figure} \end{figure}
\subsubsection{Center Of Stiffness} \paragraph{Center Of Stiffness}
When the decoupling frame is located at the center of stiffness, the Jacobian matrix and its inverse are expressed as in \eqref{eq:detail_control_decoupling_jacobian_CoK_inverse}. When the decoupling frame is located at the center of stiffness, the Jacobian matrix and its inverse are expressed as in \eqref{eq:detail_control_decoupling_jacobian_CoK_inverse}.
@ -933,7 +933,7 @@ Each of these diagonal elements corresponds to a specific mode, as shown in Figu
\end{figure} \end{figure}
\section{SVD Decoupling} \section{SVD Decoupling}
\label{ssec:detail_control_decoupling_svd} \label{ssec:detail_control_decoupling_svd}
\subsubsection{Singular Value Decomposition} \paragraph{Singular Value Decomposition}
Singular Value Decomposition (SVD) represents a powerful mathematical tool with extensive applications in data analysis \cite[, chapt. 1]{brunton22_data} and multivariable control systems \cite{skogestad07_multiv_feedb_contr}, where it is particularly valuable for analyzing directional properties in multivariable systems. Singular Value Decomposition (SVD) represents a powerful mathematical tool with extensive applications in data analysis \cite[, chapt. 1]{brunton22_data} and multivariable control systems \cite{skogestad07_multiv_feedb_contr}, where it is particularly valuable for analyzing directional properties in multivariable systems.
@ -945,7 +945,7 @@ The SVD constitutes a unique matrix decomposition applicable to any complex matr
where \(\bm{U} \in \mathbb{C}^{n \times n}\) and \(\bm{V} \in \mathbb{C}^{m \times m}\) are unitary matrices with orthonormal columns, and \(\bm{\Sigma} \in \mathbb{R}^{n \times n}\) is a diagonal matrix with real, non-negative entries. where \(\bm{U} \in \mathbb{C}^{n \times n}\) and \(\bm{V} \in \mathbb{C}^{m \times m}\) are unitary matrices with orthonormal columns, and \(\bm{\Sigma} \in \mathbb{R}^{n \times n}\) is a diagonal matrix with real, non-negative entries.
For real matrices \(\bm{X}\), the resulting \(\bm{U}\) and \(\bm{V}\) matrices are also real, making them suitable for decoupling applications. For real matrices \(\bm{X}\), the resulting \(\bm{U}\) and \(\bm{V}\) matrices are also real, making them suitable for decoupling applications.
\subsubsection{Decoupling using the SVD} \paragraph{Decoupling using the SVD}
The procedure for SVD-based decoupling begins with identifying the system dynamics from inputs to outputs, typically represented as a Frequency Response Function (FRF), which yields a complex matrix \(\bm{G}(\omega_i)\) for multiple frequency points \(\omega_i\). The procedure for SVD-based decoupling begins with identifying the system dynamics from inputs to outputs, typically represented as a Frequency Response Function (FRF), which yields a complex matrix \(\bm{G}(\omega_i)\) for multiple frequency points \(\omega_i\).
A specific frequency is then selected for optimal decoupling, with the targeted crossover frequency \(\omega_c\) often serving as an appropriate choice. A specific frequency is then selected for optimal decoupling, with the targeted crossover frequency \(\omega_c\) often serving as an appropriate choice.
@ -971,7 +971,7 @@ Implementation of SVD decoupling requires access to the system's FRF, at least i
This information can be obtained either experimentally or derived from a model. This information can be obtained either experimentally or derived from a model.
While this approach ensures effective decoupling near the chosen frequency, it provides no guarantees regarding decoupling performance away from this frequency. While this approach ensures effective decoupling near the chosen frequency, it provides no guarantees regarding decoupling performance away from this frequency.
Furthermore, the quality of decoupling depends significantly on the accuracy of the real approximation, potentially limiting its effectiveness for plants with high damping. Furthermore, the quality of decoupling depends significantly on the accuracy of the real approximation, potentially limiting its effectiveness for plants with high damping.
\subsubsection{Example} \paragraph{Example}
Plant decoupling using the Singular Value Decomposition was then applied on the test model. Plant decoupling using the Singular Value Decomposition was then applied on the test model.
A decoupling frequency of \(\SI{100}{Hz}\) was used. A decoupling frequency of \(\SI{100}{Hz}\) was used.
@ -1101,120 +1101,73 @@ SVD decoupling can be implemented using measured data without requiring a model,
\chapter{Closed-Loop Shaping using Complementary Filters} \chapter{Closed-Loop Shaping using Complementary Filters}
\label{sec:detail_control_cf} \label{sec:detail_control_cf}
Once the system is properly decoupled using one of the approaches described in Section \ref{sec:detail_control_decoupling}, a diagonal controller can be tuned. Once the system is properly decoupled using one of the approaches described in Section \ref{sec:detail_control_decoupling}, SISO controllers can be individually tuned for each decoupled ``directions''.
This consists in tuning several SISO controllers. Several ways to design a controller to obtain a given performance while ensuring good robustness properties can be implemented.
There are several ways to design a controller to obtain a given performance while ensuring good robustness properties.
Performances of a feedback system (such as response time, disturbance rejection, ) depends on the obtained closed-loop transfer functions. In some cases, ``fixed'' controller structures are utilized, such as PI and PID controllers \cite{furutani04_nanom_cuttin_machin_using_stewar,du14_piezo_actuat_high_precis_flexib,yang19_dynam_model_decoup_contr_flexib}.
For instance sensitivity, transmissibility, etc\ldots{} Gang of Four. In such cases, the controller coefficients are manually tuned to obtain acceptable performance and robustness.
The specifications can usually be expressed in terms of the shape of these closed-loop transfer functions \cite[, chapt. 3]{skogestad07_multiv_feedb_contr}.
In some cases, ``fixed'' controller structures are used, with as PI and PID controllers. Another popular method is Open-Loop shaping, that was used during the conceptual phase after the plan was decoupled in the frame of the struts.
In such case the controller coefficients are manually tuned to obtain acceptable performance and robustness. The idea of open-loop shaping is to tune the controller (using a series of standard leads, lags, notches, low pass filters) such that the open-loop transfer function \(G(s)K(s)\) is made according to specification (i.e.
In many cases, PID+LPF can already lead to performances close to optimal, depending on the plant. bandwidth, gain and phase margins, gain at a specific frequency, etc\ldots{}) \cite[, chapt. 4.4.7]{schmidt20_desig_high_perfor_mechat_third_revis_edition}.
Open-Loop shaping is very popular because the open-loop transfer function depends linearly on the controller, making it relatively straightforward to tune the controller to achieve desired open-loop characteristics.
Another key advantage is that controllers can be tuned directly from measured frequency response functions without requiring an explicit plant model.
However, the behavior (i.e. performance) of a feedback system is a function of closed-loop transfer functions \cite[, chapt. 3]{skogestad07_multiv_feedb_contr}.
Specifications can therefore be expressed in terms of the magnitude of closed-loop transfer functions, such as the sensitivity, plant sensitivity, and complementary sensitivity transfer functions.
With open-loop shaping, closed-loop transfer functions are changed only indirectly, which may make it difficult to directly address the specifications that are in terms of the closed-loop transfer functions.
Decoupled Open-Loop Shaping: In order to synthesize a controller that directly shapes the closed-loop transfer functions (and therefore the performance metric), \(\mathcal{H}_\infty\) loop-shaping may be used \cite{skogestad07_multiv_feedb_contr}.
\begin{itemize} This approach requires a good model of the plant and expertise in selecting weighting functions that will define the wanted shape of different closed-loop transfer functions \cite{bibel92_guidel_h}.
\item Explain procedure when applying open-loop shaping \cite[, chapt. 4.4.7]{schmidt20_desig_high_perfor_mechat_third_revis_edition} \(\mathcal{H}_{\infty}\) synthesis has been applied for the Stewart platform \cite{jiao18_dynam_model_exper_analy_stewar}, but comparative studies with more simple decentralized controllers did not show large improvements \cite{thayer02_six_axis_vibrat_isolat_system,hauge04_sensor_contr_space_based_six}.
\cite{steinbuch16_model_based}
\begin{quote}
The key idea of loop-shaping is the modification of the controller such that the open-
loop is made according to specifications. The reason this works so well, is that the controller
enters linearly into the open-loop transfer l(j!) = g(j!)k(j!), so that it is fast and easy
to reason what is to be changed in the controller. However, in practice all specifications are
of course given in terms of the final system performance, i.e. as closed-loop specifications.
So we should convert the closed loop specs into specs on the open-loop.
\end{quote}
\item The controller is usually manually tuned using a series of Integrators, Leads, Lags, Notches, low pass filters
\item There are lots of tools to check stability, robustness margins and performances
\item Open-Loop shaping is very popular as the open-loop gain depends linearly on the controller.
So the open-loop transfer function can easily be shaped by modifying the controller response.
\item Different techniques for open loop shaping (choice of optimal open-loop gain shape) \cite{lurie02_system_archit_trades_using_bode}
\item But this is open-loop shaping, and it does not directly work on the closed loop transfer functions
\item The huge advantage of this technique, is that one can tune the controllers based on the measured FRF of the system.
No plant model is required.
\item This is what was done during the conceptual phase after the plan was decoupled in the frame of the struts.
\end{itemize}
In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions (i.e., directly addressing the closed-loop performances).
Model based control: In Section \ref{ssec:detail_control_cf_control_arch}, the proposed control architecture including the complementary filters is presented.
\begin{itemize} In Section \ref{ssec:detail_control_cf_trans_perf}, typical performance requirements are translated into the shape of the complementary filters.
\item Review of model based design (LQG, H-Infinity) applied to Stewart platform \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org}{Multivariable Control} The design of the complementary filters is briefly discussed in Section \ref{ssec:detail_control_cf_analytical_complementary_filters}, and analytical formulas are proposed such that it is possible to change the closed-loop behavior of the system in real time.
\(\hinf\) loop-shaping \cite{skogestad07_multiv_feedb_contr}. Finally, in Section \ref{ssec:detail_control_cf_simulations}, a numerical example is used to show how the proposed control architecture can be implemented in practice.
\item Difficulty to specify robustness to change of payload mass
\item Requires high level of expertise.
Far from standard in industry.
Application to Stewart platforms is not demonstrated (or performance increased compared to decoupled control and manual loop shaping).
\end{itemize}
In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions.
In this paper, we propose a new controller synthesis method
\begin{itemize}
\item based on the use of complementary high pass and low pass filters
\item inverse based control
\item direct translation of requirements such as disturbance rejection and robustness to plant uncertainty
\end{itemize}
\section{Control Architecture} \section{Control Architecture}
\label{ssec:detail_control_cf_control_arch} \label{ssec:detail_control_cf_control_arch}
\subsubsection{Virtual Sensor Fusion} \paragraph{Virtual Sensor Fusion}
Let's consider the control architecture represented in Figure \ref{fig:detail_control_cf_arch} where \(G^\prime\) is the physical plant to control, \(G\) is a model of the plant, \(k\) is a gain, \(H_L\) and \(H_H\) are complementary filters (\(H_L(s) + H_H(s) = 1\)). The concept of using complementary filters in control architecture originates from sensor fusion techniques \cite{collette15_sensor_fusion_method_high_perfor}, where two sensors are combined using complementary filters.
The signals are the reference signal \(r\), the output perturbation \(d_y\), the measurement noise \(n\) and the control input \(u\). Building upon this concept, ``virtual sensor fusion'' \cite{verma20_virtual_sensor_fusion_high_precis_contr} replaces one physical sensor with a model \(G\) of the plant.
The control architecture is illustrated in Figure \ref{fig:detail_control_cf_arch}, where \(G^\prime\) represents the physical plant to be controlled, \(G\) is a model of the plant, \(k\) is the controller, and \(H_L\) and \(H_H\) are complementary filters satisfying \(H_L(s) + H_H(s) = 1\).
In this arrangement, the physical plant is controlled at low frequencies, while the plant model is utilized at high frequencies to enhance robustness.
\begin{figure}[htbp] \begin{figure}[htbp]
\centering \begin{subfigure}{0.48\textwidth}
\includegraphics[scale=1]{figs/detail_control_cf_arch.png} \begin{center}
\caption{\label{fig:detail_control_cf_arch}Sensor Fusion Architecture} \includegraphics[scale=1,scale=0.9]{figs/detail_control_cf_arch.png}
\end{center}
\subcaption{\label{fig:detail_control_cf_arch}Virtual Sensor Fusion}
\end{subfigure}
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,scale=0.9]{figs/detail_control_cf_arch_eq.png}
\end{center}
\subcaption{\label{fig:detail_control_cf_arch_eq}Equivalent Architecture}
\end{subfigure}
\caption{\label{fig:detail_control_cf_arch_and_eq}Control architecture for virtual sensor fusion (\subref{fig:detail_control_cf_arch}). An equivalent architecture is shown in (\subref{fig:detail_control_cf_arch_eq}). The signals are the reference signal \(r\), the output perturbation \(d_y\), the measurement noise \(n\) and the control input \(u\).}
\end{figure} \end{figure}
The dynamics of the closed-loop system is described by \eqref{eq:detail_control_cf_sf_cl_tf} with \(L = k(G H_H + G^\prime H_L)\). Although the control architecture shown in Figure \ref{fig:detail_control_cf_arch} appears to be a multi-loop system, it should be noted that no non-linear saturation-type elements are present in the inner loop (containing \(k\), \(G\), and \(H_H\), all numerically implemented).
Consequently, this structure is mathematically equivalent to the single-loop architecture illustrated in Figure \ref{fig:detail_control_cf_arch_eq}.
\paragraph{Asymptotic behavior}
\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf} When considering the extreme case of very high values for \(k\), the effective controller \(K(s)\) converges to the inverse of the plant model multiplied by the inverse of the high-pass filter, as expressed in \eqref{eq:detail_control_cf_high_k}.
\begin{alignat}{5}
y &= \frac{1+kGH_H}{1+L} dy &&+ \frac{kG^{\prime}}{1+L} r &&- \frac{kG^{\prime}H_L}{1+L} n \\
u &= -\frac{kH_L}{1+L} dy &&+ \frac{k}{1+L} r &&- \frac{kH_L}{1+L} n
\end{alignat}
\end{subequations}
The idea of using such architecture comes from sensor fusion \cite{collette14_vibrat,collette15_sensor_fusion_method_high_perfor} where two sensors are used.
One is measuring the quantity that is required to control, the other is collocated with the actuator in such a way that stability is guaranteed.
The first one is low pass filtered in order to obtain good performance at low frequencies and the second one is high pass filtered to benefits from its good dynamical properties.
Here, the second sensor is replaced by a model \(G\) of the plant which is assumed to be stable and minimum phase.
This lead to the idea of virtual sensor fusion presented in \cite{verma20_virtual_sensor_fusion_high_precis_contr}.
One may think that the control architecture shown in Figure \ref{fig:detail_control_cf_arch} is a multi-loop system, but because no non-linear saturation-type element is present in the inner-loop (containing \(k\), \(G\) and \(H_H\) which are all numerically implemented), the structure is equivalent to the architecture shown in Figure \ref{fig:detail_control_cf_arch_eq}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/detail_control_cf_arch_eq.png}
\caption{\label{fig:detail_control_cf_arch_eq}Equivalent feedback architecture}
\end{figure}
The dynamics of the system can be rewritten \eqref{eq:detail_control_cf_sf_cl_tf_K} with \(K = \frac{k}{1 + H_H G k}\).
\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K}
\begin{alignat}{5}
y &= \frac{1}{1+G^{\prime} K H_L} dy &&+ \frac{G^{\prime} K}{1+G^{\prime} K H_L} r &&- \frac{G^{\prime} K H_L}{1+G^{\prime} K H_L} n \\
u &= \frac{-K H_L}{1+G^{\prime} K H_L} dy &&+ \frac{K}{1+G^{\prime} K H_L} r &&- \frac{K H_L}{1+G^{\prime} K H_L} n
\end{alignat}
\end{subequations}
\subsubsection{Asymptotic behavior}
Let's take the extreme case of very high values for \(k\).
In that case \(K(s)\) converges to plant inverse multiply by the inverse of the high pass filter \eqref{eq:detail_control_cf_high_k}.
\begin{equation}\label{eq:detail_control_cf_high_k} \begin{equation}\label{eq:detail_control_cf_high_k}
\lim_{k\to\infty} K(s) = \lim_{k\to\infty} \frac{k}{1+H_H(s) G(s) k} = \left( H_H(s) G(s) \right)^{-1} \lim_{k\to\infty} K(s) = \lim_{k\to\infty} \frac{k}{1+H_H(s) G(s) k} = \left( H_H(s) G(s) \right)^{-1}
\end{equation} \end{equation}
If the obtained \(K\) is improper, a low pass filter can be added to have its causal realization. If the resulting \(K\) is improper, a low-pass filter with sufficiently high corner frequency can be added to ensure its causal realization.
Also, we want \(K\) to be stable, so \(G\) and \(H_H\) must be minimum phase transfer functions. Furthermore, for \(K\) to be stable, both \(G\) and \(H_H\) must be minimum phase transfer functions.
With this assumptions, the resulting control architecture is shown on Figure \ref{fig:detail_control_cf_arch_class}. With these assumptions, the resulting control architecture is illustrated in Figure \ref{fig:detail_control_cf_arch_class}, where the complementary filters \(H_L\) and \(H_H\) remain the only tuning parameters.
The only ``tuning parameters'' are the complementary filters \(H_L\) and \(H_H\). The dynamics of this closed-loop system are described by \eqref{eq:detail_control_cf_sf_cl_tf_K_inf}.
\begin{figure}[htbp] \begin{figure}[htbp]
\centering \centering
@ -1222,42 +1175,40 @@ The only ``tuning parameters'' are the complementary filters \(H_L\) and \(H_H\)
\caption{\label{fig:detail_control_cf_arch_class}Equivalent classical feedback control architecture} \caption{\label{fig:detail_control_cf_arch_class}Equivalent classical feedback control architecture}
\end{figure} \end{figure}
The equations describing the dynamics of the closed-loop system of Figure \ref{fig:detail_control_cf_arch_class} \begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf}
\begin{subequations}
\begin{align} \begin{align}
y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\ y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\
u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u} u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u}
\end{align} \end{align}
\end{subequations} \end{subequations}
At frequencies where the model is accurate: \(G^{-1} G^{\prime} \approx 1\), \(H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1\) and the closed loop transfer functions are described by \eqref{eq:detail_control_cf_sf_cl_tf_K_inf}. At frequencies where the model accurately represents the physical plant (\(G^{-1} G^{\prime} \approx 1\)), the denominator simplifies to \(H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1\), and the closed-loop transfer functions are described by \eqref{eq:detail_control_cf_sf_cl_tf_K_inf_perfect}.
\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf} \begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf_perfect}
\begin{alignat}{5} \begin{alignat}{5}
y &= H_H dy &&+ r &&- H_L n \label{eq:detail_control_cf_cl_performance_y} \\ y &= H_H dy &&+ r &&- H_L n \label{eq:detail_control_cf_cl_performance_y} \\
u &= -G^{-1} H_L dy &&+ G^{-1} r &&- G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u} u &= -G^{-1} H_L dy &&+ G^{-1} r &&- G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u}
\end{alignat} \end{alignat}
\end{subequations} \end{subequations}
The obtained sensitivity transfer function equals to the high pass filter \(S = \frac{y}{dy} = H_H\) and the transmissibility transfer function equals to the low pass filter \(T = \frac{y}{n} = H_L\). The sensitivity transfer function equals the high-pass filter \(S = \frac{y}{dy} = H_H\), and the complementary sensitivity transfer function equals the low-pass filter \(T = \frac{y}{n} = H_L\).
Hence, when the plant model closely approximates the actual system, the closed-loop behavior becomes fully determined by the designed complementary filters, enabling direct translation of performance requirements into filter design.
Assuming that we have a good model of the plant, we have then that the closed-loop behavior of the system converges to the designed complementary filters.
\section{Translating the performance requirements into the shapes of the complementary filters} \section{Translating the performance requirements into the shapes of the complementary filters}
\label{ssec:detail_control_cf_trans_perf} \label{ssec:detail_control_cf_trans_perf}
The required performance specifications in a feedback system can usually be translated into requirements on the upper bounds of \(|S(j\omega)|\) and \(|T(j\omega)|\) \cite{bibel92_guidel_h}. Performance specifications in feedback systems can be expressed as upper bounds on the magnitudes of closed-loop transfer functions such that the sensitivity \(|S(j\omega)|\) and complementary sensitivity \(|T(j\omega)|\) transfer functions \cite{bibel92_guidel_h}.
The process of designing a controller \(K(s)\) in order to obtain the desired shapes of \(|S(j\omega)|\) and \(|T(j\omega)|\) is called closed-loop shaping. The design of a controller \(K(s)\) to achieve desired shapes of these closed-loop transfer functions is known as closed-loop shaping.
The equations \eqref{eq:detail_control_cf_cl_system_y} and \eqref{eq:detail_control_cf_cl_system_u} describing the dynamics of the studied feedback architecture are not written in terms of the controller \(K(s)\) but in terms of the complementary filters \(H_L(s)\) and \(H_H(s)\). In the proposed control architecture, the closed-loop transfer functions \eqref{eq:detail_control_cf_sf_cl_tf_K_inf} are expressed in terms of the complementary filters \(H_L(s)\) and \(H_H(s)\) rather than directly through the controller \(K(s)\).
The typical specifications are then translated into the desired shapes of the complementary filters. Therefore, performance requirements must be translated into constraints on the shapes of these complementary filters.
\subsubsection{Nominal Stability (NS)} \paragraph{Nominal Stability (NS)}
The closed-loop system is stable if all its elements are stable (\(K\), \(G^\prime\) and \(H_L\)) and if the sensitivity function (\(S = \frac{1}{1 + G^\prime K H_L}\)) is stable. A closed-loop system is stable when all its elements (here \(K\), \(G^\prime\), and \(H_L\)) are stable and the sensitivity function \(S = \frac{1}{1 + G^\prime K H_L}\) is stable.
For the nominal system (\(G^\prime = G\)), the sensitivity transfer function is equal to the high pass filter: \(S(s) = H_H(s)\). For the nominal system (\(G^\prime = G\)), the sensitivity transfer function equals the high-pass filter: \(S(s) = H_H(s)\).
Nominal stability is then guaranteed if \(H_L\), \(H_H\) and \(G\) are stable and if \(G\) and \(H_H\) are minimum phase (to have \(K\) stable). Nominal stability is therefore guaranteed when \(H_L\), \(H_H\), and \(G\) are stable, and both \(G\) and \(H_H\) are minimum phase (ensuring \(K\) is stable).
Therefore stable and minimum phase complementary filters need to be used. Consequently, stable and minimum phase complementary filters must be employed.
\subsubsection{Nominal Performance (NP)} \paragraph{Nominal Performance (NP)}
Two performance weights \(w_H\) and \(w_L\) are here defined in such a way that performance specifications are satisfied is \eqref{eq:detail_control_cf_weights} is satisfied.
Performance specifications can be formalized using weighting functions \(w_H\) and \(w_L\), where performance is achieved when \eqref{eq:detail_control_cf_weights} is satisfied.
\begin{subequations}\label{eq:detail_control_cf_weights} \begin{subequations}\label{eq:detail_control_cf_weights}
\begin{align} \begin{align}
@ -1266,62 +1217,31 @@ Two performance weights \(w_H\) and \(w_L\) are here defined in such a way that
\end{align} \end{align}
\end{subequations} \end{subequations}
For the nominal system, we have \(S = H_H\) and \(T = H_L\), and then nominal performance is ensured by requiring \eqref{eq:detail_control_cf_nominal_performance}. For the nominal system, where \(S = H_H\) and \(T = H_L\), nominal performance is ensured by satisfying \eqref{eq:detail_control_cf_nominal_performance}.
\begin{empheq}[box=\fbox,left=\text{NP} \Longleftrightarrow \empheqlbrace]{align} \label{eq:detail_control_cf_nominal_performance} \begin{equation}\label{eq:detail_control_cf_nominal_performance}
&|w_H(j\omega) H_H(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hh}\\ \Aboxed{\text{NP} \Longleftrightarrow {\begin{cases*}
&|w_L(j\omega) H_L(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hl} |w_H(j\omega) H_H(j\omega)| \le 1 & \forall\omega \\
\end{empheq} |w_L(j\omega) H_L(j\omega)| \le 1 & \forall\omega
\end{cases*}}}
The translation of typical performance requirements on the shapes of the complementary filters is discussed below:
\begin{itemize}
\item for disturbance rejections, make \(|S| = |H_H|\) small
\item for noise attenuation, make \(|T| = |H_L|\) small
\item closed-loop bandwidth can be limited by requiring that \(|T|\) is less than \(\frac{1}{\sqrt{2}}\) above the maximum wanted bandwidth
\end{itemize}
Therefore, by properly choosing the shape of the complementary filters, the nominal performance specifications can be addressed.
Classical stability margins (gain and phase margins) can also be linked to the maximum amplitude of the sensitivity transfer function.
\begin{itemize}
\item[{$\square$}] Add reference
\end{itemize}
Typically, having \(|S|_{\infty} \le 2\) guarantees a gain margin of at least \(2\) and a phase margin of at least \(\SI{29}{\degree}\).
\subsubsection{Response time to change of reference signal}
For the nominal system, the model is accurate and the transfer function from reference signal \(r\) to output \(y\) is \(1\) \eqref{eq:detail_control_cf_cl_performance_y} and does not depends of the complementary filters.
However, one can add a pre-filter as shown in Figure \ref{fig:detail_control_cf_arch_class_prefilter}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/detail_control_cf_arch_class_prefilter.png}
\caption{\label{fig:detail_control_cf_arch_class_prefilter}Prefilter used to limit input usage}
\end{figure}
The transfer function from \(y\) to \(r\) becomes \(\frac{y}{r} = K_r\) and \(K_r\) can we chosen to obtain acceptable response to change of the reference signal.
Typically, \(K_r\) is a low pass filter of the form
\begin{equation}
K_r(s) = \frac{1}{1 + \tau s}
\end{equation} \end{equation}
with \(\tau\) corresponding to the desired response time.
\subsubsection{Input usage}
Input usage due to disturbances \(d_y\) and measurement noise \(n\) is determined by \(\big|\frac{u}{d_y}\big| = \big|\frac{u}{n}\big| = \big|G^{-1}H_L\big|\).
Thus it can be limited by setting an upper bound on \(|H_L|\).
Typical performance requirements can therefore be translated into constraints on the complementary filters.
For disturbance rejection, the magnitude of the sensitivity function \(|S(j\omega)| = |H_H(j\omega)|\) should be minimized, particularly at low frequencies where disturbances are usually most prominent.
Similarly, for noise attenuation, the magnitude of the complementary sensitivity function \(|T(j\omega)| = |H_L(j\omega)|\) should be minimized, especially at high frequencies where measurement noise typically dominates.
The closed-loop bandwidth can be effectively limited by ensuring that \(|T(j\omega)|\) remains below \(\frac{1}{\sqrt{2}}\) at frequencies above the maximum desired bandwidth.
By carefully selecting the shapes of these complementary filters, nominal performance specifications can be directly addressed in an intuitive manner.
Input usage due to reference signal \(r\) is determined by \(\big|\frac{u}{r}\big| = \big|G^{-1} K_r\big|\) when using a pre-filter (Figure \ref{fig:detail_control_cf_arch_class_prefilter}) and \(\big|\frac{u}{r}\big| = \big|G^{-1}\big|\) otherwise. Classical stability margins (gain and phase margins) are also related to the maximum amplitude of the sensitivity transfer function.
Typically, maintaining \(|S|_{\infty} \le 2\) ensures a gain margin of at least 2 and a phase margin of at least \(\SI{29}{\degree}\).
\paragraph{Robust Stability (RS)}
Proper choice of \(|K_r|\) is then useful to limit input usage due to change of reference signal. Robust stability refers to a control system's ability to maintain stability despite discrepancies between the actual system \(G^\prime\) and the model \(G\) used for controller design.
\subsubsection{Robust Stability (RS)} These discrepancies may arise from unmodeled dynamics or nonlinearities.
Robustness stability represents the ability of the control system to remain stable even though there are differences between the actual system \(G^\prime\) and the model \(G\) that was used for the design of the controller. To represent these model-plant differences, input multiplicative uncertainty as illustrated in Figure \ref{fig:detail_control_cf_input_uncertainty} is employed.
These differences can have various origins such as unmodelled dynamics or non-linearities. The set of possible plants \(\Pi_i\) is described by \eqref{eq:detail_control_cf_multiplicative_uncertainty}.
With the weighting function \(w_I\) selected such that all possible plants \(G^\prime\) are contained within the set \(\Pi_i\).
To represent the differences between the model and the actual system, the input multiplicative uncertainty as represented in Figure \ref{fig:detail_control_cf_input_uncertainty} is used.
Then, the set of possible plant is described by \eqref{eq:detail_control_cf_multiplicative_uncertainty}.
\(w_I\) should be chosen such that all possible plants \(G^\prime\) are contained in the set \(\Pi_i\).
\begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty} \begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty}
\Pi_i: \quad G^\prime(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad |\Delta_I(j\omega)| \le 1 \ \forall\omega \Pi_i: \quad G^\prime(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad |\Delta_I(j\omega)| \le 1 \ \forall\omega
@ -1343,45 +1263,43 @@ Then, the set of possible plant is described by \eqref{eq:detail_control_cf_mult
\caption{\label{fig:detail_control_cf_input_uncertainty_nyquist}Input multiplicative uncertainty to model the differences between the model and the physical plant (\subref{fig:detail_control_cf_input_uncertainty}). Effect of this uncertainty is displayed on the Nyquist plot (\subref{fig:detail_control_cf_nyquist_uncertainty})} \caption{\label{fig:detail_control_cf_input_uncertainty_nyquist}Input multiplicative uncertainty to model the differences between the model and the physical plant (\subref{fig:detail_control_cf_input_uncertainty}). Effect of this uncertainty is displayed on the Nyquist plot (\subref{fig:detail_control_cf_nyquist_uncertainty})}
\end{figure} \end{figure}
Considering input multiplicative uncertainty, the robust stability property can be derived graphically from the Nyquist plot (Figure \ref{fig:detail_control_cf_nyquist_uncertainty}), and \eqref{eq:detail_control_cf_robust_stability_graphically} is obtained, as proposed in \cite[, chapt. 7.5.1]{skogestad07_multiv_feedb_contr}. When considering input multiplicative uncertainty, robust stability can be derived graphically from the Nyquist plot (illustrated in Figure \ref{fig:detail_control_cf_nyquist_uncertainty}), yielding to \eqref{eq:detail_control_cf_robust_stability_graphically}, as demonstrated in \cite[, chapt. 7.5.1]{skogestad07_multiv_feedb_contr}.
\begin{equation}\label{eq:detail_control_cf_robust_stability_graphically} \begin{equation}\label{eq:detail_control_cf_robust_stability_graphically}
\text{RS} \Longleftrightarrow \left|w_I(j\omega) L(j\omega) \right| \le \left| 1 + L(j\omega) \right| \quad \forall\omega \text{RS} \Longleftrightarrow \left|w_I(j\omega) L(j\omega) \right| \le \left| 1 + L(j\omega) \right| \quad \forall\omega
\end{equation} \end{equation}
After some algebraic manipulations, robust stability is then guaranteed by having the low pass filter \(H_L\) satisfying \eqref{eq:detail_control_cf_condition_robust_stability}. After algebraic manipulation, robust stability is guaranteed when the low-pass complementary filter \(H_L\) satisfies \eqref{eq:detail_control_cf_condition_robust_stability}.
\begin{equation}\label{eq:detail_control_cf_condition_robust_stability} \begin{equation}\label{eq:detail_control_cf_condition_robust_stability}
\boxed{\text{RS} \Longleftrightarrow |w_I(j\omega) H_L(j\omega)| \le 1 \quad \forall \omega} \boxed{\text{RS} \Longleftrightarrow |w_I(j\omega) H_L(j\omega)| \le 1 \quad \forall \omega}
\end{equation} \end{equation}
\subsubsection{Robust Performance (RP)} \paragraph{Robust Performance (RP)}
Robust performance is a property for a controlled system to have its performance guaranteed even though the dynamics of the plant is changing within specified bounds.
For robust performance, we then require to have the performance condition valid for all possible plants in the defined uncertainty set \eqref{eq:detail_control_cf_robust_perf_S}. Robust performance ensures that performance specifications \eqref{eq:detail_control_cf_weights} are met even as plant dynamics varies within specified bounds.
This requires the performance condition to be valid for all possible plants in the defined uncertainty set \(\Pi_i\):
\begin{equation}\label{eq:detail_control_cf_robust_perf_S} \begin{equation}\label{eq:detail_control_cf_robust_perf_S}
\text{RP} \Longleftrightarrow |w_H(j\omega) S(j\omega)| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \text{RP} \Longleftrightarrow |w_H(j\omega) S(j\omega)| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega
\end{equation} \end{equation}
Let's transform condition \eqref{eq:detail_control_cf_robust_perf_S} into a condition on the complementary filters \eqref{eq:detail_control_cf_robust_performance}. Transforming this condition into constraints on the complementary filters yields:
\begin{equation}\label{eq:detail_control_cf_robust_performance} \begin{equation}\label{eq:detail_control_cf_robust_performance}
\boxed{\text{RP} \Longleftrightarrow | w_H(j\omega) H_H(j\omega) | + | w_I(j\omega) H_L(j\omega) | \le 1, \ \forall\omega} \boxed{\text{RP} \Longleftrightarrow | w_H(j\omega) H_H(j\omega) | + | w_I(j\omega) H_L(j\omega) | \le 1, \ \forall\omega}
\end{equation} \end{equation}
Obtained condition for robust performance combines both the NP and RS conditions. The robust performance condition effectively combines both nominal performance \eqref{eq:detail_control_cf_nominal_performance} and robust stability conditions \eqref{eq:detail_control_cf_condition_robust_stability}.
If both NP and RS conditions are fulfilled, the robust performance will be fulfilled with a factor 2 \cite[, chapt. 7.6]{skogestad07_multiv_feedb_contr}. If both NP and RS conditions are satisfied, robust performance will be achieved within a factor of 2 \cite[, chapt. 7.6]{skogestad07_multiv_feedb_contr}.
Therefore, for SISO systems, robust stability and nominal performance are usually sufficient. Therefore, for SISO systems, ensuring robust stability and nominal performance is typically sufficient.
\section{Complementary filter design} \section{Complementary filter design}
\label{ssec:detail_control_cf_analytical_complementary_filters} \label{ssec:detail_control_cf_analytical_complementary_filters}
As was explained in Section \ref{sec:detail_control_sensor}, complementary filters can easily be shaped with the standard \(\mathcal{H}_{\infty}\) synthesis. As proposed in Section \ref{sec:detail_control_sensor}, complementary filters can be shaped using standard \(\mathcal{H}_{\infty}\) synthesis techniques.
As requirements can usually be expressed as upper bounds on the complementary filters' magnitude, this method is very well suited. This approach is particularly well-suited since performance requirements were expressed as upper bounds on the magnitude of the complementary filters (Section \ref{ssec:detail_control_cf_trans_perf}).
However, analytical formulas for complementary filters may also be used. Alternatively, analytical formulas for complementary filters may be employed.
For some applications, first-order complementary filters as shown in Equation \eqref{eq:detail_control_cf_1st_order} are sufficient.
For some applications, first order complementary filters \eqref{eq:detail_control_cf_1st_order} are sufficient.
\begin{subequations}\label{eq:detail_control_cf_1st_order} \begin{subequations}\label{eq:detail_control_cf_1st_order}
\begin{align} \begin{align}
@ -1390,8 +1308,7 @@ For some applications, first order complementary filters \eqref{eq:detail_contro
\end{align} \end{align}
\end{subequations} \end{subequations}
They can be expressed analytically in the digital domain using the Bilinear transformation. These filters can be transformed into the digital domain using the Bilinear transformation, resulting in the digital filter representations shown in Equation \eqref{eq:detail_control_cf_1st_order_z}.
In such case, digital filters \eqref{eq:detail_control_cf_1st_order_z} are obtained.
\begin{subequations}\label{eq:detail_control_cf_1st_order_z} \begin{subequations}\label{eq:detail_control_cf_1st_order_z}
\begin{align} \begin{align}
@ -1400,9 +1317,8 @@ In such case, digital filters \eqref{eq:detail_control_cf_1st_order_z} are obtai
\end{align} \end{align}
\end{subequations} \end{subequations}
The main advantage of having analytical formulas for the complementary filters is that the parameter \(\omega_0\) may be modified in real time. A significant advantage of using analytical formulas for complementary filters is that key parameters such as \(\omega_0\) can be modified in real-time, as illustrated in Figure \ref{fig:detail_control_cf_arch_tunable_params}.
This is illustrated in Figure \ref{fig:detail_control_cf_arch_tunable_params}. This real-time tunability allows rapid testing of different control bandwidths to evaluate performance and robustness characteristics.
Therefore, the performance and robustness of different control bandwidth can be tested very quickly.
\begin{figure}[htbp] \begin{figure}[htbp]
\centering \centering
@ -1410,8 +1326,9 @@ Therefore, the performance and robustness of different control bandwidth can be
\caption{\label{fig:detail_control_cf_arch_tunable_params}Implemented digital complementary filters with parameter \(\omega_0\) that can be changed in real time} \caption{\label{fig:detail_control_cf_arch_tunable_params}Implemented digital complementary filters with parameter \(\omega_0\) that can be changed in real time}
\end{figure} \end{figure}
For many applications, slope of \(+2\) is wanted at low frequency for the sensitivity transfer function (to follow ramp inputs for instance), and a slope of \(-2\) for the complementary sensitivity transfer function. For many practical applications, first order complementary filters are not sufficient.
In that case, complementary filters shown in equation \eqref{eq:detail_control_cf_2nd_order} are proposed. Specifically, a slope of \(+2\) at low frequencies for the sensitivity transfer function (enabling accurate tracking of ramp inputs) and a slope of \(-2\) for the complementary sensitivity transfer function are often desired.
For these cases, the second-order complementary filters presented in Equation \eqref{eq:detail_control_cf_2nd_order} are proposed.
\begin{subequations}\label{eq:detail_control_cf_2nd_order} \begin{subequations}\label{eq:detail_control_cf_2nd_order}
\begin{align} \begin{align}
@ -1420,8 +1337,12 @@ In that case, complementary filters shown in equation \eqref{eq:detail_control_c
\end{align} \end{align}
\end{subequations} \end{subequations}
The effect of \(\alpha\) and \(\omega_0\) and the obtained shape of the complementary filters is shown in Figure \ref{fig:detail_control_cf_analytical_effect}. The influence of parameters \(\alpha\) and \(\omega_0\) on the frequency response of these complementary filters is illustrated in Figure \ref{fig:detail_control_cf_analytical_effect}.
Such filters can also be implemented in the digital domain with analytical formulas, such as \(\alpha\) and \(\omega_0\) can be changed in real time. The parameter \(\alpha\) primarily affects the damping characteristics near the crossover frequency, while \(\omega_0\) determines the frequency at which the transition between high-pass and low-pass behavior occurs.
These filters can also be implemented in the digital domain with analytical formulas, preserving the ability to adjust \(\alpha\) and \(\omega_0\) in real-time.
The presented analytical formulations offer an attractive balance between design simplicity and performance.
This capability to tune parameters in real-time is particularly valuable during commissioning of the controller.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth} \begin{subfigure}{0.48\textwidth}
@ -1440,46 +1361,44 @@ Such filters can also be implemented in the digital domain with analytical formu
\end{figure} \end{figure}
\section{Numerical Example} \section{Numerical Example}
\label{ssec:detail_control_cf_simulations} \label{ssec:detail_control_cf_simulations}
\subsubsection{Procedure} To systematically apply the proposed control technique, the following procedure is recommended:
In order to apply this control technique, we propose the following procedure:
\begin{enumerate} \begin{enumerate}
\item Identify the plant to be controlled in order to obtain the plant model \(G\) \item Identify the plant to be controlled to obtain the plant model \(G\).
\item Design the weighting function \(w_I\) such that all possible plants \(G^\prime\) are contained in the set \(\Pi_i\) \item Design the weighting function \(w_I\) such that all possible plants \(G^\prime\) are contained in the uncertainty set \(\Pi_i\).
\item Translate the performance requirements into upper bounds on the complementary filters (as explained in Section \ref{ssec:detail_control_cf_trans_perf}) \item Translate performance requirements into upper bounds on the complementary filters as explained in Section \ref{ssec:detail_control_cf_trans_perf}.
\item Design the weighting functions \(w_H\) and \(w_L\) and generate the complementary filters using \(\mathcal{H}_{\infty}\text{-synthesis}\) (as was explained in Section \ref{ssec:detail_control_sensor_hinf_method}). \item Design the weighting functions \(w_H\) and \(w_L\) and generate the complementary filters using \(\mathcal{H}_{\infty}\text{-synthesis}\) as described in Section \ref{ssec:detail_control_sensor_hinf_method}.
If the synthesis fails to give filters satisfying the upper bounds previously defined, either the requirements have to be reworked or a better model \(G\) that will permits to have a smaller \(w_I\) should be obtained. If the synthesis fails to produce filters satisfying the defined upper bounds, either revise the requirements or develop a more accurate model \(G\) that will allow for a smaller \(w_I\).
For simple cases, analytical formulas of complementary filters given in Section \ref{ssec:detail_control_cf_analytical_complementary_filters} can be used. For simpler cases, the analytical formulas for complementary filters presented in Section \ref{ssec:detail_control_cf_analytical_complementary_filters} can be employed.
\item If \(K(s) = \left( G(s) H_H(s) \right)^{-1}\) is not proper, low pass filters should be added high a high corner frequency \item If \(K(s) = H_H^{-1}(s) G^{-1}(s)\) is not proper, add low-pass filters with sufficiently high corner frequencies to ensure realizability.
\end{enumerate} \end{enumerate}
\subsubsection{Plant} \paragraph{Plant}
\begin{itemize} To evaluate this control architecture, a simple test model representative of many synchrotron positioning stages is utilized (Figure \ref{fig:detail_control_cf_test_model}).
\item To test this control architecture, a simple test model is used (Figure \ref{fig:detail_control_cf_test_model}). In this model, a payload with mass \(m\) is positioned on top of a stage.
\item This model is quite similar to many positioning stages for Synchrotrons. The objective is to accurately position the sample relative to the X-ray beam.
A payload (i.e. sample) with mass \(m = 5\) is positioned on top of the stage.
The goal is to position the sample with respect to the x-ray.
It is supposed that the relative position \(y\) between the payload an the x-ray is measured (typically the relative position between the focusing optics and the sample is performed).
There are some disturbance forces acting on the positioning stability, such as stage vibration \(d_w\) and direct forces applied on the sample \(d_F\) (for instance cable forces).
The positioning stage itself has a stiffness \(k\), an internal damping \(c\) and the force \(F\) can be controlled.
\end{itemize}
The model of the plant \(G(s)\) from actuator force \(F\) to displacement \(y\) is then The relative position \(y\) between the payload and the X-ray is measured, which typically involves measuring the relative position between the focusing optics and the sample.
Various disturbance forces affect positioning stability, including stage vibrations \(d_w\) and direct forces applied to the sample \(d_F\) (such as cable forces).
The positioning stage itself is characterized by stiffness \(k\), internal damping \(c\), and a controllable force \(F\).
The model of the plant \(G(s)\) from actuator force \(F\) to displacement \(y\) is described by Equation \eqref{eq:detail_control_cf_test_plant_tf}.
\begin{equation}\label{eq:detail_control_cf_test_plant_tf} \begin{equation}\label{eq:detail_control_cf_test_plant_tf}
G(s) = \frac{1}{m s^2 + c s + k} G(s) = \frac{1}{m s^2 + c s + k}
\end{equation} \end{equation}
The values for the parameters of the models are \(m = \SI{20}{\kg}\), \(k = 1\si{\N/\mu\m}\) and \(c = 10^2\si{\N\per(\m\per\s)}\). The parameter values are set to \(m = \SI{20}{\kg}\), \(k = 1\si{\N/\mu\m}\), and \(c = 10^2\si{\N\per(\m\per\s)}\).
The plant dynamics has some uncertainty related to the limited support compliance, unmodeled flexible dynamics, dynamics of the payload, etc. The plant dynamics include uncertainties related to limited support compliance, unmodeled flexible dynamics, payload dynamics, and other factors.
A multiplicative input uncertainty weight \(w_I(s)\) is used to specify the amount of uncertainty as a function of frequency \eqref{eq:detail_control_cf_test_plant_uncertainty}. These uncertainties are represented using a multiplicative input uncertainty weight \eqref{eq:detail_control_cf_test_plant_uncertainty}., which specifies the magnitude of uncertainty as a function of frequency:
\begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty} \begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty}
w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2} w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2}
\end{equation} \end{equation}
The nominal plant dynamics as well as the entire set of possible plants \(\Pi_i\) are shown in Figure \ref{fig:detail_control_cf_bode_plot_mech_sys}. Figure \ref{fig:detail_control_cf_bode_plot_mech_sys} illustrates both the nominal plant dynamics and the complete set of possible plants \(\Pi_i\) encompassed by the uncertainty model.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.3\textwidth} \begin{subfigure}{0.3\textwidth}
\begin{center} \begin{center}
@ -1495,24 +1414,24 @@ The nominal plant dynamics as well as the entire set of possible plants \(\Pi_i\
\end{subfigure} \end{subfigure}
\caption{\label{fig:detail_control_cf_test_model_plant}Schematic of the test system (\subref{fig:detail_control_cf_test_model}). Bode plot of the transfer function \(G(s)\) from \(F\) to \(y\) and the associated uncertainty set (\subref{fig:detail_control_cf_bode_plot_mech_sys}).} \caption{\label{fig:detail_control_cf_test_model_plant}Schematic of the test system (\subref{fig:detail_control_cf_test_model}). Bode plot of the transfer function \(G(s)\) from \(F\) to \(y\) and the associated uncertainty set (\subref{fig:detail_control_cf_bode_plot_mech_sys}).}
\end{figure} \end{figure}
\subsubsection{Requirements and choice of complementary filters} \paragraph{Requirements and choice of complementary filters}
As explained in Section \ref{ssec:detail_control_cf_trans_perf}, nominal performance requirements can be expressed as upper bounds on the complementary filter shapes. As discussed in Section \ref{ssec:detail_control_cf_trans_perf}, nominal performance requirements can be expressed as upper bounds on the shapes of the complementary filters.
For this example, the requirements are:
\begin{itemize} \begin{itemize}
\item Be able to follow ramp inputs (i.e. constant velocity scans) with no steady-state tracking error. \item to track ramp inputs (constant velocity scans) with zero steady-state error, which necessitates a \(+2\) slope at low frequencies for the magnitude of the sensitivity function \(|S(j\omega)|\)
This requires to have a \(+2\) slope at low frequency for \(|S(j\omega)|\) \item filtering of measurement noise above \(\SI{300}{Hz}\), where sensor noise is significant (requiring a filtering factor of approximately 100 above this frequency)
\item Filter the measurement noise above 300Hz as the sensor noise is high (say a filtering factor of 100 is needed above that frequency). \item maximizing disturbance rejection
\item As much disturbance rejection as possible.
\end{itemize} \end{itemize}
The second requirement is to have robust stability meaning that the plant should remain stable while considering the dynamical uncertainties modelled with \(w_I\) Additionally, robust stability must be ensured, requiring the closed-loop system to remain stable despite the dynamic uncertainties modeled by \(w_I\).
\begin{itemize} This condition is satisfied when the magnitude of the low-pass complementary filter \(|H_L(j\omega)|\) remains below the inverse of the uncertainty weight magnitude \(|w_I(j\omega)|\), as expressed in Equation \eqref{eq:detail_control_cf_condition_robust_stability}.
\item The low-pass complementary filter magnitude \(|H_L(j\omega)|\) should be bellow the inverse magnitude of the uncertainty weight magnitude \(|w_I(j\omega)|\) \eqref{eq:detail_control_cf_condition_robust_stability}
\end{itemize}
Robust performance is ensured by simultaneous NP and RS. Robust performance is achieved when both nominal performance and robust stability conditions are simultaneously satisfied.
All the requirements on \(H_L\) and \(H_H\) are represented on Figure \ref{fig:detail_control_cf_specs_S_T}. All requirements imposed on \(H_L\) and \(H_H\) are visualized in Figure \ref{fig:detail_control_cf_specs_S_T}.
While \(\mathcal{H}_\infty\) synthesis could be employed to design the complementary filters, analytical formulas were used for this relatively simple example.
Specifically, the second-order complementary filters from Equation \eqref{eq:detail_control_cf_2nd_order} were selected, providing the desired \(+2\) and \(-2\) slopes, with parameters \(\alpha = 1\) and \(\omega_0 = 2\pi \cdot 20\) Hz.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth} \begin{subfigure}{0.48\textwidth}
@ -1529,31 +1448,29 @@ All the requirements on \(H_L\) and \(H_H\) are represented on Figure \ref{fig:d
\end{subfigure} \end{subfigure}
\caption{\label{fig:detail_control_cf_specs_S_T_obtained_filters}Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}).} \caption{\label{fig:detail_control_cf_specs_S_T_obtained_filters}Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}).}
\end{figure} \end{figure}
\paragraph{Controller analysis}
While the \(\mathcal{H}_\infty\) synthesis of complementary filters could be used, for this simple examples with simple requirements, analytical formulas of complementary filters were used. The controller to be implemented takes the form \(K(s) = \tilde{G}^{-1}(s) H_H^{-1}(s)\), where \(\tilde{G}^{-1}(s)\) represents the plant inverse, which must be both stable and proper.
To ensure properness, low-pass filters with high corner frequencies are added as shown in Equation \eqref{eq:detail_control_cf_test_plant_inverse}.
For this simple example, analytical formulas proposed to have +2 and -2 slopes \eqref{eq:detail_control_cf_2nd_order} were used.
\(\alpha = 1\) and \(\omega_0 = 2\pi \cdot 20\) were used.
\subsubsection{Controller analysis}
The controller to be implemented is \(K(s) = \tilde{G}^{-1}(s) H_H^{-1}(s)\), with \(\tilde{G}^{-1}(s)\) is the plant inverse which needs to be stable and proper.
Therefore, some low pass filters are added at high frequency \eqref{eq:detail_control_cf_test_plant_inverse}.
\begin{equation}\label{eq:detail_control_cf_test_plant_inverse} \begin{equation}\label{eq:detail_control_cf_test_plant_inverse}
\tilde{G}^{-1}(s) = \frac{m s^2 + c s + k}{1 + \frac{s}{2\pi \cdot 1000} + \left( \frac{s}{2\pi \cdot 1000} \right)^2} \tilde{G}^{-1}(s) = \frac{m s^2 + c s + k}{1 + \frac{s}{2\pi \cdot 1000} + \left( \frac{s}{2\pi \cdot 1000} \right)^2}
\end{equation} \end{equation}
The obtained bode plot of the controller times the complementary high pass filter is shown in Figure \ref{fig:detail_control_cf_bode_Kfb}. The Bode plot of the controller multiplied by the complementary low-pass filter, \(K(s) \cdot H_L(s)\), is presented in Figure \ref{fig:detail_control_cf_bode_Kfb}.
The frequency response reveals several important characteristics:
\begin{itemize} \begin{itemize}
\item two integrators are present at low frequency to be able to follow ramp inputs \item The presence of two integrators at low frequencies, enabling accurate tracking of ramp inputs
\item a notch is located at the plant resonance (inverse) \item A notch at the plant resonance frequency (arising from the plant inverse)
\item a lead is added near the bandwidth around \(\SI{20}{Hz}\) \item A lead component near the control bandwidth of approximately 20 Hz, enhancing stability margins
\end{itemize} \end{itemize}
\subsubsection{Robustness and Performance analysis} \paragraph{Robustness and Performance analysis}
The robust stability can be access on the Nyquist plot (Figure \ref{fig:detail_control_cf_nyquist_robustness}).
Even when considering all the possible plants in the uncertainty set, the nyquist plot stays away from the unstable point, indicating good robustness.
The performance is evaluated by looking at the closed-loop sensitivity and complementary sensitivity transfer functions (Figure \ref{fig:detail_control_cf_robust_perf}). Robust stability is assessed using the Nyquist plot shown in Figure \ref{fig:detail_control_cf_nyquist_robustness}.
Even when considering all possible plants within the uncertainty set, the Nyquist plot remains sufficiently distant from the critical point \((-1,0)\), indicating robust stability with adequate margins.
Performance is evaluated by examining the closed-loop sensitivity and complementary sensitivity transfer functions, as illustrated in Figure \ref{fig:detail_control_cf_robust_perf}.
It is shown that the sensitivity transfer function achieves the desired \(+2\) slope at low frequencies and that the complementary sensitivity transfer function nominally provides the wanted noise filtering.
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth} \begin{subfigure}{0.49\textwidth}
@ -1571,24 +1488,18 @@ The performance is evaluated by looking at the closed-loop sensitivity and compl
\caption{\label{fig:detail_control_cf_simulation_results}Validation of Robust stability with the Nyquist plot (\subref{fig:detail_control_cf_nyquist_robustness}) and validation of the nominal and robust performance with the magnitude of the closed-loop transfer functions (\subref{fig:detail_control_cf_robust_perf})} \caption{\label{fig:detail_control_cf_simulation_results}Validation of Robust stability with the Nyquist plot (\subref{fig:detail_control_cf_nyquist_robustness}) and validation of the nominal and robust performance with the magnitude of the closed-loop transfer functions (\subref{fig:detail_control_cf_robust_perf})}
\end{figure} \end{figure}
\section*{Conclusion} \section*{Conclusion}
\begin{itemize} In this section, a control architecture in which complementary filters are used for closed-loop shaping has been presented.
\item[{$\square$}] Say that the presented control architecture in this section This approach differs from traditional open-loop shaping in that no controller is manually designed; rather, appropriate complementary filters are selected to achieve the desired closed-loop behavior.
No ambition to overcome fundamental limitations of current architectures. The method shares conceptual similarities with mixed-sensitivity \(\mathcal{H}_{\infty}\text{-synthesis}\), as both approaches aim to shape closed-loop transfer functions, but with notable distinctions in implementation and complexity.
Very similar to Internal Model Control \cite{saxena12_advan_inter_model_contr_techn}
Had no time to proceed to an extensive literature review to find similar control architecture and to compare them. While \(\mathcal{H}_{\infty}\text{-synthesis}\) synthesis offers greater flexibility and can be readily generalized to MIMO plants, the presented approach provides a simpler alternative that requires minimal design effort.
Whether the propose architecture has advantages compared to already excising architecture in the literature is not clear. Implementation only necessitates extracting a model of the plant and selecting appropriate analytical complementary filters, making it particularly interesting for applications where simplicity and intuitive parameter tuning are valued.
\item[{$\square$}] The control architecture was presented for a SISO system, but can be applied to MIMO if decoupling is sufficient.
It will be experimentally demonstrated with the NASS. Due to time constraints, an extensive literature review comparing this approach with similar existing architectures, such as Internal Model Control \cite{saxena12_advan_inter_model_contr_techn}, was not conducted.
\item[{$\square$}] Discuss how useful it is as the bandwidth can be changed in real time with analytical formulas of second order complementary filters. Consequently, it remains unclear whether the proposed architecture offers significant advantages over existing methods in the literature.
Maybe make a section about that.
Maybe give analytical formulas of second order complementary filters in the digital domain? The control architecture has been presented for SISO systems, but can be applied to MIMO systems when sufficient decoupling is achieved.
\item[{$\square$}] Disadvantages: It will be experimentally validated with the NASS during the experimental phase.
\begin{itemize}
\item not optimal
\item computationally intensive?
\item lead to inverse control which may not be wanted in many cases. Add reference.
\end{itemize}
\end{itemize}
\chapter*{Conclusion} \chapter*{Conclusion}
\label{sec:detail_control_conclusion} \label{sec:detail_control_conclusion}
\printbibliography[heading=bibintoc,title={Bibliography}] \printbibliography[heading=bibintoc,title={Bibliography}]