Determine maximum noise of instrumentation

Include NASS multi-body model for this analysis
This commit is contained in:
Thomas Dehaeze 2025-02-27 17:11:08 +01:00
parent 06ec295a68
commit 880e6810ca
75 changed files with 923180 additions and 184 deletions

3
.gitattributes vendored Normal file
View File

@ -0,0 +1,3 @@
*.pdf binary
*.svg binary
*.mat binary

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="448.087" height="120.049" viewBox="0 0 448.087 120.049">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 7 -3.328125 C 7 -5.203125 5.65625 -6.75 3.96875 -6.75 L 0.34375 -6.75 L 0.34375 -6.453125 L 0.578125 -6.453125 C 1.34375 -6.453125 1.359375 -6.34375 1.359375 -5.984375 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 L 3.96875 0 C 5.625 0 7 -1.46875 7 -3.328125 Z M 6 -3.328125 C 6 -2.21875 5.8125 -1.625 5.453125 -1.140625 C 5.265625 -0.875 4.703125 -0.3125 3.703125 -0.3125 L 2.703125 -0.3125 C 2.234375 -0.3125 2.21875 -0.375 2.21875 -0.703125 L 2.21875 -6.046875 C 2.21875 -6.375 2.234375 -6.453125 2.703125 -6.453125 L 3.6875 -6.453125 C 4.296875 -6.453125 4.984375 -6.234375 5.484375 -5.53125 C 5.921875 -4.9375 6 -4.09375 6 -3.328125 Z M 6 -3.328125 "/>
</g>
<g id="glyph-0-1">
<path d="M 7.09375 0 L 7.09375 -0.3125 L 6.90625 -0.3125 C 6.3125 -0.3125 6.1875 -0.375 6.078125 -0.703125 L 3.9375 -6.890625 C 3.890625 -7.015625 3.875 -7.078125 3.703125 -7.078125 C 3.546875 -7.078125 3.515625 -7.015625 3.46875 -6.890625 L 1.421875 -0.96875 C 1.25 -0.46875 0.84375 -0.3125 0.3125 -0.3125 L 0.3125 0 L 1.328125 -0.03125 L 2.46875 0 L 2.46875 -0.3125 C 1.96875 -0.3125 1.71875 -0.546875 1.71875 -0.8125 C 1.71875 -0.84375 1.734375 -0.9375 1.734375 -0.953125 L 2.203125 -2.25 L 4.640625 -2.25 L 5.15625 -0.734375 C 5.171875 -0.703125 5.1875 -0.640625 5.1875 -0.609375 C 5.1875 -0.3125 4.640625 -0.3125 4.375 -0.3125 L 4.375 0 C 4.734375 -0.03125 5.421875 -0.03125 5.796875 -0.03125 Z M 4.53125 -2.5625 L 2.296875 -2.5625 L 3.40625 -5.78125 Z M 4.53125 -2.5625 "/>
</g>
<g id="glyph-0-2">
<path d="M 6.578125 -2.296875 C 6.578125 -2.40625 6.578125 -2.46875 6.453125 -2.46875 C 6.34375 -2.46875 6.34375 -2.40625 6.328125 -2.3125 C 6.25 -0.90625 5.1875 -0.09375 4.109375 -0.09375 C 3.515625 -0.09375 1.578125 -0.421875 1.578125 -3.375 C 1.578125 -6.328125 3.5 -6.671875 4.109375 -6.671875 C 5.1875 -6.671875 6.0625 -5.765625 6.265625 -4.328125 C 6.28125 -4.1875 6.28125 -4.15625 6.421875 -4.15625 C 6.578125 -4.15625 6.578125 -4.1875 6.578125 -4.390625 L 6.578125 -6.734375 C 6.578125 -6.90625 6.578125 -6.96875 6.46875 -6.96875 C 6.421875 -6.96875 6.390625 -6.96875 6.3125 -6.859375 L 5.8125 -6.125 C 5.453125 -6.484375 4.9375 -6.96875 4 -6.96875 C 2.140625 -6.96875 0.546875 -5.40625 0.546875 -3.375 C 0.546875 -1.328125 2.15625 0.21875 4 0.21875 C 5.609375 0.21875 6.578125 -1.15625 6.578125 -2.296875 Z M 6.578125 -2.296875 "/>
</g>
<g id="glyph-0-3">
<path d="M 8.046875 0 L 8.046875 -0.3125 C 7.53125 -0.3125 7.28125 -0.3125 7.265625 -0.609375 L 7.265625 -2.5 C 7.265625 -3.34375 7.265625 -3.65625 6.96875 -4 C 6.828125 -4.171875 6.5 -4.375 5.921875 -4.375 C 5.09375 -4.375 4.65625 -3.78125 4.484375 -3.40625 C 4.359375 -4.265625 3.625 -4.375 3.171875 -4.375 C 2.453125 -4.375 1.984375 -3.953125 1.71875 -3.328125 L 1.71875 -4.375 L 0.3125 -4.265625 L 0.3125 -3.953125 C 1.015625 -3.953125 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.59375 2.46875 -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.0625 -0.3125 L 3.0625 0 L 4.1875 -0.03125 L 5.296875 0 L 5.296875 -0.3125 C 4.625 -0.3125 4.515625 -0.3125 4.515625 -0.75 L 4.515625 -2.578125 C 4.515625 -3.59375 5.21875 -4.15625 5.859375 -4.15625 C 6.484375 -4.15625 6.59375 -3.625 6.59375 -3.0625 L 6.59375 -0.75 C 6.59375 -0.3125 6.484375 -0.3125 5.8125 -0.3125 L 5.8125 0 L 6.9375 -0.03125 Z M 8.046875 0 "/>
</g>
<g id="glyph-0-4">
<path d="M 5.15625 -2.140625 C 5.15625 -3.390625 4.1875 -4.375 3.078125 -4.375 C 2.3125 -4.375 1.90625 -3.9375 1.703125 -3.71875 L 1.703125 -4.375 L 0.28125 -4.265625 L 0.28125 -3.953125 C 0.984375 -3.953125 1.046875 -3.890625 1.046875 -3.46875 L 1.046875 1.171875 C 1.046875 1.609375 0.9375 1.609375 0.28125 1.609375 L 0.28125 1.921875 L 1.390625 1.890625 L 2.5 1.921875 L 2.5 1.609375 C 1.84375 1.609375 1.734375 1.609375 1.734375 1.171875 L 1.734375 -0.578125 C 1.78125 -0.421875 2.203125 0.109375 2.953125 0.109375 C 4.125 0.109375 5.15625 -0.859375 5.15625 -2.140625 Z M 4.328125 -2.140625 C 4.328125 -0.9375 3.640625 -0.109375 2.90625 -0.109375 C 2.515625 -0.109375 2.140625 -0.3125 1.875 -0.71875 C 1.734375 -0.921875 1.734375 -0.9375 1.734375 -1.125 L 1.734375 -3.328125 C 2.015625 -3.84375 2.5 -4.125 3 -4.125 C 3.734375 -4.125 4.328125 -3.25 4.328125 -2.140625 Z M 4.328125 -2.140625 "/>
</g>
<g id="glyph-0-5">
<path d="M 2.515625 0 L 2.515625 -0.3125 C 1.859375 -0.3125 1.75 -0.3125 1.75 -0.75 L 1.75 -6.859375 L 0.328125 -6.75 L 0.328125 -6.453125 C 1.015625 -6.453125 1.09375 -6.375 1.09375 -5.890625 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.515625 0 "/>
</g>
<g id="glyph-0-6">
<path d="M 2.4375 0 L 2.4375 -0.3125 C 1.796875 -0.3125 1.75 -0.359375 1.75 -0.734375 L 1.75 -4.375 L 0.359375 -4.265625 L 0.359375 -3.953125 C 1.015625 -3.953125 1.09375 -3.890625 1.09375 -3.40625 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 C 1.765625 -0.03125 2.109375 -0.015625 2.4375 0 Z M 1.90625 -5.96875 C 1.90625 -6.234375 1.671875 -6.5 1.375 -6.5 C 1.03125 -6.5 0.84375 -6.21875 0.84375 -5.96875 C 0.84375 -5.703125 1.0625 -5.453125 1.359375 -5.453125 C 1.703125 -5.453125 1.90625 -5.734375 1.90625 -5.96875 Z M 1.90625 -5.96875 "/>
</g>
<g id="glyph-0-7">
<path d="M 5.21875 0 L 5.21875 -0.3125 C 4.546875 -0.3125 4.4375 -0.3125 4.4375 -0.75 L 4.4375 -4.375 L 3.1875 -4.296875 C 3.03125 -4.28125 3.015625 -4.265625 3.015625 -4.265625 C 3 -4.265625 2.984375 -4.265625 2.84375 -4.265625 L 1.671875 -4.265625 L 1.671875 -5.375 C 1.671875 -6.359375 2.515625 -6.75 3.140625 -6.75 C 3.4375 -6.75 3.78125 -6.65625 3.984375 -6.421875 C 3.578125 -6.40625 3.515625 -6.125 3.515625 -5.96875 C 3.515625 -5.640625 3.78125 -5.515625 3.96875 -5.515625 C 4.1875 -5.515625 4.421875 -5.671875 4.421875 -5.96875 C 4.421875 -6.5625 3.875 -6.96875 3.140625 -6.96875 C 2.21875 -6.96875 1.046875 -6.46875 1.046875 -5.390625 L 1.046875 -4.265625 L 0.265625 -4.265625 L 0.265625 -3.953125 L 1.046875 -3.953125 L 1.046875 -0.75 C 1.046875 -0.3125 0.9375 -0.3125 0.28125 -0.3125 L 0.28125 0 L 1.375 -0.03125 L 2.46875 0 L 2.46875 -0.3125 C 1.8125 -0.3125 1.703125 -0.3125 1.703125 -0.75 L 1.703125 -3.953125 L 3.265625 -3.953125 C 3.71875 -3.953125 3.78125 -3.828125 3.78125 -3.421875 L 3.78125 -0.75 C 3.78125 -0.3125 3.671875 -0.3125 3.015625 -0.3125 L 3.015625 0 L 4.109375 -0.03125 Z M 5.21875 0 "/>
</g>
<g id="glyph-0-8">
<path d="M 4.109375 -1.171875 C 4.109375 -1.28125 4.03125 -1.296875 3.96875 -1.296875 C 3.890625 -1.296875 3.875 -1.234375 3.84375 -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.921875 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.46875 3.578125 -4.4375 2.328125 -4.4375 C 1.1875 -4.4375 0.28125 -3.40625 0.28125 -2.171875 C 0.28125 -0.84375 1.3125 0.109375 2.453125 0.109375 C 3.65625 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.328125 -4.21875 C 3.359375 -4.21875 3.453125 -2.875 3.453125 -2.5 Z M 3.453125 -2.5 "/>
</g>
<g id="glyph-0-9">
<path d="M 3.59375 -3.765625 C 3.59375 -4.078125 3.296875 -4.375 2.875 -4.375 C 2.140625 -4.375 1.796875 -3.703125 1.65625 -3.28125 L 1.65625 -4.375 L 0.28125 -4.265625 L 0.28125 -3.953125 C 0.96875 -3.953125 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.65625 0 L 2.65625 -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.109375 -4.15625 2.875 -4.15625 C 2.9375 -4.15625 2.953125 -4.15625 2.984375 -4.140625 C 2.953125 -4.140625 2.75 -4.015625 2.75 -3.765625 C 2.75 -3.484375 2.953125 -3.328125 3.171875 -3.328125 C 3.359375 -3.328125 3.59375 -3.453125 3.59375 -3.765625 Z M 3.59375 -3.765625 "/>
</g>
<g id="glyph-0-10">
<path d="M 7.234375 -0.875 C 7.234375 -0.9375 7.234375 -1.03125 7.109375 -1.03125 C 7 -1.03125 7 -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.328125 -2.84375 4.84375 -3.171875 4.296875 -3.359375 C 5.265625 -3.59375 6.03125 -4.203125 6.03125 -4.96875 C 6.03125 -5.921875 4.90625 -6.75 3.453125 -6.75 L 0.34375 -6.75 L 0.34375 -6.453125 L 0.578125 -6.453125 C 1.34375 -6.453125 1.359375 -6.34375 1.359375 -5.984375 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.921875 -3.28125 4.265625 -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.046875 -0.203125 C 5.453125 0.15625 6 0.21875 6.296875 0.21875 C 7.078125 0.21875 7.234375 -0.59375 7.234375 -0.875 Z M 5.015625 -4.96875 C 5.015625 -4.296875 4.78125 -3.484375 3.3125 -3.484375 L 2.21875 -3.484375 L 2.21875 -6.046875 C 2.21875 -6.28125 2.21875 -6.40625 2.4375 -6.421875 C 2.53125 -6.453125 2.8125 -6.453125 3.015625 -6.453125 C 3.90625 -6.453125 5.015625 -6.40625 5.015625 -4.96875 Z M 5.015625 -4.96875 "/>
</g>
<g id="glyph-0-11">
<path d="M 6.78125 -4.46875 L 6.59375 -6.703125 L 0.546875 -6.703125 L 0.359375 -4.46875 L 0.609375 -4.46875 C 0.734375 -6.0625 0.890625 -6.390625 2.390625 -6.390625 C 2.5625 -6.390625 2.8125 -6.390625 2.921875 -6.375 C 3.125 -6.328125 3.125 -6.21875 3.125 -6 L 3.125 -0.78125 C 3.125 -0.4375 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.03125 -0.03125 5.4375 0 L 5.4375 -0.3125 L 5.046875 -0.3125 C 4 -0.3125 4 -0.4375 4 -0.78125 L 4 -6 C 4 -6.1875 4 -6.328125 4.1875 -6.375 C 4.296875 -6.390625 4.5625 -6.390625 4.75 -6.390625 C 6.234375 -6.390625 6.390625 -6.0625 6.53125 -4.46875 Z M 6.78125 -4.46875 "/>
</g>
<g id="glyph-0-12">
<path d="M 4.65625 -2.109375 C 4.65625 -3.375 3.671875 -4.4375 2.46875 -4.4375 C 1.234375 -4.4375 0.28125 -3.359375 0.28125 -2.109375 C 0.28125 -0.84375 1.3125 0.109375 2.46875 0.109375 C 3.65625 0.109375 4.65625 -0.859375 4.65625 -2.109375 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.46875 -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.109375 1.328125 -3.546875 C 1.609375 -4 2.0625 -4.21875 2.46875 -4.21875 C 2.890625 -4.21875 3.328125 -4 3.578125 -3.578125 C 3.84375 -3.140625 3.84375 -2.578125 3.84375 -2.203125 Z M 3.84375 -2.203125 "/>
</g>
<g id="glyph-0-13">
<path d="M 5.296875 0 L 5.296875 -0.3125 C 4.78125 -0.3125 4.53125 -0.3125 4.515625 -0.609375 L 4.515625 -2.5 C 4.515625 -3.34375 4.515625 -3.65625 4.21875 -4 C 4.078125 -4.171875 3.75 -4.375 3.171875 -4.375 C 2.453125 -4.375 1.984375 -3.953125 1.71875 -3.328125 L 1.71875 -4.375 L 0.3125 -4.265625 L 0.3125 -3.953125 C 1.015625 -3.953125 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.59375 2.46875 -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.0625 -0.3125 L 3.0625 0 L 4.1875 -0.03125 Z M 5.296875 0 "/>
</g>
<g id="glyph-0-14">
<path d="M 3.28125 -1.21875 L 3.28125 -1.796875 L 3.03125 -1.796875 L 3.03125 -1.25 C 3.03125 -0.515625 2.734375 -0.140625 2.375 -0.140625 C 1.71875 -0.140625 1.71875 -1.03125 1.71875 -1.203125 L 1.71875 -3.953125 L 3.125 -3.953125 L 3.125 -4.265625 L 1.71875 -4.265625 L 1.71875 -6.078125 L 1.46875 -6.078125 C 1.453125 -5.265625 1.15625 -4.21875 0.1875 -4.171875 L 0.1875 -3.953125 L 1.03125 -3.953125 L 1.03125 -1.21875 C 1.03125 -0.015625 1.953125 0.109375 2.296875 0.109375 C 3 0.109375 3.28125 -0.59375 3.28125 -1.21875 Z M 3.28125 -1.21875 "/>
</g>
<g id="glyph-0-15">
<path d="M 7.078125 -6.453125 L 7.078125 -6.75 L 5.921875 -6.71875 L 4.765625 -6.75 L 4.765625 -6.453125 C 5.78125 -6.453125 5.78125 -5.984375 5.78125 -5.71875 L 5.78125 -1.5 L 2.296875 -6.625 C 2.203125 -6.75 2.203125 -6.75 2 -6.75 L 0.328125 -6.75 L 0.328125 -6.453125 L 0.609375 -6.453125 C 0.765625 -6.453125 0.953125 -6.4375 1.109375 -6.421875 C 1.328125 -6.40625 1.34375 -6.390625 1.34375 -6.203125 L 1.34375 -1.03125 C 1.34375 -0.765625 1.34375 -0.3125 0.328125 -0.3125 L 0.328125 0 L 1.484375 -0.03125 L 2.640625 0 L 2.640625 -0.3125 C 1.625 -0.3125 1.625 -0.765625 1.625 -1.03125 L 1.625 -6.1875 C 1.671875 -6.125 1.6875 -6.125 1.71875 -6.0625 L 5.75 -0.125 C 5.84375 -0.015625 5.859375 0 5.921875 0 C 6.0625 0 6.0625 -0.0625 6.0625 -0.25 L 6.0625 -5.71875 C 6.0625 -5.984375 6.0625 -6.453125 7.078125 -6.453125 Z M 7.078125 -6.453125 "/>
</g>
<g id="glyph-0-16">
<path d="M 4.9375 -1.84375 C 4.9375 -2.828125 4.28125 -3.640625 3.453125 -3.84375 L 2.1875 -4.140625 C 1.578125 -4.296875 1.1875 -4.828125 1.1875 -5.40625 C 1.1875 -6.09375 1.71875 -6.703125 2.5 -6.703125 C 4.140625 -6.703125 4.359375 -5.078125 4.421875 -4.625 C 4.4375 -4.5625 4.4375 -4.515625 4.546875 -4.515625 C 4.671875 -4.515625 4.671875 -4.5625 4.671875 -4.75 L 4.671875 -6.734375 C 4.671875 -6.90625 4.671875 -6.96875 4.5625 -6.96875 C 4.484375 -6.96875 4.484375 -6.96875 4.40625 -6.84375 L 4.0625 -6.28125 C 3.765625 -6.5625 3.359375 -6.96875 2.484375 -6.96875 C 1.390625 -6.96875 0.546875 -6.109375 0.546875 -5.046875 C 0.546875 -4.234375 1.078125 -3.515625 1.84375 -3.25 C 1.953125 -3.203125 2.46875 -3.078125 3.15625 -2.921875 C 3.421875 -2.84375 3.71875 -2.78125 4 -2.40625 C 4.203125 -2.15625 4.296875 -1.828125 4.296875 -1.5 C 4.296875 -0.796875 3.8125 -0.09375 2.984375 -0.09375 C 2.6875 -0.09375 1.9375 -0.140625 1.421875 -0.625 C 0.84375 -1.15625 0.8125 -1.796875 0.796875 -2.140625 C 0.796875 -2.25 0.71875 -2.25 0.6875 -2.25 C 0.546875 -2.25 0.546875 -2.171875 0.546875 -2 L 0.546875 -0.015625 C 0.546875 0.140625 0.546875 0.21875 0.65625 0.21875 C 0.734375 0.21875 0.734375 0.203125 0.8125 0.09375 C 0.8125 0.09375 0.84375 0.046875 1.171875 -0.46875 C 1.46875 -0.140625 2.109375 0.21875 2.984375 0.21875 C 4.140625 0.21875 4.9375 -0.75 4.9375 -1.84375 Z M 4.9375 -1.84375 "/>
</g>
<g id="glyph-1-0">
<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-1-1">
<path d="M 4.390625 -7.21875 C 4.390625 -7.328125 4.296875 -7.421875 4.1875 -7.421875 C 4.125 -7.421875 4.0625 -7.390625 4.03125 -7.328125 L 0.59375 2.09375 C 0.546875 2.21875 0.546875 2.28125 0.546875 2.28125 C 0.546875 2.390625 0.640625 2.46875 0.734375 2.46875 C 0.875 2.46875 0.90625 2.40625 0.953125 2.234375 L 4.34375 -7.046875 C 4.390625 -7.171875 4.390625 -7.21875 4.390625 -7.21875 Z M 4.390625 -7.21875 "/>
</g>
<g id="glyph-1-2">
<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-0">
<path d="M 3.765625 -0.625 L 3.765625 -1 L 3.53125 -1 L 3.53125 -0.625 C 3.53125 -0.5625 3.53125 -0.234375 3.28125 -0.234375 C 3.015625 -0.234375 3.015625 -0.546875 3.015625 -0.640625 L 3.015625 -1.859375 C 3.015625 -2.21875 3.015625 -2.484375 2.703125 -2.734375 C 2.421875 -2.96875 2.078125 -3.09375 1.671875 -3.09375 C 1.015625 -3.09375 0.546875 -2.84375 0.546875 -2.421875 C 0.546875 -2.1875 0.703125 -2.078125 0.890625 -2.078125 C 1.078125 -2.078125 1.21875 -2.21875 1.21875 -2.40625 C 1.21875 -2.515625 1.15625 -2.671875 0.96875 -2.71875 C 1.21875 -2.890625 1.625 -2.890625 1.65625 -2.890625 C 2.046875 -2.890625 2.46875 -2.640625 2.46875 -2.0625 L 2.46875 -1.84375 C 2.09375 -1.828125 1.640625 -1.8125 1.125 -1.625 C 0.5 -1.390625 0.3125 -1.015625 0.3125 -0.703125 C 0.3125 -0.109375 1.03125 0.0625 1.515625 0.0625 C 2.078125 0.0625 2.40625 -0.25 2.546875 -0.515625 C 2.578125 -0.234375 2.765625 0.03125 3.078125 0.03125 C 3.078125 0.03125 3.765625 0.03125 3.765625 -0.625 Z M 2.46875 -0.96875 C 2.46875 -0.3125 1.890625 -0.125 1.578125 -0.125 C 1.21875 -0.125 0.890625 -0.359375 0.890625 -0.703125 C 0.890625 -1.078125 1.21875 -1.609375 2.46875 -1.65625 Z M 2.46875 -0.96875 "/>
</g>
<g id="glyph-2-1">
<path d="M 6.203125 0 L 6.203125 -0.25 C 5.765625 -0.25 5.6875 -0.25 5.6875 -0.546875 L 5.6875 -2.09375 C 5.6875 -2.703125 5.390625 -3.046875 4.65625 -3.046875 C 4.109375 -3.046875 3.734375 -2.75 3.546875 -2.40625 C 3.40625 -2.90625 3.03125 -3.046875 2.53125 -3.046875 C 1.953125 -3.046875 1.59375 -2.734375 1.390625 -2.375 L 1.390625 -3.046875 L 0.375 -2.96875 L 0.375 -2.734375 C 0.84375 -2.734375 0.890625 -2.671875 0.890625 -2.34375 L 0.890625 -0.546875 C 0.890625 -0.25 0.828125 -0.25 0.375 -0.25 L 0.375 0 C 0.375 0 0.875 -0.03125 1.15625 -0.03125 C 1.421875 -0.03125 1.890625 0 1.953125 0 L 1.953125 -0.25 C 1.515625 -0.25 1.4375 -0.25 1.4375 -0.546875 L 1.4375 -1.796875 C 1.4375 -2.515625 2.015625 -2.859375 2.46875 -2.859375 C 2.953125 -2.859375 3.015625 -2.484375 3.015625 -2.125 L 3.015625 -0.546875 C 3.015625 -0.25 2.953125 -0.25 2.5 -0.25 L 2.5 0 C 2.5 0 3 -0.03125 3.28125 -0.03125 C 3.546875 -0.03125 4.015625 0 4.078125 0 L 4.078125 -0.25 C 3.640625 -0.25 3.5625 -0.25 3.5625 -0.546875 L 3.5625 -1.796875 C 3.5625 -2.515625 4.140625 -2.859375 4.59375 -2.859375 C 5.078125 -2.859375 5.140625 -2.484375 5.140625 -2.125 L 5.140625 -0.546875 C 5.140625 -0.25 5.078125 -0.25 4.625 -0.25 L 4.625 0 C 4.625 0 5.125 -0.03125 5.40625 -0.03125 C 5.671875 -0.03125 6.140625 0 6.203125 0 Z M 6.203125 0 "/>
</g>
<g id="glyph-2-2">
<path d="M 4.046875 -1.5 C 4.046875 -2.34375 3.34375 -3.046875 2.453125 -3.046875 C 2.0625 -3.046875 1.65625 -2.90625 1.375 -2.625 L 1.375 -3.046875 L 0.34375 -2.96875 L 0.34375 -2.734375 C 0.828125 -2.734375 0.859375 -2.6875 0.859375 -2.40625 L 0.859375 0.796875 C 0.859375 1.09375 0.796875 1.09375 0.34375 1.09375 L 0.34375 1.34375 C 0.34375 1.34375 0.84375 1.3125 1.125 1.3125 C 1.390625 1.3125 1.859375 1.328125 1.921875 1.34375 L 1.921875 1.09375 C 1.46875 1.09375 1.40625 1.09375 1.40625 0.796875 L 1.40625 -0.328125 C 1.4375 -0.296875 1.765625 0.0625 2.34375 0.0625 C 3.265625 0.0625 4.046875 -0.609375 4.046875 -1.5 Z M 3.40625 -1.5 C 3.40625 -0.703125 2.890625 -0.125 2.3125 -0.125 C 1.703125 -0.125 1.421875 -0.65625 1.40625 -0.703125 L 1.40625 -2.3125 C 1.609375 -2.65625 2.015625 -2.828125 2.375 -2.828125 C 2.96875 -2.828125 3.40625 -2.21875 3.40625 -1.5 Z M 3.40625 -1.5 "/>
</g>
<g id="glyph-2-3">
<path d="M 1.9375 0 L 1.9375 -0.25 C 1.5 -0.25 1.421875 -0.25 1.421875 -0.546875 L 1.421875 -4.796875 L 0.390625 -4.734375 L 0.390625 -4.484375 C 0.84375 -4.484375 0.90625 -4.4375 0.90625 -4.09375 L 0.90625 -0.546875 C 0.90625 -0.25 0.84375 -0.25 0.390625 -0.25 L 0.390625 0 C 0.390625 0 0.890625 -0.03125 1.15625 -0.03125 C 1.421875 -0.03125 1.6875 -0.015625 1.9375 0 Z M 1.9375 0 "/>
</g>
<g id="glyph-2-4">
<path d="M 2.5 0 L 2.5 -0.25 L 2.328125 -0.25 C 1.765625 -0.25 1.765625 -0.328125 1.765625 -0.5625 L 1.765625 -4.15625 C 1.765625 -4.390625 1.765625 -4.484375 2.328125 -4.484375 L 2.5 -4.484375 L 2.5 -4.734375 L 1.4375 -4.703125 L 0.359375 -4.734375 L 0.359375 -4.484375 L 0.53125 -4.484375 C 1.09375 -4.484375 1.09375 -4.390625 1.09375 -4.15625 L 1.09375 -0.5625 C 1.09375 -0.328125 1.09375 -0.25 0.53125 -0.25 L 0.359375 -0.25 L 0.359375 0 L 1.421875 -0.03125 Z M 2.5 0 "/>
</g>
<g id="glyph-2-5">
<path d="M 4.71875 -3.109375 L 4.515625 -4.703125 L 0.390625 -4.703125 L 0.390625 -4.453125 L 0.546875 -4.453125 C 1.09375 -4.453125 1.09375 -4.375 1.09375 -4.140625 L 1.09375 -0.5625 C 1.09375 -0.328125 1.09375 -0.25 0.546875 -0.25 L 0.390625 -0.25 L 0.390625 0 L 1.4375 -0.03125 L 2.65625 0 L 2.65625 -0.25 L 2.40625 -0.25 C 1.765625 -0.25 1.765625 -0.34375 1.765625 -0.5625 L 1.765625 -2.234375 L 2.421875 -2.234375 C 3.125 -2.234375 3.21875 -2.015625 3.21875 -1.421875 L 3.453125 -1.421875 L 3.453125 -3.28125 L 3.21875 -3.28125 C 3.21875 -2.6875 3.125 -2.484375 2.421875 -2.484375 L 1.765625 -2.484375 L 1.765625 -4.1875 C 1.765625 -4.390625 1.765625 -4.453125 2.09375 -4.453125 L 3.0625 -4.453125 C 4.171875 -4.453125 4.359375 -4.078125 4.484375 -3.109375 Z M 4.71875 -3.109375 "/>
</g>
<g id="glyph-2-6">
<path d="M 5.4375 0 L 5.4375 -0.25 L 5.28125 -0.25 C 4.734375 -0.25 4.734375 -0.3125 4.734375 -0.5625 L 4.734375 -4.171875 C 4.734375 -4.40625 4.734375 -4.484375 5.28125 -4.484375 L 5.4375 -4.484375 L 5.4375 -4.734375 L 4.40625 -4.703125 L 3.359375 -4.734375 L 3.359375 -4.484375 L 3.515625 -4.484375 C 4.0625 -4.484375 4.0625 -4.40625 4.0625 -4.171875 L 4.0625 -2.578125 L 1.765625 -2.578125 L 1.765625 -4.171875 C 1.765625 -4.40625 1.765625 -4.484375 2.3125 -4.484375 L 2.46875 -4.484375 L 2.46875 -4.734375 L 1.4375 -4.703125 L 0.390625 -4.734375 L 0.390625 -4.484375 L 0.546875 -4.484375 C 1.09375 -4.484375 1.09375 -4.40625 1.09375 -4.171875 L 1.09375 -0.5625 C 1.09375 -0.328125 1.09375 -0.25 0.546875 -0.25 L 0.390625 -0.25 L 0.390625 0 L 1.421875 -0.03125 L 2.46875 0 L 2.46875 -0.25 L 2.3125 -0.25 C 1.765625 -0.25 1.765625 -0.3125 1.765625 -0.5625 L 1.765625 -2.328125 L 4.0625 -2.328125 L 4.0625 -0.5625 C 4.0625 -0.328125 4.0625 -0.25 3.515625 -0.25 L 3.359375 -0.25 L 3.359375 0 L 4.390625 -0.03125 Z M 5.4375 0 "/>
</g>
<g id="glyph-2-7">
<path d="M 5.515625 0 L 5.515625 -0.25 L 5.375 -0.25 C 4.921875 -0.25 4.859375 -0.3125 4.796875 -0.515625 L 3.109375 -4.78125 C 3.0625 -4.890625 3.046875 -4.9375 2.921875 -4.9375 C 2.78125 -4.9375 2.765625 -4.890625 2.71875 -4.78125 L 1.125 -0.734375 C 1.046875 -0.546875 0.9375 -0.25 0.3125 -0.25 L 0.3125 0 C 0.546875 -0.015625 0.796875 -0.03125 1.03125 -0.03125 C 1.296875 -0.03125 1.8125 0 1.859375 0 L 1.859375 -0.25 C 1.546875 -0.25 1.359375 -0.390625 1.359375 -0.578125 C 1.359375 -0.640625 1.359375 -0.65625 1.390625 -0.71875 L 1.71875 -1.578125 L 3.6875 -1.578125 L 4.09375 -0.5625 C 4.109375 -0.53125 4.125 -0.484375 4.125 -0.4375 C 4.125 -0.25 3.75 -0.25 3.5625 -0.25 L 3.5625 0 L 4.59375 -0.03125 C 4.921875 -0.03125 5.4375 0 5.515625 0 Z M 3.59375 -1.828125 L 1.828125 -1.828125 L 2.703125 -4.0625 Z M 3.59375 -1.828125 "/>
</g>
<g id="glyph-2-8">
<path d="M 5.15625 -1.625 C 5.15625 -1.703125 5.140625 -1.75 5.03125 -1.75 C 4.984375 -1.75 4.921875 -1.75 4.921875 -1.65625 C 4.859375 -0.546875 3.921875 -0.109375 3.234375 -0.109375 C 2.484375 -0.109375 1.21875 -0.5625 1.21875 -2.359375 C 1.21875 -4.234375 2.5625 -4.609375 3.21875 -4.609375 C 3.90625 -4.609375 4.71875 -4.15625 4.90625 -2.96875 C 4.921875 -2.890625 4.984375 -2.890625 5.03125 -2.890625 C 5.15625 -2.890625 5.15625 -2.921875 5.15625 -3.0625 L 5.15625 -4.6875 C 5.15625 -4.796875 5.15625 -4.859375 5.046875 -4.859375 C 5.03125 -4.859375 4.984375 -4.859375 4.9375 -4.78125 L 4.5625 -4.25 C 4.28125 -4.546875 3.796875 -4.859375 3.140625 -4.859375 C 1.6875 -4.859375 0.484375 -3.75 0.484375 -2.375 C 0.484375 -0.96875 1.703125 0.140625 3.140625 0.140625 C 4.359375 0.140625 5.15625 -0.78125 5.15625 -1.625 Z M 5.15625 -1.625 "/>
</g>
<g id="glyph-2-9">
<path d="M 4.015625 0 L 4.015625 -0.25 C 3.5625 -0.25 3.5 -0.296875 3.5 -0.640625 L 3.5 -4.796875 L 2.46875 -4.734375 L 2.46875 -4.484375 C 2.921875 -4.484375 2.984375 -4.4375 2.984375 -4.09375 L 2.984375 -2.65625 C 2.734375 -2.90625 2.390625 -3.046875 2.015625 -3.046875 C 1.09375 -3.046875 0.3125 -2.359375 0.3125 -1.484375 C 0.3125 -0.625 1.046875 0.0625 1.9375 0.0625 C 2.5 0.0625 2.84375 -0.234375 2.953125 -0.359375 L 2.953125 0.0625 Z M 2.953125 -0.734375 C 2.78125 -0.40625 2.421875 -0.125 1.96875 -0.125 C 1.578125 -0.125 1.3125 -0.359375 1.171875 -0.546875 C 1.03125 -0.765625 0.953125 -1.03125 0.953125 -1.484375 C 0.953125 -1.640625 0.953125 -2.15625 1.234375 -2.484375 C 1.515625 -2.796875 1.84375 -2.859375 2.046875 -2.859375 C 2.375 -2.859375 2.671875 -2.703125 2.875 -2.453125 C 2.953125 -2.34375 2.953125 -2.34375 2.953125 -2.203125 Z M 2.953125 -0.734375 "/>
</g>
<g id="glyph-3-0">
<path d="M 11.5 -4.25 C 11.5 -4.5625 11.21875 -4.5625 10.96875 -4.5625 L 6.4375 -4.5625 L 6.4375 -9.078125 C 6.4375 -9.328125 6.4375 -9.609375 6.140625 -9.609375 C 5.84375 -9.609375 5.84375 -9.34375 5.84375 -9.078125 L 5.84375 -4.5625 L 1.3125 -4.5625 C 1.078125 -4.5625 0.78125 -4.5625 0.78125 -4.265625 C 0.78125 -3.96875 1.0625 -3.96875 1.3125 -3.96875 L 5.84375 -3.96875 L 5.84375 0.5625 C 5.84375 0.796875 5.84375 1.09375 6.125 1.09375 C 6.4375 1.09375 6.4375 0.8125 6.4375 0.5625 L 6.4375 -3.96875 L 10.96875 -3.96875 C 11.203125 -3.96875 11.5 -3.96875 11.5 -4.25 Z M 11.5 -4.25 "/>
</g>
<g id="glyph-4-0">
<path d="M 5.828125 -4.15625 C 6.484375 -4.625 8.296875 -5.890625 8.640625 -6.078125 C 8.875 -6.1875 9.078125 -6.296875 9.578125 -6.3125 C 9.765625 -6.328125 9.921875 -6.328125 9.921875 -6.609375 C 9.921875 -6.703125 9.84375 -6.78125 9.75 -6.78125 C 9.5 -6.78125 9.203125 -6.75 8.953125 -6.75 C 8.546875 -6.75 8.125 -6.78125 7.71875 -6.78125 C 7.640625 -6.78125 7.4375 -6.78125 7.4375 -6.5 C 7.4375 -6.3125 7.609375 -6.3125 7.671875 -6.3125 C 7.75 -6.3125 7.96875 -6.3125 8.125 -6.25 L 3.625 -3.140625 L 4.40625 -6.28125 C 4.625 -6.3125 4.96875 -6.3125 5.078125 -6.3125 C 5.203125 -6.3125 5.40625 -6.3125 5.4375 -6.34375 C 5.53125 -6.421875 5.546875 -6.59375 5.546875 -6.609375 C 5.546875 -6.734375 5.453125 -6.78125 5.328125 -6.78125 C 5.078125 -6.78125 4.828125 -6.765625 4.578125 -6.765625 C 4.328125 -6.765625 4.078125 -6.75 3.84375 -6.75 C 3.578125 -6.75 3.328125 -6.765625 3.078125 -6.765625 C 2.8125 -6.765625 2.546875 -6.78125 2.296875 -6.78125 C 2.203125 -6.78125 2 -6.78125 2 -6.5 C 2 -6.3125 2.140625 -6.3125 2.421875 -6.3125 C 2.625 -6.3125 2.8125 -6.3125 3.03125 -6.296875 L 1.609375 -0.65625 C 1.578125 -0.5 1.5625 -0.5 1.390625 -0.46875 C 1.21875 -0.46875 1.015625 -0.46875 0.859375 -0.46875 C 0.609375 -0.46875 0.578125 -0.46875 0.546875 -0.4375 C 0.421875 -0.375 0.421875 -0.21875 0.421875 -0.171875 C 0.421875 -0.15625 0.4375 0 0.640625 0 C 0.890625 0 1.140625 -0.015625 1.390625 -0.015625 C 1.640625 -0.015625 1.90625 -0.03125 2.140625 -0.03125 C 2.40625 -0.03125 2.65625 -0.015625 2.90625 -0.015625 C 3.171875 -0.015625 3.4375 0 3.671875 0 C 3.78125 0 3.84375 0 3.90625 -0.0625 C 3.953125 -0.125 3.96875 -0.265625 3.96875 -0.28125 C 3.96875 -0.46875 3.828125 -0.46875 3.5625 -0.46875 C 3.359375 -0.46875 3.171875 -0.46875 2.953125 -0.484375 L 3.46875 -2.546875 L 4.703125 -3.375 L 6.171875 -0.53125 C 5.96875 -0.46875 5.671875 -0.46875 5.640625 -0.46875 C 5.515625 -0.46875 5.453125 -0.46875 5.390625 -0.390625 C 5.34375 -0.34375 5.328125 -0.203125 5.328125 -0.171875 C 5.328125 -0.171875 5.328125 0 5.53125 0 C 5.859375 0 6.671875 -0.03125 7 -0.03125 C 7.203125 -0.03125 7.421875 -0.015625 7.640625 -0.015625 C 7.828125 -0.015625 8.046875 0 8.234375 0 C 8.296875 0 8.5 0 8.5 -0.28125 C 8.5 -0.46875 8.328125 -0.46875 8.171875 -0.46875 C 7.71875 -0.46875 7.703125 -0.5 7.625 -0.65625 Z M 5.828125 -4.15625 "/>
</g>
<g id="glyph-4-1">
<path d="M 5.5625 -3.140625 C 5.640625 -3.40625 5.75 -3.890625 5.75 -3.953125 C 5.75 -4.15625 5.59375 -4.390625 5.296875 -4.390625 C 5.140625 -4.390625 4.765625 -4.296875 4.640625 -3.875 C 4.59375 -3.734375 4.15625 -1.9375 4.078125 -1.609375 C 4.015625 -1.390625 3.953125 -1.09375 3.921875 -0.921875 C 3.75 -0.6875 3.359375 -0.28125 2.859375 -0.28125 C 2.28125 -0.28125 2.265625 -0.765625 2.265625 -1 C 2.265625 -1.609375 2.578125 -2.375 2.84375 -3.078125 C 2.953125 -3.34375 2.984375 -3.40625 2.984375 -3.578125 C 2.984375 -4.15625 2.40625 -4.46875 1.859375 -4.46875 C 0.8125 -4.46875 0.3125 -3.125 0.3125 -2.921875 C 0.3125 -2.796875 0.46875 -2.796875 0.546875 -2.796875 C 0.671875 -2.796875 0.734375 -2.796875 0.78125 -2.921875 C 1.109375 -4.015625 1.640625 -4.109375 1.796875 -4.109375 C 1.875 -4.109375 1.96875 -4.109375 1.96875 -3.90625 C 1.96875 -3.671875 1.84375 -3.40625 1.8125 -3.28125 C 1.390625 -2.25 1.203125 -1.6875 1.203125 -1.203125 C 1.203125 -0.078125 2.203125 0.078125 2.78125 0.078125 C 3.0625 0.078125 3.5 0.046875 4.03125 -0.46875 C 4.359375 0.015625 4.921875 0.078125 5.15625 0.078125 C 5.53125 0.078125 5.8125 -0.125 6.015625 -0.484375 C 6.265625 -0.875 6.40625 -1.421875 6.40625 -1.46875 C 6.40625 -1.609375 6.25 -1.609375 6.15625 -1.609375 C 6.046875 -1.609375 6.015625 -1.609375 5.96875 -1.546875 C 5.9375 -1.53125 5.9375 -1.515625 5.890625 -1.265625 C 5.6875 -0.5 5.46875 -0.28125 5.21875 -0.28125 C 5.0625 -0.28125 4.984375 -0.375 4.984375 -0.640625 C 4.984375 -0.8125 5.03125 -0.96875 5.125 -1.359375 C 5.1875 -1.640625 5.296875 -2.03125 5.34375 -2.25 Z M 5.5625 -3.140625 "/>
</g>
<g id="glyph-4-2">
<path d="M 7.5 -5.921875 C 7.65625 -6.140625 7.78125 -6.3125 8.453125 -6.3125 C 8.578125 -6.3125 8.75 -6.3125 8.75 -6.609375 C 8.75 -6.671875 8.703125 -6.78125 8.578125 -6.78125 C 8.28125 -6.78125 7.96875 -6.75 7.671875 -6.75 C 7.3125 -6.75 6.9375 -6.78125 6.59375 -6.78125 C 6.515625 -6.78125 6.3125 -6.78125 6.3125 -6.5 C 6.3125 -6.3125 6.484375 -6.3125 6.578125 -6.3125 C 6.625 -6.3125 6.90625 -6.3125 7.125 -6.21875 L 3.875 -1.46875 L 3 -6.109375 C 2.984375 -6.125 2.984375 -6.21875 2.984375 -6.234375 C 2.984375 -6.3125 3.515625 -6.3125 3.578125 -6.3125 C 3.796875 -6.3125 3.953125 -6.3125 3.953125 -6.609375 C 3.953125 -6.734375 3.859375 -6.78125 3.734375 -6.78125 C 3.484375 -6.78125 3.234375 -6.765625 2.984375 -6.765625 C 2.75 -6.765625 2.5 -6.75 2.265625 -6.75 C 2.03125 -6.75 1.8125 -6.765625 1.578125 -6.765625 C 1.359375 -6.765625 1.140625 -6.78125 0.9375 -6.78125 C 0.84375 -6.78125 0.65625 -6.78125 0.65625 -6.5 C 0.65625 -6.3125 0.8125 -6.3125 1.015625 -6.3125 C 1.140625 -6.3125 1.265625 -6.3125 1.40625 -6.3125 C 1.515625 -6.296875 1.515625 -6.296875 1.546875 -6.125 L 2.6875 -0.109375 C 2.734375 0.171875 2.84375 0.171875 3.03125 0.171875 C 3.296875 0.171875 3.359375 0.09375 3.484375 -0.09375 Z M 7.5 -5.921875 "/>
</g>
<g id="glyph-4-3">
<path d="M 3.546875 -2.109375 C 3.703125 -2.109375 3.9375 -2.109375 3.9375 -2.359375 C 3.9375 -2.578125 3.75 -2.578125 3.5625 -2.578125 L 1.875 -2.578125 C 2.03125 -3.1875 2.390625 -3.921875 3.578125 -3.921875 L 3.984375 -3.921875 C 4.125 -3.921875 4.390625 -3.921875 4.390625 -4.1875 C 4.390625 -4.265625 4.34375 -4.375 4.1875 -4.390625 L 3.78125 -4.390625 C 3.25 -4.390625 2.203125 -4.390625 1.328125 -3.625 C 0.875 -3.203125 0.5 -2.546875 0.5 -1.765625 C 0.5 -0.421875 1.625 0.078125 2.796875 0.078125 C 2.921875 0.078125 3.25 0.078125 3.71875 -0.09375 C 3.765625 -0.09375 4.3125 -0.3125 4.3125 -0.46875 C 4.3125 -0.578125 4.25 -0.765625 4.125 -0.765625 C 4.078125 -0.765625 4.0625 -0.765625 3.96875 -0.6875 C 3.375 -0.34375 3.0625 -0.28125 2.8125 -0.28125 C 2.578125 -0.28125 1.640625 -0.328125 1.640625 -1.359375 C 1.640625 -1.609375 1.6875 -1.859375 1.75 -2.109375 Z M 3.546875 -2.109375 "/>
</g>
<g id="glyph-5-0">
<path d="M 3.953125 -0.984375 C 3.953125 -1.078125 3.859375 -1.078125 3.84375 -1.078125 C 3.75 -1.078125 3.734375 -1.046875 3.6875 -0.859375 C 3.609375 -0.53125 3.46875 -0.125 3.1875 -0.125 C 3 -0.125 2.953125 -0.28125 2.953125 -0.46875 C 2.953125 -0.578125 3.015625 -0.828125 3.0625 -1.015625 L 3.21875 -1.640625 C 3.28125 -1.890625 3.28125 -1.9375 3.34375 -2.15625 C 3.390625 -2.34375 3.46875 -2.671875 3.46875 -2.703125 C 3.46875 -2.859375 3.34375 -2.921875 3.234375 -2.921875 C 3.125 -2.921875 2.96875 -2.84375 2.921875 -2.640625 C 2.78125 -2.875 2.546875 -3.046875 2.203125 -3.046875 C 1.328125 -3.046875 0.421875 -2.078125 0.421875 -1.078125 C 0.421875 -0.40625 0.875 0.0625 1.46875 0.0625 C 1.84375 0.0625 2.171875 -0.140625 2.453125 -0.421875 C 2.578125 0 2.984375 0.0625 3.15625 0.0625 C 3.40625 0.0625 3.578125 -0.078125 3.703125 -0.296875 C 3.859375 -0.5625 3.953125 -0.96875 3.953125 -0.984375 Z M 2.796875 -2.15625 L 2.484375 -0.859375 C 2.421875 -0.671875 2.28125 -0.53125 2.125 -0.40625 C 2.0625 -0.34375 1.78125 -0.125 1.484375 -0.125 C 1.234375 -0.125 0.984375 -0.296875 0.984375 -0.796875 C 0.984375 -1.15625 1.1875 -1.921875 1.34375 -2.203125 C 1.65625 -2.75 2.015625 -2.859375 2.203125 -2.859375 C 2.6875 -2.859375 2.828125 -2.328125 2.828125 -2.25 C 2.828125 -2.234375 2.8125 -2.1875 2.796875 -2.15625 Z M 2.796875 -2.15625 "/>
</g>
<g id="glyph-5-1">
<path d="M 3.109375 -1.078125 C 3.109375 -1.703125 2.421875 -1.828125 2.15625 -1.875 C 2.09375 -1.890625 1.921875 -1.921875 1.875 -1.9375 C 1.625 -1.984375 1.5 -2.125 1.5 -2.28125 C 1.5 -2.4375 1.625 -2.625 1.78125 -2.734375 C 1.96875 -2.84375 2.203125 -2.859375 2.328125 -2.859375 C 2.46875 -2.859375 2.828125 -2.84375 2.984375 -2.609375 C 2.796875 -2.5625 2.6875 -2.421875 2.6875 -2.28125 C 2.6875 -2.125 2.828125 -2.0625 2.921875 -2.0625 C 2.984375 -2.0625 3.25 -2.09375 3.25 -2.453125 C 3.25 -2.90625 2.75 -3.046875 2.328125 -3.046875 C 1.25 -3.046875 1.0625 -2.25 1.0625 -2.046875 C 1.0625 -1.78125 1.203125 -1.625 1.296875 -1.53125 C 1.484375 -1.390625 1.609375 -1.375 2.078125 -1.28125 C 2.234375 -1.265625 2.671875 -1.171875 2.671875 -0.828125 C 2.671875 -0.71875 2.59375 -0.453125 2.3125 -0.28125 C 2.03125 -0.125 1.703125 -0.125 1.609375 -0.125 C 1.328125 -0.125 0.9375 -0.1875 0.78125 -0.421875 C 1.015625 -0.4375 1.15625 -0.609375 1.15625 -0.8125 C 1.15625 -0.984375 1.03125 -1.0625 0.890625 -1.0625 C 0.6875 -1.0625 0.484375 -0.90625 0.484375 -0.609375 C 0.484375 -0.1875 0.9375 0.0625 1.609375 0.0625 C 2.875 0.0625 3.109375 -0.796875 3.109375 -1.078125 Z M 3.109375 -1.078125 "/>
</g>
<g id="glyph-6-0">
<path d="M 7.21875 4.390625 C 7.328125 4.390625 7.421875 4.296875 7.421875 4.1875 C 7.421875 4.125 7.390625 4.0625 7.328125 4.03125 L -2.09375 0.59375 C -2.21875 0.546875 -2.28125 0.546875 -2.28125 0.546875 C -2.390625 0.546875 -2.46875 0.640625 -2.46875 0.734375 C -2.46875 0.875 -2.40625 0.90625 -2.234375 0.953125 L 7.046875 4.34375 C 7.171875 4.390625 7.21875 4.390625 7.21875 4.390625 Z M 7.21875 4.390625 "/>
</g>
<g id="glyph-7-0">
<path d="M 5.109375 -0.96875 C 5.109375 -1.015625 5.09375 -1.03125 5.03125 -1.03125 C 4.921875 -1.03125 4.484375 -0.875 4.390625 -0.609375 C 4.296875 -0.3125 4.203125 -0.3125 4.046875 -0.3125 C 3.671875 -0.3125 3.171875 -0.4375 2.828125 -0.53125 C 2.484375 -0.609375 2.09375 -0.703125 1.734375 -0.703125 C 1.703125 -0.703125 1.578125 -0.703125 1.484375 -0.671875 C 1.84375 -1.234375 1.9375 -1.5625 2.0625 -2 C 2.1875 -2.515625 2.40625 -3.234375 2.734375 -3.8125 C 3.078125 -4.375 3.25 -4.40625 3.484375 -4.40625 C 3.8125 -4.40625 4.03125 -4.171875 4.03125 -3.828125 C 4.03125 -3.703125 4 -3.640625 4 -3.609375 C 4 -3.578125 4.03125 -3.546875 4.078125 -3.546875 C 4.109375 -3.546875 4.28125 -3.578125 4.515625 -3.75 C 4.671875 -3.84375 4.734375 -3.921875 4.734375 -4.1875 C 4.734375 -4.453125 4.59375 -4.859375 4.046875 -4.859375 C 3.4375 -4.859375 2.78125 -4.453125 2.40625 -4.03125 C 1.953125 -3.5 1.640625 -2.796875 1.34375 -1.65625 C 1.1875 -1.03125 0.9375 -0.5 0.609375 -0.234375 C 0.546875 -0.171875 0.359375 0 0.359375 0.09375 C 0.359375 0.140625 0.421875 0.140625 0.4375 0.140625 C 0.6875 0.140625 1 -0.15625 1.09375 -0.25 C 1.28125 -0.25 1.5625 -0.234375 2.1875 -0.078125 C 2.734375 0.0625 3.09375 0.140625 3.484375 0.140625 C 4.359375 0.140625 5.109375 -0.65625 5.109375 -0.96875 Z M 5.109375 -0.96875 "/>
</g>
</g>
<clipPath id="clip-0">
<path clip-rule="nonzero" d="M 385 36 L 445.875 36 L 445.875 82 L 385 82 Z M 385 36 "/>
</clipPath>
<clipPath id="clip-1">
<path clip-rule="nonzero" d="M 74 8 L 445.875 8 L 445.875 60 L 74 60 Z M 74 8 "/>
</clipPath>
<clipPath id="clip-2">
<path clip-rule="nonzero" d="M 1.308594 70 L 363 70 L 363 111 L 1.308594 111 Z M 1.308594 70 "/>
</clipPath>
<clipPath id="clip-3">
<path clip-rule="nonzero" d="M 1.308594 55 L 32 55 L 32 87 L 1.308594 87 Z M 1.308594 55 "/>
</clipPath>
</defs>
<path fill-rule="nonzero" fill="rgb(79.998779%, 88.941956%, 94.822693%)" fill-opacity="1" 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 -209.07192 -12.987453 L -134.619574 -12.987453 L -134.619574 36.625134 L -209.07192 36.625134 Z M -209.07192 -12.987453 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="135.287603" y="94.779182"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="142.561459" y="94.779182"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="149.697923" y="94.779182"/>
</g>
<path fill-rule="nonzero" fill="rgb(97.019958%, 86.431885%, 81.881714%)" fill-opacity="1" 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 -119.914153 -18.657013 L -47.536709 -18.657013 L -47.536709 36.625134 L -119.914153 36.625134 Z M -119.914153 -18.657013 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="213.297626" y="100.403626"/>
<use xlink:href="#glyph-0-3" x="220.71085" y="100.403626"/>
<use xlink:href="#glyph-0-4" x="228.947437" y="100.403626"/>
<use xlink:href="#glyph-0-5" x="234.439153" y="100.403626"/>
<use xlink:href="#glyph-0-6" x="237.185011" y="100.403626"/>
<use xlink:href="#glyph-0-7" x="239.93087" y="100.403626"/>
<use xlink:href="#glyph-0-8" x="245.422586" y="100.403626"/>
<use xlink:href="#glyph-0-9" x="249.816157" y="100.403626"/>
</g>
<path fill-rule="nonzero" fill="rgb(98.50769%, 93.80188%, 82.429504%)" fill-opacity="1" 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 47.538662 -2.408211 L 121.991008 -2.408211 L 121.991008 48.165051 L 47.538662 48.165051 Z M 47.538662 -2.408211 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="389.602977" y="84.285312"/>
<use xlink:href="#glyph-0-0" x="397.016201" y="84.285312"/>
<use xlink:href="#glyph-0-2" x="404.566817" y="84.285312"/>
</g>
<path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" 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 -303.729948 -18.657013 L -223.926955 -18.657013 L -223.926955 54.629924 L -303.729948 54.629924 Z M -303.729948 -18.657013 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-10" x="24.508172" y="100.403626"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-11" x="30.963608" y="100.403626"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="41.39352" y="100.403626"/>
<use xlink:href="#glyph-0-12" x="48.531961" y="100.403626"/>
<use xlink:href="#glyph-0-13" x="53.47411" y="100.403626"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-14" x="58.689066" y="100.403626"/>
<use xlink:href="#glyph-0-9" x="62.53307" y="100.403626"/>
<use xlink:href="#glyph-0-12" x="66.40475" y="100.403626"/>
<use xlink:href="#glyph-0-5" x="71.346899" y="100.403626"/>
<use xlink:href="#glyph-0-5" x="74.092757" y="100.403626"/>
<use xlink:href="#glyph-0-8" x="76.838616" y="100.403626"/>
<use xlink:href="#glyph-0-9" x="81.232187" y="100.403626"/>
</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 -28.346823 -28.346448 L 28.348776 -28.346448 L 28.348776 28.345214 L -28.346823 28.345214 Z M -28.346823 -28.346448 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-15" x="303.652853" y="74.206156"/>
<use xlink:href="#glyph-0-1" x="311.066078" y="74.206156"/>
<use xlink:href="#glyph-0-16" x="318.479302" y="74.206156"/>
<use xlink:href="#glyph-0-16" x="323.971018" y="74.206156"/>
</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 -84.164428 -14.172548 L -52.021173 -14.172548 L -52.021173 14.175251 L -84.164428 14.175251 Z M -84.164428 -14.172548 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="236.349019" y="72.765568"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="244.120455" y="74.247826"/>
<use xlink:href="#glyph-2-1" x="248.060128" y="74.247826"/>
<use xlink:href="#glyph-2-2" x="254.553599" y="74.247826"/>
<use xlink:href="#glyph-2-3" x="258.919481" y="74.247826"/>
</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 -96.003572 0.00135158 C -96.003572 5.501612 -100.460476 9.962453 -105.964673 9.962453 C -111.464934 9.962453 -115.925775 5.501612 -115.925775 0.00135158 C -115.925775 -5.502846 -111.464934 -9.963687 -105.964673 -9.963687 C -100.460476 -9.963687 -96.003572 -5.502846 -96.003572 0.00135158 Z M -96.003572 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="205.279147" y="74.93538"/>
</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 -138.604015 0.00135158 C -138.604015 5.501612 -143.064856 9.962453 -148.569054 9.962453 C -154.069314 9.962453 -158.530156 5.501612 -158.530156 0.00135158 C -158.530156 -5.502846 -154.069314 -9.963687 -148.569054 -9.963687 C -143.064856 -9.963687 -138.604015 -5.502846 -138.604015 0.00135158 Z M -138.604015 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="163.011977" y="74.93538"/>
</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 -191.834883 8.505691 L -179.078373 8.505691 L -170.574033 0.00135158 L -179.078373 -8.502988 L -204.591393 -8.502988 L -204.591393 8.505691 Z M -191.834883 8.505691 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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 -233.435279 0.00135158 C -233.435279 5.501612 -237.89612 9.962453 -243.396381 9.962453 C -248.900579 9.962453 -253.36142 5.501612 -253.36142 0.00135158 C -253.36142 -5.502846 -248.900579 -9.963687 -243.396381 -9.963687 C -237.89612 -9.963687 -233.435279 -5.502846 -233.435279 0.00135158 Z M -233.435279 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="68.928286" y="74.93538"/>
</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 -258.38528 21.79766 L -228.411419 21.79766 L -228.411419 50.145459 L -258.38528 50.145459 Z M -258.38528 21.79766 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="63.501278" y="37.761859"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-4" x="73.101229" y="39.245109"/>
<use xlink:href="#glyph-2-5" x="75.956696" y="39.245109"/>
<use xlink:href="#glyph-2-5" x="81.056683" y="39.245109"/>
</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 -299.245483 -14.172548 L -265.196626 -14.172548 L -265.196626 14.175251 L -299.245483 14.175251 Z M -299.245483 -14.172548 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="22.961425" y="73.452129"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-6" x="32.560384" y="74.934387"/>
<use xlink:href="#glyph-2-7" x="38.395168" y="74.934387"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-8" x="44.015463" y="74.934387"/>
</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 71.449243 11.537331 C 71.449243 17.041529 66.988402 21.50237 61.484204 21.50237 C 55.983944 21.50237 51.523102 17.041529 51.523102 11.537331 C 51.523102 6.037071 55.983944 1.576229 61.484204 1.576229 C 66.988402 1.576229 71.449243 6.037071 71.449243 11.537331 Z M 71.449243 11.537331 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="371.411089" y="63.489055"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" d="M 420.484375 50.917969 L 433.140625 50.917969 L 433.140625 67.792969 L 407.832031 67.792969 L 399.390625 59.355469 L 407.832031 50.917969 Z M 420.484375 50.917969 "/>
<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-miterlimit="10" d="M 104.750034 20.041671 L 117.506543 20.041671 L 117.506543 3.032991 L 91.997461 3.032991 L 83.489184 11.537331 L 91.997461 20.041671 Z M 104.750034 20.041671 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
</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 -233.435279 0.00135158 L -209.721557 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.054831 0.00135158 L 1.609738 1.682534 L 3.086186 0.00135158 L 1.609738 -1.683768 Z M 6.054831 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 105.668539, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-1" x="95.656551" y="67.013138"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="89.520162" y="73.273544"/>
</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 -169.869276 0.00135158 L -163.164234 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.054864 0.00135158 L 1.609772 1.682534 L 3.08622 0.00135158 L 1.609772 -1.683768 Z M 6.054864 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 151.859911, 70.802122)"/>
<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 -138.604015 0.00135158 L -120.559853 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.052248 0.00135158 L 1.607155 1.682534 L 3.08754 0.00135158 L 1.607155 -1.683768 Z M 6.052248 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 194.128133, 70.802122)"/>
<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 -96.003572 0.00135158 L -89.298529 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.053408 0.00135158 L 1.608316 1.682534 L 3.088701 0.00135158 L 1.608316 -1.683768 Z M 6.053408 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 225.146512, 70.802122)"/>
<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 -51.521149 0.00135158 L -33.476987 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.052763 0.00135158 L 1.607671 1.682534 L 3.088056 0.00135158 L 1.607671 -1.683768 Z M 6.052763 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 280.526058, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-2" x="272.67029" y="65.53088"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-0" x="279.369223" y="67.013138"/>
</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 28.844863 11.537331 L 46.889025 11.537331 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.055342 -0.000478841 L 1.61025 1.68464 L 3.086698 -0.000478841 L 1.61025 -1.681661 Z M 6.055342 -0.000478841 " transform="matrix(0.99214, 0, 0, -0.99214, 360.261781, 59.354994)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-2" x="348.96391" y="54.083563"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-1" x="355.662842" y="55.566813"/>
</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 71.449243 11.537331 L 78.154285 11.537331 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.052586 -0.000478841 L 1.607494 1.68464 L 3.087879 -0.000478841 L 1.607494 -1.681661 Z M 6.052586 -0.000478841 " transform="matrix(0.99214, 0, 0, -0.99214, 391.280141, 59.354994)"/>
<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 118.006567 11.537331 L 129.345687 11.537331 L 129.345687 62.563371 L -243.396381 62.563371 L -243.396381 55.279561 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
</g>
<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.053587 0.00081907 L 1.608494 1.682001 L 3.08888 0.00081907 L 1.608494 -1.6843 Z M 6.053587 0.00081907 " transform="matrix(0, 0.99214, 0.99214, 0, 75.073406, 13.142429)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="257.508399" y="11.20325"/>
</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 -243.396381 21.301573 L -243.396381 14.596531 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.054997 0.00081907 L 1.609904 1.682001 L 3.086352 0.00081907 L 1.609904 -1.6843 Z M 6.054997 0.00081907 " transform="matrix(0, 0.99214, 0.99214, 0, 75.073406, 53.504311)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-6-0" x="72.605159" y="52.82156"/>
</g>
<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 28.844863 -11.538565 L 45.853543 -11.538565 L 45.853543 -39.886365 L -316.754187 -39.886365 L -316.754187 0.00135158 L -304.379585 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 17.761719 70.800781 L 13.351562 69.132812 L 14.820312 70.800781 L 13.351562 72.472656 Z M 17.761719 70.800781 "/>
<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.053603 0.00135158 L 1.60851 1.682534 L 3.088896 0.00135158 L 1.60851 -1.683768 Z M 6.053603 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 11.755694, 70.802122)"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-3" x="348.96391" y="76.978197"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-7-0" x="353.741066" y="78.460455"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="179.702757" y="112.844076"/>
</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 -264.696603 0.00135158 L -257.995498 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.05324 0.00135158 L 1.608148 1.682534 L 3.088533 0.00135158 L 1.608148 -1.683768 Z M 6.05324 0.00135158 " transform="matrix(0.99214, 0, 0, -0.99214, 57.775585, 70.802122)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="57.096019" y="73.273544"/>
</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 -148.569054 14.596531 L -148.569054 32.640693 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.054997 -0.00148391 L 1.609904 1.683635 L 3.086352 -0.00148391 L 1.609904 -1.682666 Z M 6.054997 -0.00148391 " transform="matrix(0, 0.99214, 0.99214, 0, 169.157722, 53.504311)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="150.638001" y="46.462932"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="156.571001" y="47.946182"/>
<use xlink:href="#glyph-2-9" x="160.510674" y="47.946182"/>
</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 -105.964673 14.596531 L -105.964673 32.640693 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.054997 -0.000163356 L 1.609904 1.684956 L 3.086352 -0.000163356 L 1.609904 -1.681345 Z M 6.054997 -0.000163356 " transform="matrix(0, 0.99214, 0.99214, 0, 211.425943, 53.504311)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="215.215434" y="46.462932"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="221.148434" y="47.946182"/>
<use xlink:href="#glyph-2-1" x="225.088107" y="47.946182"/>
<use xlink:href="#glyph-2-2" x="231.581578" y="47.946182"/>
<use xlink:href="#glyph-2-3" x="235.94746" y="47.946182"/>
</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 61.484204 26.132511 L 61.484204 44.176673 " transform="matrix(0.99214, 0, 0, -0.99214, 316.557625, 70.802122)"/>
<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.0529 -0.00100571 L 1.607807 1.684113 L 3.088192 -0.00100571 L 1.607807 -1.682188 Z M 6.0529 -0.00100571 " transform="matrix(0, 0.99214, 0.99214, 0, 377.559592, 42.057173)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="381.347376" y="35.016607"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-9" x="387.280376" y="36.498865"/>
<use xlink:href="#glyph-2-0" x="391.646258" y="36.498865"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 60 KiB

1803
matlab/STEPS/APA300ML.STEP Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

12306
matlab/STEPS/Tilt_Guide.STEP Normal file

File diff suppressed because it is too large Load Diff

39764
matlab/STEPS/Tilt_Motor.STEP Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

79980
matlab/STEPS/Tilt_Stage.STEP Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

36208
matlab/STEPS/Ty_Guide.STEP Normal file

File diff suppressed because it is too large Load Diff

10326
matlab/STEPS/Ty_Guide_11.STEP Normal file

File diff suppressed because it is too large Load Diff

17057
matlab/STEPS/Ty_Guide_12.STEP Normal file

File diff suppressed because it is too large Load Diff

10326
matlab/STEPS/Ty_Guide_21.STEP Normal file

File diff suppressed because it is too large Load Diff

17057
matlab/STEPS/Ty_Guide_22.STEP Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

77974
matlab/STEPS/Ty_Stage.STEP Normal file

File diff suppressed because it is too large Load Diff

23602
matlab/STEPS/granite.STEP Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,37 @@
function [stewart] = computeJacobian(stewart)
% computeJacobian -
%
% Syntax: [stewart] = computeJacobian(stewart)
%
% Inputs:
% - stewart - With at least the following fields:
% - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
% - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
% - actuators.K [6x1] - Total stiffness of the actuators
%
% Outputs:
% - stewart - With the 3 added field:
% - geometry.J [6x6] - The Jacobian Matrix
% - geometry.K [6x6] - The Stiffness Matrix
% - geometry.C [6x6] - The Compliance Matrix
assert(isfield(stewart.geometry, 'As'), 'stewart.geometry should have attribute As')
As = stewart.geometry.As;
assert(isfield(stewart.geometry, 'Ab'), 'stewart.geometry should have attribute Ab')
Ab = stewart.geometry.Ab;
assert(isfield(stewart.actuators, 'k'), 'stewart.actuators should have attribute k')
Ki = stewart.actuators.k;
J = [As' , cross(Ab, As)'];
K = J'*diag(Ki)*J;
C = inv(K);
stewart.geometry.J = J;
stewart.geometry.K = K;
stewart.geometry.C = C;
end

View File

@ -0,0 +1,80 @@
function [stewart] = computeJointsPose(stewart)
% computeJointsPose -
%
% Syntax: [stewart] = computeJointsPose(stewart)
%
% Inputs:
% - stewart - A structure with the following fields
% - platform_F.Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
% - platform_M.Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
% - platform_F.FO_A [3x1] - Position of {A} with respect to {F}
% - platform_M.MO_B [3x1] - Position of {B} with respect to {M}
% - geometry.FO_M [3x1] - Position of {M} with respect to {F}
%
% Outputs:
% - stewart - A structure with the following added fields
% - geometry.Aa [3x6] - The i'th column is the position of ai with respect to {A}
% - geometry.Ab [3x6] - The i'th column is the position of bi with respect to {A}
% - geometry.Ba [3x6] - The i'th column is the position of ai with respect to {B}
% - geometry.Bb [3x6] - The i'th column is the position of bi with respect to {B}
% - geometry.l [6x1] - The i'th element is the initial length of strut i
% - geometry.As [3x6] - The i'th column is the unit vector of strut i expressed in {A}
% - geometry.Bs [3x6] - The i'th column is the unit vector of strut i expressed in {B}
% - struts_F.l [6x1] - Length of the Fixed part of the i'th strut
% - struts_M.l [6x1] - Length of the Mobile part of the i'th strut
% - platform_F.FRa [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the bottom of the i'th strut from {F}
% - platform_M.MRb [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the top of the i'th strut from {M}
assert(isfield(stewart.platform_F, 'Fa'), 'stewart.platform_F should have attribute Fa')
Fa = stewart.platform_F.Fa;
assert(isfield(stewart.platform_M, 'Mb'), 'stewart.platform_M should have attribute Mb')
Mb = stewart.platform_M.Mb;
assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
FO_A = stewart.platform_F.FO_A;
assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
MO_B = stewart.platform_M.MO_B;
assert(isfield(stewart.geometry, 'FO_M'), 'stewart.geometry should have attribute FO_M')
FO_M = stewart.geometry.FO_M;
Aa = Fa - repmat(FO_A, [1, 6]);
Bb = Mb - repmat(MO_B, [1, 6]);
Ab = Bb - repmat(-MO_B-FO_M+FO_A, [1, 6]);
Ba = Aa - repmat( MO_B+FO_M-FO_A, [1, 6]);
As = (Ab - Aa)./vecnorm(Ab - Aa); % As_i is the i'th vector of As
l = vecnorm(Ab - Aa)';
Bs = (Bb - Ba)./vecnorm(Bb - Ba);
FRa = zeros(3,3,6);
MRb = zeros(3,3,6);
for i = 1:6
FRa(:,:,i) = [cross([0;1;0], As(:,i)) , cross(As(:,i), cross([0;1;0], As(:,i))) , As(:,i)];
FRa(:,:,i) = FRa(:,:,i)./vecnorm(FRa(:,:,i));
MRb(:,:,i) = [cross([0;1;0], Bs(:,i)) , cross(Bs(:,i), cross([0;1;0], Bs(:,i))) , Bs(:,i)];
MRb(:,:,i) = MRb(:,:,i)./vecnorm(MRb(:,:,i));
end
stewart.geometry.Aa = Aa;
stewart.geometry.Ab = Ab;
stewart.geometry.Ba = Ba;
stewart.geometry.Bb = Bb;
stewart.geometry.As = As;
stewart.geometry.Bs = Bs;
stewart.geometry.l = l;
stewart.struts_F.l = l/2;
stewart.struts_M.l = l/2;
stewart.platform_F.FRa = FRa;
stewart.platform_M.MRb = MRb;
end

View File

@ -0,0 +1,77 @@
function [WTr] = computeReferencePose(Dy, Ry, Rz, Dh, Dn)
% computeReferencePose - Compute the homogeneous transformation matrix corresponding to the wanted pose of the sample
%
% Syntax: [WTr] = computeReferencePose(Dy, Ry, Rz, Dh, Dn)
%
% Inputs:
% - Dy - Reference of the Translation Stage [m]
% - Ry - Reference of the Tilt Stage [rad]
% - Rz - Reference of the Spindle [rad]
% - Dh - Reference of the Micro Hexapod (Pitch, Roll, Yaw angles) [m, m, m, rad, rad, rad]
% - Dn - Reference of the Nano Hexapod [m, m, m, rad, rad, rad]
%
% Outputs:
% - WTr -
%% Translation Stage
Rty = [1 0 0 0;
0 1 0 Dy;
0 0 1 0;
0 0 0 1];
%% Tilt Stage - Pure rotating aligned with Ob
Rry = [ cos(Ry) 0 sin(Ry) 0;
0 1 0 0;
-sin(Ry) 0 cos(Ry) 0;
0 0 0 1];
%% Spindle - Rotation along the Z axis
Rrz = [cos(Rz) -sin(Rz) 0 0 ;
sin(Rz) cos(Rz) 0 0 ;
0 0 1 0 ;
0 0 0 1 ];
%% Micro-Hexapod
Rhx = [1 0 0;
0 cos(Dh(4)) -sin(Dh(4));
0 sin(Dh(4)) cos(Dh(4))];
Rhy = [ cos(Dh(5)) 0 sin(Dh(5));
0 1 0;
-sin(Dh(5)) 0 cos(Dh(5))];
Rhz = [cos(Dh(6)) -sin(Dh(6)) 0;
sin(Dh(6)) cos(Dh(6)) 0;
0 0 1];
Rh = [1 0 0 Dh(1) ;
0 1 0 Dh(2) ;
0 0 1 Dh(3) ;
0 0 0 1 ];
Rh(1:3, 1:3) = Rhz*Rhy*Rhx;
%% Nano-Hexapod
Rnx = [1 0 0;
0 cos(Dn(4)) -sin(Dn(4));
0 sin(Dn(4)) cos(Dn(4))];
Rny = [ cos(Dn(5)) 0 sin(Dn(5));
0 1 0;
-sin(Dn(5)) 0 cos(Dn(5))];
Rnz = [cos(Dn(6)) -sin(Dn(6)) 0;
sin(Dn(6)) cos(Dn(6)) 0;
0 0 1];
Rn = [1 0 0 Dn(1) ;
0 1 0 Dn(2) ;
0 0 1 Dn(3) ;
0 0 0 1 ];
Rn(1:3, 1:3) = Rnz*Rny*Rnx;
%% Total Homogeneous transformation
WTr = Rty*Rry*Rrz*Rh*Rn;
end

View File

@ -0,0 +1,141 @@
function [] = describeMicroStationSetup()
% describeMicroStationSetup -
%
% Syntax: [] = describeMicroStationSetup()
%
% Inputs:
% - -
%
% Outputs:
% - -
load('./mat/nass_model_conf_simscape.mat', 'conf_simscape');
fprintf('Simscape Configuration:\n');
if conf_simscape.type == 1
fprintf('- Gravity is included\n');
else
fprintf('- Gravity is not included\n');
end
fprintf('\n');
load('./mat/nass_model_disturbances.mat', 'args');
fprintf('Disturbances:\n');
if ~args.enable
fprintf('- No disturbance is included\n');
else
if args.Dwx && args.Dwy && args.Dwz
fprintf('- Ground motion\n');
end
if args.Fdy_x && args.Fdy_z
fprintf('- Vibrations of the Translation Stage\n');
end
if args.Frz_z
fprintf('- Vibrations of the Spindle\n');
end
end
fprintf('\n');
load('./mat/nass_model_references.mat', 'args');
fprintf('Reference Tracking:\n');
fprintf('- Translation Stage:\n');
switch args.Dy_type
case 'constant'
fprintf(' - Constant Position\n');
fprintf(' - Dy = %.0f [mm]\n', args.Dy_amplitude*1e3);
case 'triangular'
fprintf(' - Triangular Path\n');
fprintf(' - Amplitude = %.0f [mm]\n', args.Dy_amplitude*1e3);
fprintf(' - Period = %.0f [s]\n', args.Dy_period);
case 'sinusoidal'
fprintf(' - Sinusoidal Path\n');
fprintf(' - Amplitude = %.0f [mm]\n', args.Dy_amplitude*1e3);
fprintf(' - Period = %.0f [s]\n', args.Dy_period);
end
fprintf('- Tilt Stage:\n');
switch args.Ry_type
case 'constant'
fprintf(' - Constant Position\n');
fprintf(' - Ry = %.0f [mm]\n', args.Ry_amplitude*1e3);
case 'triangular'
fprintf(' - Triangular Path\n');
fprintf(' - Amplitude = %.0f [mm]\n', args.Ry_amplitude*1e3);
fprintf(' - Period = %.0f [s]\n', args.Ry_period);
case 'sinusoidal'
fprintf(' - Sinusoidal Path\n');
fprintf(' - Amplitude = %.0f [mm]\n', args.Ry_amplitude*1e3);
fprintf(' - Period = %.0f [s]\n', args.Ry_period);
end
fprintf('- Spindle:\n');
switch args.Rz_type
case 'constant'
fprintf(' - Constant Position\n');
fprintf(' - Rz = %.0f [deg]\n', 180/pi*args.Rz_amplitude);
case { 'rotating', 'rotating-not-filtered' }
fprintf(' - Rotating\n');
fprintf(' - Speed = %.0f [rpm]\n', 60/args.Rz_period);
end
fprintf('- Micro Hexapod:\n');
switch args.Dh_type
case 'constant'
fprintf(' - Constant Position\n');
fprintf(' - Dh = %.0f, %.0f, %.0f [mm]\n', args.Dh_pos(1), args.Dh_pos(2), args.Dh_pos(3));
fprintf(' - Rh = %.0f, %.0f, %.0f [deg]\n', args.Dh_pos(4), args.Dh_pos(5), args.Dh_pos(6));
end
fprintf('\n');
load('./mat/nass_model_stages.mat', 'ground', 'granite', 'ty', 'ry', 'rz', 'micro_hexapod', 'axisc');
fprintf('Micro Station:\n');
if granite.type == 1 && ...
ty.type == 1 && ...
ry.type == 1 && ...
rz.type == 1 && ...
micro_hexapod.type == 1;
fprintf('- All stages are rigid\n');
elseif granite.type == 2 && ...
ty.type == 2 && ...
ry.type == 2 && ...
rz.type == 2 && ...
micro_hexapod.type == 2;
fprintf('- All stages are flexible\n');
else
if granite.type == 1 || granite.type == 4
fprintf('- Granite is rigid\n');
else
fprintf('- Granite is flexible\n');
end
if ty.type == 1 || ty.type == 4
fprintf('- Translation Stage is rigid\n');
else
fprintf('- Translation Stage is flexible\n');
end
if ry.type == 1 || ry.type == 4
fprintf('- Tilt Stage is rigid\n');
else
fprintf('- Tilt Stage is flexible\n');
end
if rz.type == 1 || rz.type == 4
fprintf('- Spindle is rigid\n');
else
fprintf('- Spindle is flexible\n');
end
if micro_hexapod.type == 1 || micro_hexapod.type == 4
fprintf('- Micro Hexapod is rigid\n');
else
fprintf('- Micro Hexapod is flexible\n');
end
end
fprintf('\n');

View File

@ -0,0 +1,80 @@
function [] = describeStewartPlatform(stewart)
% describeStewartPlatform - Display some text describing the current defined Stewart Platform
%
% Syntax: [] = describeStewartPlatform(args)
%
% Inputs:
% - stewart
%
% Outputs:
arguments
stewart
end
fprintf('GEOMETRY:\n')
fprintf('- The height between the fixed based and the top platform is %.3g [mm].\n', 1e3*stewart.geometry.H)
if stewart.platform_M.MO_B(3) > 0
fprintf('- Frame {A} is located %.3g [mm] above the top platform.\n', 1e3*stewart.platform_M.MO_B(3))
else
fprintf('- Frame {A} is located %.3g [mm] below the top platform.\n', - 1e3*stewart.platform_M.MO_B(3))
end
fprintf('- The initial length of the struts are:\n')
fprintf('\t %.3g, %.3g, %.3g, %.3g, %.3g, %.3g [mm]\n', 1e3*stewart.geometry.l)
fprintf('\n')
fprintf('ACTUATORS:\n')
if stewart.actuators.type == 1
fprintf('- The actuators are modelled as 1DoF.\n')
fprintf('- The Stiffness and Damping of each actuators is:\n')
fprintf('\t k = %.0e [N/m] \t c = %.0e [N/(m/s)]\n', stewart.actuators.k(1), stewart.actuators.c(1))
if stewart.actuators.kp > 0
fprintf('\t Added parallel stiffness: kp = %.0e [N/m] \t c = %.0e [N/(m/s)]\n', stewart.actuators.kp(1))
end
elseif stewart.actuators.type == 2
fprintf('- The actuators are modelled as 2DoF (APA).\n')
fprintf('- The vertical stiffness and damping contribution of the piezoelectric stack is:\n')
fprintf('\t ka = %.0e [N/m] \t ca = %.0e [N/(m/s)]\n', stewart.actuators.ka(1), stewart.actuators.ca(1))
fprintf('- Vertical stiffness when the piezoelectric stack is removed is:\n')
fprintf('\t kr = %.0e [N/m] \t cr = %.0e [N/(m/s)]\n', stewart.actuators.kr(1), stewart.actuators.cr(1))
elseif stewart.actuators.type == 3
fprintf('- The actuators are modelled with a flexible element (FEM).\n')
end
fprintf('\n')
fprintf('JOINTS:\n')
switch stewart.joints_F.type
case 1
fprintf('- The joints on the fixed based are universal joints (2DoF)\n')
case 2
fprintf('- The joints on the fixed based are spherical joints (3DoF)\n')
end
switch stewart.joints_M.type
case 1
fprintf('- The joints on the mobile based are universal joints (2DoF)\n')
case 2
fprintf('- The joints on the mobile based are spherical joints (3DoF)\n')
end
fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_F.Fa)
fprintf('- The position of the joints on the mobile based with respect to {M} are (in [mm]):\n')
fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_M.Mb)
fprintf('\n')
fprintf('KINEMATICS:\n')
if isfield(stewart.kinematics, 'K')
fprintf('- The Stiffness matrix K is (in [N/m]):\n')
fprintf('\t % .0e \t % .0e \t % .0e \t % .0e \t % .0e \t % .0e\n', stewart.kinematics.K)
end
if isfield(stewart.kinematics, 'C')
fprintf('- The Damping matrix C is (in [m/N]):\n')
fprintf('\t % .0e \t % .0e \t % .0e \t % .0e \t % .0e \t % .0e\n', stewart.kinematics.C)
end

View File

@ -0,0 +1,240 @@
function [] = displayArchitecture(stewart, args)
% displayArchitecture - 3D plot of the Stewart platform architecture
%
% Syntax: [] = displayArchitecture(args)
%
% Inputs:
% - stewart
% - args - Structure with the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
% - F_color [color] - Color used for the Fixed elements
% - M_color [color] - Color used for the Mobile elements
% - L_color [color] - Color used for the Legs elements
% - frames [true/false] - Display the Frames
% - legs [true/false] - Display the Legs
% - joints [true/false] - Display the Joints
% - labels [true/false] - Display the Labels
% - platforms [true/false] - Display the Platforms
% - views ['all', 'xy', 'yz', 'xz', 'default'] -
%
% Outputs:
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
args.F_color = [0 0.4470 0.7410]
args.M_color = [0.8500 0.3250 0.0980]
args.L_color = [0 0 0]
args.frames logical {mustBeNumericOrLogical} = true
args.legs logical {mustBeNumericOrLogical} = true
args.joints logical {mustBeNumericOrLogical} = true
args.labels logical {mustBeNumericOrLogical} = true
args.platforms logical {mustBeNumericOrLogical} = true
args.views char {mustBeMember(args.views,{'all', 'xy', 'xz', 'yz', 'default'})} = 'default'
end
assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
FO_A = stewart.platform_F.FO_A;
assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
MO_B = stewart.platform_M.MO_B;
assert(isfield(stewart.geometry, 'H'), 'stewart.geometry should have attribute H')
H = stewart.geometry.H;
assert(isfield(stewart.platform_F, 'Fa'), 'stewart.platform_F should have attribute Fa')
Fa = stewart.platform_F.Fa;
assert(isfield(stewart.platform_M, 'Mb'), 'stewart.platform_M should have attribute Mb')
Mb = stewart.platform_M.Mb;
if ~strcmp(args.views, 'all')
figure;
else
f = figure('visible', 'off');
end
hold on;
FTa = [eye(3), FO_A; ...
zeros(1,3), 1];
ATb = [args.ARB, args.AP; ...
zeros(1,3), 1];
BTm = [eye(3), -MO_B; ...
zeros(1,3), 1];
FTm = FTa*ATb*BTm;
d_unit_vector = H/4;
d_label = H/20;
Ff = [0, 0, 0];
if args.frames
quiver3(Ff(1)*ones(1,3), Ff(2)*ones(1,3), Ff(3)*ones(1,3), ...
[d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
if args.labels
text(Ff(1) + d_label, ...
Ff(2) + d_label, ...
Ff(3) + d_label, '$\{F\}$', 'Color', args.F_color);
end
end
if args.frames
quiver3(FO_A(1)*ones(1,3), FO_A(2)*ones(1,3), FO_A(3)*ones(1,3), ...
[d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
if args.labels
text(FO_A(1) + d_label, ...
FO_A(2) + d_label, ...
FO_A(3) + d_label, '$\{A\}$', 'Color', args.F_color);
end
end
if args.platforms && stewart.platform_F.type == 1
theta = [0:0.01:2*pi+0.01]; % Angles [rad]
v = null([0; 0; 1]'); % Two vectors that are perpendicular to the circle normal
center = [0; 0; 0]; % Center of the circle
radius = stewart.platform_F.R; % Radius of the circle [m]
points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
plot3(points(1,:), ...
points(2,:), ...
points(3,:), '-', 'Color', args.F_color);
end
if args.joints
scatter3(Fa(1,:), ...
Fa(2,:), ...
Fa(3,:), 'MarkerEdgeColor', args.F_color);
if args.labels
for i = 1:size(Fa,2)
text(Fa(1,i) + d_label, ...
Fa(2,i), ...
Fa(3,i), sprintf('$a_{%i}$', i), 'Color', args.F_color);
end
end
end
Fm = FTm*[0; 0; 0; 1]; % Get the position of frame {M} w.r.t. {F}
if args.frames
FM_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
quiver3(Fm(1)*ones(1,3), Fm(2)*ones(1,3), Fm(3)*ones(1,3), ...
FM_uv(1,1:3), FM_uv(2,1:3), FM_uv(3,1:3), '-', 'Color', args.M_color)
if args.labels
text(Fm(1) + d_label, ...
Fm(2) + d_label, ...
Fm(3) + d_label, '$\{M\}$', 'Color', args.M_color);
end
end
FB = FO_A + args.AP;
if args.frames
FB_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
quiver3(FB(1)*ones(1,3), FB(2)*ones(1,3), FB(3)*ones(1,3), ...
FB_uv(1,1:3), FB_uv(2,1:3), FB_uv(3,1:3), '-', 'Color', args.M_color)
if args.labels
text(FB(1) - d_label, ...
FB(2) + d_label, ...
FB(3) + d_label, '$\{B\}$', 'Color', args.M_color);
end
end
if args.platforms && stewart.platform_M.type == 1
theta = [0:0.01:2*pi+0.01]; % Angles [rad]
v = null((FTm(1:3,1:3)*[0;0;1])'); % Two vectors that are perpendicular to the circle normal
center = Fm(1:3); % Center of the circle
radius = stewart.platform_M.R; % Radius of the circle [m]
points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
plot3(points(1,:), ...
points(2,:), ...
points(3,:), '-', 'Color', args.M_color);
end
if args.joints
Fb = FTm*[Mb;ones(1,6)];
scatter3(Fb(1,:), ...
Fb(2,:), ...
Fb(3,:), 'MarkerEdgeColor', args.M_color);
if args.labels
for i = 1:size(Fb,2)
text(Fb(1,i) + d_label, ...
Fb(2,i), ...
Fb(3,i), sprintf('$b_{%i}$', i), 'Color', args.M_color);
end
end
end
if args.legs
for i = 1:6
plot3([Fa(1,i), Fb(1,i)], ...
[Fa(2,i), Fb(2,i)], ...
[Fa(3,i), Fb(3,i)], '-', 'Color', args.L_color);
if args.labels
text((Fa(1,i)+Fb(1,i))/2 + d_label, ...
(Fa(2,i)+Fb(2,i))/2, ...
(Fa(3,i)+Fb(3,i))/2, sprintf('$%i$', i), 'Color', args.L_color);
end
end
end
switch args.views
case 'default'
view([1 -0.6 0.4]);
case 'xy'
view([0 0 1]);
case 'xz'
view([0 -1 0]);
case 'yz'
view([1 0 0]);
end
axis equal;
axis off;
if strcmp(args.views, 'all')
hAx = findobj('type', 'axes');
figure;
s1 = subplot(2,2,1);
copyobj(get(hAx(1), 'Children'), s1);
view([0 0 1]);
axis equal;
axis off;
title('Top')
s2 = subplot(2,2,2);
copyobj(get(hAx(1), 'Children'), s2);
view([1 -0.6 0.4]);
axis equal;
axis off;
s3 = subplot(2,2,3);
copyobj(get(hAx(1), 'Children'), s3);
view([1 0 0]);
axis equal;
axis off;
title('Front')
s4 = subplot(2,2,4);
copyobj(get(hAx(1), 'Children'), s4);
view([0 -1 0]);
axis equal;
axis off;
title('Side')
close(f);
end

View File

@ -0,0 +1,41 @@
function [stewart] = generateGeneralConfiguration(stewart, args)
% generateGeneralConfiguration - Generate a Very General Configuration
%
% Syntax: [stewart] = generateGeneralConfiguration(stewart, args)
%
% Inputs:
% - args - Can have the following fields:
% - FH [1x1] - Height of the position of the fixed joints with respect to the frame {F} [m]
% - FR [1x1] - Radius of the position of the fixed joints in the X-Y [m]
% - FTh [6x1] - Angles of the fixed joints in the X-Y plane with respect to the X axis [rad]
% - MH [1x1] - Height of the position of the mobile joints with respect to the frame {M} [m]
% - FR [1x1] - Radius of the position of the mobile joints in the X-Y [m]
% - MTh [6x1] - Angles of the mobile joints in the X-Y plane with respect to the X axis [rad]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - platform_F.Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
% - platform_M.Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
arguments
stewart
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 115e-3;
args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180);
args.MH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 90e-3;
args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180);
end
Fa = zeros(3,6);
Mb = zeros(3,6);
for i = 1:6
Fa(:,i) = [args.FR*cos(args.FTh(i)); args.FR*sin(args.FTh(i)); args.FH];
Mb(:,i) = [args.MR*cos(args.MTh(i)); args.MR*sin(args.MTh(i)); -args.MH];
end
stewart.platform_F.Fa = Fa;
stewart.platform_M.Mb = Mb;
end

View File

@ -0,0 +1,45 @@
function [] = initializeController(args)
arguments
args.type char {mustBeMember(args.type,{'open-loop', 'iff', 'dvf', 'hac-dvf', 'ref-track-L', 'ref-track-iff-L', 'cascade-hac-lac', 'hac-iff', 'stabilizing'})} = 'open-loop'
end
controller = struct();
switch args.type
case 'open-loop'
controller.type = 1;
controller.name = 'Open-Loop';
case 'dvf'
controller.type = 2;
controller.name = 'Decentralized Direct Velocity Feedback';
case 'iff'
controller.type = 3;
controller.name = 'Decentralized Integral Force Feedback';
case 'hac-dvf'
controller.type = 4;
controller.name = 'HAC-DVF';
case 'ref-track-L'
controller.type = 5;
controller.name = 'Reference Tracking in the frame of the legs';
case 'ref-track-iff-L'
controller.type = 6;
controller.name = 'Reference Tracking in the frame of the legs + IFF';
case 'cascade-hac-lac'
controller.type = 7;
controller.name = 'Cascade Control + HAC-LAC';
case 'hac-iff'
controller.type = 8;
controller.name = 'HAC-IFF';
case 'stabilizing'
controller.type = 9;
controller.name = 'Stabilizing Controller';
end
if exist('./mat', 'dir')
save('mat/nass_model_controller.mat', 'controller');
elseif exist('./matlab', 'dir')
save('matlab/mat/nass_model_controller.mat', 'controller');
end
end

View File

@ -0,0 +1,61 @@
function [stewart] = initializeCylindricalPlatforms(stewart, args)
% initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
%
% Syntax: [stewart] = initializeCylindricalPlatforms(args)
%
% Inputs:
% - args - Structure with the following fields:
% - Fpm [1x1] - Fixed Platform Mass [kg]
% - Fph [1x1] - Fixed Platform Height [m]
% - Fpr [1x1] - Fixed Platform Radius [m]
% - Mpm [1x1] - Mobile Platform Mass [kg]
% - Mph [1x1] - Mobile Platform Height [m]
% - Mpr [1x1] - Mobile Platform Radius [m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - platform_F [struct] - structure with the following fields:
% - type = 1
% - M [1x1] - Fixed Platform Mass [kg]
% - I [3x3] - Fixed Platform Inertia matrix [kg*m^2]
% - H [1x1] - Fixed Platform Height [m]
% - R [1x1] - Fixed Platform Radius [m]
% - platform_M [struct] - structure with the following fields:
% - M [1x1] - Mobile Platform Mass [kg]
% - I [3x3] - Mobile Platform Inertia matrix [kg*m^2]
% - H [1x1] - Mobile Platform Height [m]
% - R [1x1] - Mobile Platform Radius [m]
arguments
stewart
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 125e-3
args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
end
I_F = diag([1/12*args.Fpm * (3*args.Fpr^2 + args.Fph^2), ...
1/12*args.Fpm * (3*args.Fpr^2 + args.Fph^2), ...
1/2 *args.Fpm * args.Fpr^2]);
I_M = diag([1/12*args.Mpm * (3*args.Mpr^2 + args.Mph^2), ...
1/12*args.Mpm * (3*args.Mpr^2 + args.Mph^2), ...
1/2 *args.Mpm * args.Mpr^2]);
stewart.platform_F.type = 1;
stewart.platform_F.I = I_F;
stewart.platform_F.M = args.Fpm;
stewart.platform_F.R = args.Fpr;
stewart.platform_F.H = args.Fph;
stewart.platform_M.type = 1;
stewart.platform_M.I = I_M;
stewart.platform_M.M = args.Mpm;
stewart.platform_M.R = args.Mpr;
stewart.platform_M.H = args.Mph;
end

View File

@ -0,0 +1,69 @@
function [stewart] = initializeCylindricalStruts(stewart, args)
% initializeCylindricalStruts - Define the mass and moment of inertia of cylindrical struts
%
% Syntax: [stewart] = initializeCylindricalStruts(args)
%
% Inputs:
% - args - Structure with the following fields:
% - Fsm [1x1] - Mass of the Fixed part of the struts [kg]
% - Fsh [1x1] - Height of cylinder for the Fixed part of the struts [m]
% - Fsr [1x1] - Radius of cylinder for the Fixed part of the struts [m]
% - Msm [1x1] - Mass of the Mobile part of the struts [kg]
% - Msh [1x1] - Height of cylinder for the Mobile part of the struts [m]
% - Msr [1x1] - Radius of cylinder for the Mobile part of the struts [m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - struts_F [struct] - structure with the following fields:
% - M [6x1] - Mass of the Fixed part of the struts [kg]
% - I [3x3x6] - Moment of Inertia for the Fixed part of the struts [kg*m^2]
% - H [6x1] - Height of cylinder for the Fixed part of the struts [m]
% - R [6x1] - Radius of cylinder for the Fixed part of the struts [m]
% - struts_M [struct] - structure with the following fields:
% - M [6x1] - Mass of the Mobile part of the struts [kg]
% - I [3x3x6] - Moment of Inertia for the Mobile part of the struts [kg*m^2]
% - H [6x1] - Height of cylinder for the Mobile part of the struts [m]
% - R [6x1] - Radius of cylinder for the Mobile part of the struts [m]
arguments
stewart
args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
end
stewart.struts_M.type = 1;
%% Compute the properties of the cylindrical struts
Fsm = args.Fsm;
Fsh = args.Fsh;
Fsr = args.Fsr;
Msm = args.Msm;
Msh = args.Msh;
Msr = args.Msr;
I_F = [1/12 * Fsm * (3*Fsr^2 + Fsh^2), ...
1/12 * Fsm * (3*Fsr^2 + Fsh^2), ...
1/2 * Fsm * Fsr^2];
I_M = [1/12 * Msm * (3*Msr^2 + Msh^2), ...
1/12 * Msm * (3*Msr^2 + Msh^2), ...
1/2 * Msm * Msr^2];
stewart.struts_M.I = I_M;
stewart.struts_F.I = I_F;
stewart.struts_M.M = args.Msm;
stewart.struts_M.R = args.Msr;
stewart.struts_M.H = args.Msh;
stewart.struts_F.type = 1;
stewart.struts_F.M = args.Fsm;
stewart.struts_F.R = args.Fsr;
stewart.struts_F.H = args.Fsh;
end

View File

@ -0,0 +1,211 @@
function [] = initializeDisturbances(args)
% initializeDisturbances - Initialize the disturbances
%
% Syntax: [] = initializeDisturbances(args)
%
% Inputs:
% - args -
arguments
% Global parameter to enable or disable the disturbances
args.enable logical {mustBeNumericOrLogical} = true
% Ground Motion - X direction
args.Dw_x logical {mustBeNumericOrLogical} = true
% Ground Motion - Y direction
args.Dw_y logical {mustBeNumericOrLogical} = true
% Ground Motion - Z direction
args.Dw_z logical {mustBeNumericOrLogical} = true
% Translation Stage - X direction
args.Fdy_x logical {mustBeNumericOrLogical} = true
% Translation Stage - Z direction
args.Fdy_z logical {mustBeNumericOrLogical} = true
% Spindle - X direction
args.Frz_x logical {mustBeNumericOrLogical} = true
% Spindle - Y direction
args.Frz_y logical {mustBeNumericOrLogical} = true
% Spindle - Z direction
args.Frz_z logical {mustBeNumericOrLogical} = true
end
% Initialization of random numbers
rng("shuffle");
%% Ground Motion
if args.enable
% Load the PSD of disturbance
load('ustation_disturbance_psd.mat', 'gm_dist')
% Frequency Data
Dw.f = gm_dist.f;
Dw.psd_x = gm_dist.pxx_x;
Dw.psd_y = gm_dist.pxx_y;
Dw.psd_z = gm_dist.pxx_z;
% Time data
Fs = 2*Dw.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dw.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dw.t = linspace(0, T0, N+1)'; % Time Vector [s]
% ASD representation of the ground motion
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Dw.psd_x(i)/T0);
end
if args.Dw_x
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.x = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else
Dw.x = zeros(length(Dw.t), 1);
end
if args.Dw_y
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.y = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else
Dw.y = zeros(length(Dw.t), 1);
end
if args.Dw_y
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.z = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else
Dw.z = zeros(length(Dw.t), 1);
end
else
Dw.t = [0,1]; % Time Vector [s]
Dw.x = [0,0]; % Ground Motion - X [m]
Dw.y = [0,0]; % Ground Motion - Y [m]
Dw.z = [0,0]; % Ground Motion - Z [m]
end
%% Translation stage
if args.enable
% Load the PSD of disturbance
load('ustation_disturbance_psd.mat', 'dy_dist')
% Frequency Data
Dy.f = dy_dist.f;
Dy.psd_x = dy_dist.pxx_fx;
Dy.psd_z = dy_dist.pxx_fz;
% Time data
Fs = 2*Dy.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dy.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dy.t = linspace(0, T0, N+1)'; % Time Vector [s]
% ASD representation of the disturbance voice
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Dy.psd_x(i)/T0);
end
if args.Fdy_x
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dy.x = N/sqrt(2)*ifft(Cx); % Translation stage disturbances - X direction [N]
else
Dy.x = zeros(length(Dy.t), 1);
end
if args.Fdy_z
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dy.z = N/sqrt(2)*ifft(Cx); % Translation stage disturbances - Z direction [N]
else
Dy.z = zeros(length(Dy.t), 1);
end
else
Dy.t = [0,1]; % Time Vector [s]
Dy.x = [0,0]; % Translation Stage disturbances - X [N]
Dy.z = [0,0]; % Translation Stage disturbances - Z [N]
end
%% Spindle
if args.enable
% Load the PSD of disturbance
load('ustation_disturbance_psd.mat', 'rz_dist')
% Frequency Data
Rz.f = rz_dist.f;
Rz.psd_x = rz_dist.pxx_fx;
Rz.psd_y = rz_dist.pxx_fy;
Rz.psd_z = rz_dist.pxx_fz;
% Time data
Fs = 2*Rz.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Rz.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Rz.t = linspace(0, T0, N+1)'; % Time Vector [s]
% ASD representation of the disturbance voice
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Rz.psd_x(i)/T0);
end
if args.Frz_x
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Rz.x = N/sqrt(2)*ifft(Cx); % spindle disturbances - X direction [N]
else
Rz.x = zeros(length(Rz.t), 1);
end
if args.Frz_y
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Rz.y = N/sqrt(2)*ifft(Cx); % spindle disturbances - Y direction [N]
else
Rz.y = zeros(length(Rz.t), 1);
end
if args.Frz_z
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Rz.z = N/sqrt(2)*ifft(Cx); % spindle disturbances - Z direction [N]
else
Rz.z = zeros(length(Rz.t), 1);
end
else
Rz.t = [0,1]; % Time Vector [s]
Rz.x = [0,0]; % Spindle disturbances - X [N]
Rz.y = [0,0]; % Spindle disturbances - X [N]
Rz.z = [0,0]; % Spindle disturbances - Z [N]
end
u = zeros(100, 6);
Fd = u;
Dw.x = Dw.x - Dw.x(1);
Dw.y = Dw.y - Dw.y(1);
Dw.z = Dw.z - Dw.z(1);
Dy.x = Dy.x - Dy.x(1);
Dy.z = Dy.z - Dy.z(1);
Rz.x = Rz.x - Rz.x(1);
Rz.y = Rz.y - Rz.y(1);
Rz.z = Rz.z - Rz.z(1);
if exist('./mat', 'dir')
save('mat/nass_model_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
elseif exist('./matlab', 'dir')
save('matlab/mat/nass_model_disturbances.mat', 'Dw', 'Dy', 'Rz', 'Fd', 'args');
end

View File

@ -0,0 +1,37 @@
function [stewart] = initializeFramesPositions(stewart, args)
% initializeFramesPositions - Initialize the positions of frames {A}, {B}, {F} and {M}
%
% Syntax: [stewart] = initializeFramesPositions(stewart, args)
%
% Inputs:
% - args - Can have the following fields:
% - H [1x1] - Total Height of the Stewart Platform (height from {F} to {M}) [m]
% - MO_B [1x1] - Height of the frame {B} with respect to {M} [m]
%
% Outputs:
% - stewart - A structure with the following fields:
% - geometry.H [1x1] - Total Height of the Stewart Platform [m]
% - geometry.FO_M [3x1] - Position of {M} with respect to {F} [m]
% - platform_M.MO_B [3x1] - Position of {B} with respect to {M} [m]
% - platform_F.FO_A [3x1] - Position of {A} with respect to {F} [m]
arguments
stewart
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
args.MO_B (1,1) double {mustBeNumeric} = 50e-3
end
H = args.H; % Total Height of the Stewart Platform [m]
FO_M = [0; 0; H]; % Position of {M} with respect to {F} [m]
MO_B = [0; 0; args.MO_B]; % Position of {B} with respect to {M} [m]
FO_A = MO_B + FO_M; % Position of {A} with respect to {F} [m]
stewart.geometry.H = H;
stewart.geometry.FO_M = FO_M;
stewart.platform_M.MO_B = MO_B;
stewart.platform_F.FO_A = FO_A;
end

View File

@ -0,0 +1,48 @@
function [granite] = initializeGranite(args)
arguments
args.type char {mustBeMember(args.type,{'rigid', 'flexible', 'none'})} = 'flexible'
args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3]
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = [5e9; 5e9; 5e9; 2.5e7; 2.5e7; 1e7] % [N/m]
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5; 2e4; 2e4; 1e4] % [N/(m/s)]
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
args.sample_pos (1,1) double {mustBeNumeric} = 0.775 % Height of the measurment point [m]
end
granite = struct();
switch args.type
case 'none'
granite.type = 0;
case 'rigid'
granite.type = 1;
case 'flexible'
granite.type = 2;
end
granite.density = args.density; % [kg/m3]
granite.STEP = 'granite.STEP';
% Z-offset for the initial position of the sample with respect to the granite top surface.
granite.sample_pos = args.sample_pos; % [m]
granite.K = args.K; % [N/m]
granite.C = args.C; % [N/(m/s)]
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'granite', '-append');
else
save('mat/nass_model_stages.mat', 'granite');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'granite', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'granite');
end
end
end

View File

@ -0,0 +1,35 @@
function [ground] = initializeGround(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid'
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) % Rotation point for the ground motion [m]
end
ground = struct();
switch args.type
case 'none'
ground.type = 0;
case 'rigid'
ground.type = 1;
end
ground.shape = [2, 2, 0.5]; % [m]
ground.density = 2800; % [kg/m3]
ground.rot_point = args.rot_point;
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'ground', '-append');
else
save('mat/nass_model_stages.mat', 'ground');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'ground', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'ground');
end
end
end

View File

@ -0,0 +1,48 @@
function [stewart] = initializeInertialSensor(stewart, args)
% initializeInertialSensor - Initialize the inertial sensor in each strut
%
% Syntax: [stewart] = initializeInertialSensor(args)
%
% Inputs:
% - args - Structure with the following fields:
% - type - 'geophone', 'accelerometer', 'none'
% - mass [1x1] - Weight of the inertial mass [kg]
% - freq [1x1] - Cutoff frequency [Hz]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - stewart.sensors.inertial
% - type - 1 (geophone), 2 (accelerometer), 3 (none)
% - K [1x1] - Stiffness [N/m]
% - C [1x1] - Damping [N/(m/s)]
% - M [1x1] - Inertial Mass [kg]
% - G [1x1] - Gain
arguments
stewart
args.type char {mustBeMember(args.type,{'geophone', 'accelerometer', 'none'})} = 'none'
args.mass (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e-2
args.freq (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e3
end
sensor = struct();
switch args.type
case 'geophone'
sensor.type = 1;
sensor.M = args.mass;
sensor.K = sensor.M * (2*pi*args.freq)^2;
sensor.C = 2*sqrt(sensor.M * sensor.K);
case 'accelerometer'
sensor.type = 2;
sensor.M = args.mass;
sensor.K = sensor.M * (2*pi*args.freq)^2;
sensor.C = 2*sqrt(sensor.M * sensor.K);
sensor.G = -sensor.K/sensor.M;
case 'none'
sensor.type = 3;
end
stewart.sensors.inertial = sensor;

View File

@ -0,0 +1,136 @@
function [stewart] = initializeJointDynamics(stewart, args)
% initializeJointDynamics - Add Stiffness and Damping properties for the spherical joints
%
% Syntax: [stewart] = initializeJointDynamics(args)
%
% Inputs:
% - args - Structure with the following fields:
% - type_F - 'universal', 'spherical', 'universal_p', 'spherical_p'
% - type_M - 'universal', 'spherical', 'universal_p', 'spherical_p'
% - Kf_M [6x1] - Bending (Rx, Ry) Stiffness for each top joints [(N.m)/rad]
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - stewart.joints_F and stewart.joints_M:
% - type - 1 (universal), 2 (spherical), 3 (universal perfect), 4 (spherical perfect)
% - Kx, Ky, Kz [6x1] - Translation (Tx, Ty, Tz) Stiffness [N/m]
% - Kf [6x1] - Flexion (Rx, Ry) Stiffness [(N.m)/rad]
% - Kt [6x1] - Torsion (Rz) Stiffness [(N.m)/rad]
% - Cx, Cy, Cz [6x1] - Translation (Rx, Ry) Damping [N/(m/s)]
% - Cf [6x1] - Flexion (Rx, Ry) Damping [(N.m)/(rad/s)]
% - Cb [6x1] - Torsion (Rz) Damping [(N.m)/(rad/s)]
arguments
stewart
args.type_F char {mustBeMember(args.type_F,{'2dof', '3dof', '4dof', '2dof_axial', 'flexible'})} = '2dof'
args.type_M char {mustBeMember(args.type_M,{'2dof', '3dof', '4dof', '2dof_axial', 'flexible'})} = '3dof'
args.Kf_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cf_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kt_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ct_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kf_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cf_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kt_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ct_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ka_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ca_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kr_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cr_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ka_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ca_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kr_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cr_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.K_M double {mustBeNumeric} = zeros(6,6)
args.M_M double {mustBeNumeric} = zeros(6,6)
args.n_xyz_M double {mustBeNumeric} = zeros(2,3)
args.xi_M double {mustBeNumeric} = 0.1
args.step_file_M char {} = 'flexor_025.STEP'
args.K_F double {mustBeNumeric} = zeros(6,6)
args.M_F double {mustBeNumeric} = zeros(6,6)
args.n_xyz_F double {mustBeNumeric} = zeros(2,3)
args.xi_F double {mustBeNumeric} = 0.1
args.step_file_F char {} = 'flexor_025.STEP'
end
switch args.type_F
case '2dof'
stewart.joints_F.type = 1;
case '3dof'
stewart.joints_F.type = 2;
case '4dof'
stewart.joints_F.type = 3;
case '2dof_axial'
stewart.joints_F.type = 4;
case 'flexible'
stewart.joints_F.type = 5;
K = readmatrix('flex025_mat_K.CSV');
M = readmatrix('flex025_mat_M.CSV');
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('flex025_out_nodes_3D.txt');
stewart.joints_F.M = M;
stewart.joints_F.K = K;
stewart.joints_F.n_xyz = int_xyz;
stewart.joints_F.xi = 0.05;
stewart.joints_F.step_file = args.step_file_F;
otherwise
error("joints_F are not correctly defined")
end
switch args.type_M
case '2dof'
stewart.joints_M.type = 1;
case '3dof'
stewart.joints_M.type = 2;
case '4dof'
stewart.joints_M.type = 3;
case '2dof_axial'
stewart.joints_M.type = 4;
case 'flexible'
stewart.joints_M.type = 5;
K = readmatrix('flex025_mat_K.CSV');
M = readmatrix('flex025_mat_M.CSV');
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('flex025_out_nodes_3D.txt');
stewart.joints_M.M = M;
stewart.joints_M.K = K;
stewart.joints_M.n_xyz = int_xyz;
stewart.joints_M.xi = 0.05;
stewart.joints_M.step_file = args.step_file_M;
otherwise
error("joints_M are not correctly defined")
end
stewart.joints_M.Ka = args.Ka_M;
stewart.joints_M.Kr = args.Kr_M;
stewart.joints_F.Ka = args.Ka_F;
stewart.joints_F.Kr = args.Kr_F;
stewart.joints_M.Ca = args.Ca_M;
stewart.joints_M.Cr = args.Cr_M;
stewart.joints_F.Ca = args.Ca_F;
stewart.joints_F.Cr = args.Cr_F;
stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Kt = args.Kt_M;
stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Kt = args.Kt_F;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Ct = args.Ct_M;
stewart.joints_F.Cf = args.Cf_F;
stewart.joints_F.Ct = args.Ct_F;
end

View File

@ -0,0 +1,33 @@
function [] = initializeLoggingConfiguration(args)
arguments
args.log char {mustBeMember(args.log,{'none', 'all', 'forces'})} = 'none'
args.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e-3
end
conf_log = struct();
switch args.log
case 'none'
conf_log.type = 0;
case 'all'
conf_log.type = 1;
case 'forces'
conf_log.type = 2;
end
conf_log.Ts = args.Ts;
if exist('./mat', 'dir')
if exist('./mat/nass_model_conf_log.mat', 'file')
save('mat/nass_model_conf_log.mat', 'conf_log', '-append');
else
save('mat/nass_model_conf_log.mat', 'conf_log');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_conf_log.mat', 'file')
save('matlab/mat/nass_model_conf_log.mat', 'conf_log', '-append');
else
save('matlab/mat/nass_model_conf_log.mat', 'conf_log');
end
end

View File

@ -0,0 +1,108 @@
function [micro_hexapod] = initializeMicroHexapod(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
% initializeFramesPositions
args.H (1,1) double {mustBeNumeric, mustBePositive} = 350e-3
args.MO_B (1,1) double {mustBeNumeric} = 270e-3
% generateGeneralConfiguration
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 175.5e-3
args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180)
args.MH (1,1) double {mustBeNumeric, mustBePositive} = 45e-3
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 118e-3
args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180)
% initializeStrutDynamics
args.Ki (1,1) double {mustBeNumeric, mustBeNonnegative} = 2e7
args.Ci (1,1) double {mustBeNumeric, mustBeNonnegative} = 1.4e3
% initializeCylindricalPlatforms
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 10
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3
args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 207.5e-3
args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 10
args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3
args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 150e-3
% initializeCylindricalStruts
args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3
args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3
% inverseKinematics
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
end
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, ...
'H', args.H, ...
'MO_B', args.MO_B);
stewart = generateGeneralConfiguration(stewart, ...
'FH', args.FH, ...
'FR', args.FR, ...
'FTh', args.FTh, ...
'MH', args.MH, ...
'MR', args.MR, ...
'MTh', args.MTh);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, ...
'k', args.Ki, ...
'c', args.Ci);
stewart = initializeJointDynamics(stewart, ...
'type_F', '2dof', ...
'type_M', '3dof');
stewart = initializeCylindricalPlatforms(stewart, ...
'Fpm', args.Fpm, ...
'Fph', args.Fph, ...
'Fpr', args.Fpr, ...
'Mpm', args.Mpm, ...
'Mph', args.Mph, ...
'Mpr', args.Mpr);
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', args.Fsm, ...
'Fsh', args.Fsh, ...
'Fsr', args.Fsr, ...
'Msm', args.Msm, ...
'Msh', args.Msh, ...
'Msr', args.Msr);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart, ...
'AP', args.AP, ...
'ARB', args.ARB);
stewart = initializeInertialSensor(stewart, 'type', 'none');
switch args.type
case 'none'
stewart.type = 0;
case 'rigid'
stewart.type = 1;
case 'flexible'
stewart.type = 2;
end
micro_hexapod = stewart;
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'micro_hexapod', '-append');
else
save('mat/nass_model_stages.mat', 'micro_hexapod');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'micro_hexapod', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'micro_hexapod');
end
end
end

View File

@ -0,0 +1,199 @@
function [ref] = initializeReferences(args)
arguments
% Sampling Frequency [s]
args.Ts (1,1) double {mustBeNumeric, mustBePositive} = 1e-3
% Maximum simulation time [s]
args.Tmax (1,1) double {mustBeNumeric, mustBePositive} = 100
% Either "constant" / "triangular" / "sinusoidal"
args.Dy_type char {mustBeMember(args.Dy_type,{'constant', 'triangular', 'sinusoidal'})} = 'constant'
% Amplitude of the displacement [m]
args.Dy_amplitude (1,1) double {mustBeNumeric} = 0
% Period of the displacement [s]
args.Dy_period (1,1) double {mustBeNumeric, mustBePositive} = 1
% Either "constant" / "triangular" / "sinusoidal"
args.Ry_type char {mustBeMember(args.Ry_type,{'constant', 'triangular', 'sinusoidal'})} = 'constant'
% Amplitude [rad]
args.Ry_amplitude (1,1) double {mustBeNumeric} = 0
% Period of the displacement [s]
args.Ry_period (1,1) double {mustBeNumeric, mustBePositive} = 1
% Either "constant" / "rotating"
args.Rz_type char {mustBeMember(args.Rz_type,{'constant', 'rotating', 'rotating-not-filtered'})} = 'constant'
% Initial angle [rad]
args.Rz_amplitude (1,1) double {mustBeNumeric} = 0
% Period of the rotating [s]
args.Rz_period (1,1) double {mustBeNumeric, mustBePositive} = 1
% For now, only constant is implemented
args.Dh_type char {mustBeMember(args.Dh_type,{'constant'})} = 'constant'
% Initial position [m,m,m,rad,rad,rad] of the top platform (Pitch-Roll-Yaw Euler angles)
args.Dh_pos (6,1) double {mustBeNumeric} = zeros(6, 1), ...
% For now, only constant is implemented
args.Rm_type char {mustBeMember(args.Rm_type,{'constant'})} = 'constant'
% Initial position of the two masses
args.Rm_pos (2,1) double {mustBeNumeric} = [0; pi]
% For now, only constant is implemented
args.Dn_type char {mustBeMember(args.Dn_type,{'constant'})} = 'constant'
% Initial position [m,m,m,rad,rad,rad] of the top platform
args.Dn_pos (6,1) double {mustBeNumeric} = zeros(6,1)
end
%% Set Sampling Time
Ts = args.Ts;
Tmax = args.Tmax;
%% Low Pass Filter to filter out the references
s = zpk('s');
w0 = 2*pi*10;
xi = 1;
H_lpf = 1/(1 + 2*xi/w0*s + s^2/w0^2);
%% Translation stage - Dy
t = 0:Ts:Tmax; % Time Vector [s]
Dy = zeros(length(t), 1);
Dyd = zeros(length(t), 1);
Dydd = zeros(length(t), 1);
switch args.Dy_type
case 'constant'
Dy(:) = args.Dy_amplitude;
Dyd(:) = 0;
Dydd(:) = 0;
case 'triangular'
% This is done to unsure that we start with no displacement
Dy_raw = args.Dy_amplitude*sawtooth(2*pi*t/args.Dy_period,1/2);
i0 = find(t>=args.Dy_period/4,1);
Dy(1:end-i0+1) = Dy_raw(i0:end);
Dy(end-i0+2:end) = Dy_raw(end); % we fix the last value
% The signal is filtered out
Dy = lsim(H_lpf, Dy, t);
Dyd = lsim(H_lpf*s, Dy, t);
Dydd = lsim(H_lpf*s^2, Dy, t);
case 'sinusoidal'
Dy(:) = args.Dy_amplitude*sin(2*pi/args.Dy_period*t);
Dyd = args.Dy_amplitude*2*pi/args.Dy_period*cos(2*pi/args.Dy_period*t);
Dydd = -args.Dy_amplitude*(2*pi/args.Dy_period)^2*sin(2*pi/args.Dy_period*t);
otherwise
warning('Dy_type is not set correctly');
end
Dy = struct('time', t, 'signals', struct('values', Dy), 'deriv', Dyd, 'dderiv', Dydd);
%% Tilt Stage - Ry
t = 0:Ts:Tmax; % Time Vector [s]
Ry = zeros(length(t), 1);
Ryd = zeros(length(t), 1);
Rydd = zeros(length(t), 1);
switch args.Ry_type
case 'constant'
Ry(:) = args.Ry_amplitude;
Ryd(:) = 0;
Rydd(:) = 0;
case 'triangular'
Ry_raw = args.Ry_amplitude*sawtooth(2*pi*t/args.Ry_period,1/2);
i0 = find(t>=args.Ry_period/4,1);
Ry(1:end-i0+1) = Ry_raw(i0:end);
Ry(end-i0+2:end) = Ry_raw(end); % we fix the last value
% The signal is filtered out
Ry = lsim(H_lpf, Ry, t);
Ryd = lsim(H_lpf*s, Ry, t);
Rydd = lsim(H_lpf*s^2, Ry, t);
case 'sinusoidal'
Ry(:) = args.Ry_amplitude*sin(2*pi/args.Ry_period*t);
Ryd = args.Ry_amplitude*2*pi/args.Ry_period*cos(2*pi/args.Ry_period*t);
Rydd = -args.Ry_amplitude*(2*pi/args.Ry_period)^2*sin(2*pi/args.Ry_period*t);
otherwise
warning('Ry_type is not set correctly');
end
Ry = struct('time', t, 'signals', struct('values', Ry), 'deriv', Ryd, 'dderiv', Rydd);
%% Spindle - Rz
t = 0:Ts:Tmax; % Time Vector [s]
Rz = zeros(length(t), 1);
Rzd = zeros(length(t), 1);
Rzdd = zeros(length(t), 1);
switch args.Rz_type
case 'constant'
Rz(:) = args.Rz_amplitude;
Rzd(:) = 0;
Rzdd(:) = 0;
case 'rotating-not-filtered'
Rz(:) = 2*pi/args.Rz_period*t;
% The signal is filtered out
Rz(:) = 2*pi/args.Rz_period*t;
Rzd(:) = 2*pi/args.Rz_period;
Rzdd(:) = 0;
% We add the angle offset
Rz = Rz + args.Rz_amplitude;
case 'rotating'
Rz(:) = 2*pi/args.Rz_period*t;
% The signal is filtered out
Rz = lsim(H_lpf, Rz, t);
Rzd = lsim(H_lpf*s, Rz, t);
Rzdd = lsim(H_lpf*s^2, Rz, t);
% We add the angle offset
Rz = Rz + args.Rz_amplitude;
otherwise
warning('Rz_type is not set correctly');
end
Rz = struct('time', t, 'signals', struct('values', Rz), 'deriv', Rzd, 'dderiv', Rzdd);
%% Micro-Hexapod
t = [0, Ts];
Dh = zeros(length(t), 6);
Dhl = zeros(length(t), 6);
switch args.Dh_type
case 'constant'
Dh = [args.Dh_pos, args.Dh_pos];
load('nass_model_stages.mat', 'micro_hexapod');
AP = [args.Dh_pos(1) ; args.Dh_pos(2) ; args.Dh_pos(3)];
tx = args.Dh_pos(4);
ty = args.Dh_pos(5);
tz = args.Dh_pos(6);
ARB = [cos(tz) -sin(tz) 0;
sin(tz) cos(tz) 0;
0 0 1]*...
[ cos(ty) 0 sin(ty);
0 1 0;
-sin(ty) 0 cos(ty)]*...
[1 0 0;
0 cos(tx) -sin(tx);
0 sin(tx) cos(tx)];
[~, Dhl] = inverseKinematics(micro_hexapod, 'AP', AP, 'ARB', ARB);
Dhl = [Dhl, Dhl];
otherwise
warning('Dh_type is not set correctly');
end
Dh = struct('time', t, 'signals', struct('values', Dh));
Dhl = struct('time', t, 'signals', struct('values', Dhl));
if exist('./mat', 'dir')
if exist('./mat/nass_model_references.mat', 'file')
save('mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts', '-append');
else
save('mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_references.mat', 'file')
save('matlab/mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts', '-append');
else
save('matlab/mat/nass_model_references.mat', 'Dy', 'Ry', 'Rz', 'Dh', 'Dhl', 'args', 'Ts');
end
end

57
matlab/src/initializeRy.m Normal file
View File

@ -0,0 +1,57 @@
function [ry] = initializeRy(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
args.Ry_init (1,1) double {mustBeNumeric} = 0
end
ry = struct();
switch args.type
case 'none'
ry.type = 0;
case 'rigid'
ry.type = 1;
case 'flexible'
ry.type = 2;
end
% Ry - Guide for the tilt stage
ry.guide.density = 7800; % [kg/m3]
ry.guide.STEP = 'Tilt_Guide.STEP';
% Ry - Rotor of the motor
ry.rotor.density = 2400; % [kg/m3]
ry.rotor.STEP = 'Tilt_Motor_Axis.STEP';
% Ry - Motor
ry.motor.density = 3200; % [kg/m3]
ry.motor.STEP = 'Tilt_Motor.STEP';
% Ry - Plateau Tilt
ry.stage.density = 7800; % [kg/m3]
ry.stage.STEP = 'Tilt_Stage.STEP';
% Z-Offset so that the center of rotation matches the sample center;
ry.z_offset = 0.58178; % [m]
ry.Ry_init = args.Ry_init; % [rad]
ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8];
ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4];
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'ry', '-append');
else
save('mat/nass_model_stages.mat', 'ry');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'ry', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'ry');
end
end
end

47
matlab/src/initializeRz.m Normal file
View File

@ -0,0 +1,47 @@
function [rz] = initializeRz(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
end
rz = struct();
switch args.type
case 'none'
rz.type = 0;
case 'rigid'
rz.type = 1;
case 'flexible'
rz.type = 2;
end
% Spindle - Slip Ring
rz.slipring.density = 7800; % [kg/m3]
rz.slipring.STEP = 'Spindle_Slip_Ring.STEP';
% Spindle - Rotor
rz.rotor.density = 7800; % [kg/m3]
rz.rotor.STEP = 'Spindle_Rotor.STEP';
% Spindle - Stator
rz.stator.density = 7800; % [kg/m3]
rz.stator.STEP = 'Spindle_Stator.STEP';
rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7];
rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4];
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'rz', '-append');
else
save('mat/nass_model_stages.mat', 'rz');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'rz', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'rz');
end
end
end

View File

@ -0,0 +1,38 @@
function [sample] = initializeSample(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'cylindrical'})} = 'none'
args.H (1,1) double {mustBeNumeric, mustBePositive} = 250e-3 % Height [m]
args.R (1,1) double {mustBeNumeric, mustBePositive} = 110e-3 % Radius [m]
args.m (1,1) double {mustBeNumeric, mustBePositive} = 1 % Mass [kg]
end
sample = struct();
switch args.type
case 'none'
sample.type = 0;
sample.m = 0;
case 'cylindrical'
sample.type = 1;
sample.H = args.H;
sample.R = args.R;
sample.m = args.m;
end
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'sample', '-append');
else
save('mat/nass_model_stages.mat', 'sample');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'sample', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'sample');
end
end
end

View File

@ -0,0 +1,91 @@
function [nano_hexapod] = initializeSimplifiedNanoHexapod(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'stewart'})} = 'stewart'
end
stewart = initializeStewartPlatform();
switch args.type
case 'none'
stewart.type = 0;
case 'stewart'
stewart.type = 1;
end
stewart = initializeFramesPositions(stewart, ...
'H', 95e-3, ...
'MO_B', 150e-3);
stewart = generateGeneralConfiguration(stewart, ...
'FH', 15e-3, ...
'FR', 120e-3, ...
'FTh', [220, 320, 340, 80, 100, 200]*(pi/180), ...
'MH', 15e-3, ...
'MR', 110e-3, ...
'MTh', [255, 285, 15, 45, 135, 165]*(pi/180));
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, ...
'type', 'apa300ml', ...
'k', 0.3e6, ...
'ke', 4.3e6, ...
'ka', 2.15e6, ...
'c', 18, ...
'ce', 0.7, ...
'ca', 0.35, ...
'ga', -2.7, ...
'gs', 0.53e6);
stewart = initializeJointDynamics(stewart, ...
'type_M', '4dof', ...
'type_F', '2dof_axial', ...
'Kf_M', 4.83, ...
'Cf_M', 1e-2, ...
'Kt_M', 260, ...
'Ct_M', 1e-2, ...
'Ka_M', 94e6, ...
'Ca_M', 1e-2, ...
'Kf_F', 4.83, ...
'Cf_F', 1e-2, ...
'Ka_F', 94e6, ...
'Ca_F', 1e-2);
stewart = initializeCylindricalPlatforms(stewart, ...
'Fpm', 5, ...
'Fph', 10e-3, ...
'Fpr', 150e-3, ...
'Mpm', 5, ...
'Mph', 10e-3, ...
'Mpr', 150e-3);
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', 1e-3, ...
'Fsh', 60e-3, ...
'Fsr', 5e-3, ...
'Msm', 1e-3, ...
'Msh', 60e-3, ...
'Msr', 5e-3);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart, ...
'AP', zeros(3,1), ...
'ARB', eye(3));
nano_hexapod = stewart;
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'nano_hexapod', '-append');
else
save('mat/nass_model_stages.mat', 'nano_hexapod');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'nano_hexapod', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'nano_hexapod');
end
end
end

View File

@ -0,0 +1,27 @@
function [] = initializeSimscapeConfiguration(args)
arguments
args.gravity logical {mustBeNumericOrLogical} = true
end
conf_simscape = struct();
if args.gravity
conf_simscape.type = 1;
else
conf_simscape.type = 2;
end
if exist('./mat', 'dir')
if exist('./mat/nass_model_conf_simscape.mat', 'file')
save('mat/nass_model_conf_simscape.mat', 'conf_simscape', '-append');
else
save('mat/nass_model_conf_simscape.mat', 'conf_simscape');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_conf_simscape.mat', 'file')
save('matlab/mat/nass_model_conf_simscape.mat', 'conf_simscape', '-append');
else
save('matlab/mat/nass_model_conf_simscape.mat', 'conf_simscape');
end
end

View File

@ -0,0 +1,33 @@
function [stewart] = initializeStewartPlatform()
% initializeStewartPlatform - Initialize the stewart structure
%
% Syntax: [stewart] = initializeStewartPlatform(args)
%
% Outputs:
% - stewart - A structure with the following sub-structures:
% - platform_F -
% - platform_M -
% - joints_F -
% - joints_M -
% - struts_F -
% - struts_M -
% - actuators -
% - geometry -
% - properties -
stewart = struct();
stewart.platform_F = struct();
stewart.platform_M = struct();
stewart.joints_F = struct();
stewart.joints_M = struct();
stewart.struts_F = struct();
stewart.struts_M = struct();
stewart.actuators = struct();
stewart.sensors = struct();
stewart.sensors.inertial = struct();
stewart.sensors.force = struct();
stewart.sensors.relative = struct();
stewart.geometry = struct();
stewart.kinematics = struct();
end

View File

@ -0,0 +1,29 @@
function [stewart] = initializeStewartPose(stewart, args)
% initializeStewartPose - Determine the initial stroke in each leg to have the wanted pose
% It uses the inverse kinematic
%
% Syntax: [stewart] = initializeStewartPose(stewart, args)
%
% Inputs:
% - stewart - A structure with the following fields
% - Aa [3x6] - The positions ai expressed in {A}
% - Bb [3x6] - The positions bi expressed in {B}
% - args - Can have the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - actuators.Leq [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
end
[Li, dLi] = inverseKinematics(stewart, 'AP', args.AP, 'ARB', args.ARB);
stewart.actuators.Leq = dLi;
end

View File

@ -0,0 +1,76 @@
function [stewart] = initializeStrutDynamics(stewart, args)
% initializeStrutDynamics - Add Stiffness and Damping properties of each strut
%
% Syntax: [stewart] = initializeStrutDynamics(args)
%
% Inputs:
% - args - Structure with the following fields:
% - K [6x1] - Stiffness of each strut [N/m]
% - C [6x1] - Damping of each strut [N/(m/s)]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - actuators.type = 1
% - actuators.K [6x1] - Stiffness of each strut [N/m]
% - actuators.C [6x1] - Damping of each strut [N/(m/s)]
arguments
stewart
args.type char {mustBeMember(args.type,{'1dof', '2dof', 'flexible', 'apa300ml'})} = '1dof'
args.k (1,1) double {mustBeNumeric, mustBeNonnegative} = 20e6
args.kp (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.ke (1,1) double {mustBeNumeric, mustBeNonnegative} = 5e6
args.ka (1,1) double {mustBeNumeric, mustBeNonnegative} = 60e6
args.c (1,1) double {mustBeNumeric, mustBeNonnegative} = 2e1
args.cp (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.ce (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e6
args.ca (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
args.ga (1,1) double {mustBeNumeric} = 1
args.gs (1,1) double {mustBeNumeric} = 1
args.F_gain (1,1) double {mustBeNumeric} = 1
args.me (1,1) double {mustBeNumeric} = 0.01
args.ma (1,1) double {mustBeNumeric} = 0.01
end
if strcmp(args.type, '1dof')
stewart.actuators.type = 1;
elseif strcmp(args.type, '2dof')
stewart.actuators.type = 2;
elseif strcmp(args.type, 'flexible')
stewart.actuators.type = 3;
K = readmatrix('APA300ML_flex_mat_K.CSV');
M = readmatrix('APA300ML_flex_mat_M.CSV');
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('APA300ML_flex_out_nodes_3D.txt');
stewart.actuators.M = M;
stewart.actuators.K = K;
stewart.actuators.n_xyz = int_xyz;
stewart.actuators.xi = 0.05;
elseif strcmp(args.type, 'apa300ml')
stewart.actuators.type = 4;
end
stewart.actuators.k = args.k;
stewart.actuators.c = args.c;
% Parallel stiffness
stewart.actuators.kp = args.kp;
stewart.actuators.cp = args.cp;
stewart.actuators.ka = args.ka;
stewart.actuators.ca = args.ca;
stewart.actuators.ke = args.ke;
stewart.actuators.ce = args.ce;
stewart.actuators.ga = args.ga;
stewart.actuators.gs = args.gs;
stewart.actuators.F_gain = args.F_gain;
stewart.actuators.ma = args.ma;
stewart.actuators.me = args.me;
end

71
matlab/src/initializeTy.m Normal file
View File

@ -0,0 +1,71 @@
function [ty] = initializeTy(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible'
end
ty = struct();
switch args.type
case 'none'
ty.type = 0;
case 'rigid'
ty.type = 1;
case 'flexible'
ty.type = 2;
end
% Ty Granite frame
ty.granite_frame.density = 7800; % [kg/m3] => 43kg
ty.granite_frame.STEP = 'Ty_Granite_Frame.STEP';
% Guide Translation Ty
ty.guide.density = 7800; % [kg/m3] => 76kg
ty.guide.STEP = 'Ty_Guide.STEP';
% Ty - Guide_Translation12
ty.guide12.density = 7800; % [kg/m3]
ty.guide12.STEP = 'Ty_Guide_12.STEP';
% Ty - Guide_Translation11
ty.guide11.density = 7800; % [kg/m3]
ty.guide11.STEP = 'Ty_Guide_11.STEP';
% Ty - Guide_Translation22
ty.guide22.density = 7800; % [kg/m3]
ty.guide22.STEP = 'Ty_Guide_22.STEP';
% Ty - Guide_Translation21
ty.guide21.density = 7800; % [kg/m3]
ty.guide21.STEP = 'Ty_Guide_21.STEP';
% Ty - Plateau translation
ty.frame.density = 7800; % [kg/m3]
ty.frame.STEP = 'Ty_Stage.STEP';
% Ty Stator Part
ty.stator.density = 5400; % [kg/m3]
ty.stator.STEP = 'Ty_Motor_Stator.STEP';
% Ty Rotor Part
ty.rotor.density = 5400; % [kg/m3]
ty.rotor.STEP = 'Ty_Motor_Rotor.STEP';
ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad]
ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 1e4]; % [N/(m/s), N*m/(rad/s)]
if exist('./mat', 'dir')
if exist('./mat/nass_model_stages.mat', 'file')
save('mat/nass_model_stages.mat', 'ty', '-append');
else
save('mat/nass_model_stages.mat', 'ty');
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_model_stages.mat', 'file')
save('matlab/mat/nass_model_stages.mat', 'ty', '-append');
else
save('matlab/mat/nass_model_stages.mat', 'ty');
end
end
end

View File

@ -0,0 +1,38 @@
function [Li, dLi] = inverseKinematics(stewart, args)
% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
%
% Syntax: [stewart] = inverseKinematics(stewart)
%
% Inputs:
% - stewart - A structure with the following fields
% - geometry.Aa [3x6] - The positions ai expressed in {A}
% - geometry.Bb [3x6] - The positions bi expressed in {B}
% - geometry.l [6x1] - Length of each strut
% - args - Can have the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
%
% Outputs:
% - Li [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
% - dLi [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
end
assert(isfield(stewart.geometry, 'Aa'), 'stewart.geometry should have attribute Aa')
Aa = stewart.geometry.Aa;
assert(isfield(stewart.geometry, 'Bb'), 'stewart.geometry should have attribute Bb')
Bb = stewart.geometry.Bb;
assert(isfield(stewart.geometry, 'l'), 'stewart.geometry should have attribute l')
l = stewart.geometry.l;
Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
dLi = Li-l;
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

0
nass-instrumentation.bib Normal file
View File

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,8 +1,9 @@
% Created 2024-03-19 Tue 11:13
% Created 2025-02-27 Thu 14:29
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
\input{preamble.tex}
\input{preamble_extra.tex}
\bibliography{nass-instrumentation.bib}
\author{Dehaeze Thomas}
\date{\today}
@ -12,7 +13,7 @@
pdftitle={Nano Active Stabilization System - Instrumentation},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 29.2 (Org mode 9.7)},
pdfcreator={Emacs 29.4 (Org mode 9.6)},
pdflang={English}}
\usepackage{biblatex}
@ -22,22 +23,849 @@
\tableofcontents
\clearpage
The goal is to show that each element in the system has been properly chosen based on certain requirements.
\begin{table}[htbp]
\caption{\label{tab:instrumentation_section_matlab_code}Report sections and corresponding Matlab files}
In order to determine the maximum noise of each instrumentation, a dynamic error budgeting is performed in Section \ref{sec:instrumentation_dynamic_error_budgeting}.
The required instrumentation are then selected based on obtained noise specifications and other requirements summarized in Section \ref{sec:detail_instrumentation_choice}.
The received instrumentation are characterized in Section \ref{sec:detail_instrumentation_characterization}.
\begin{figure}[htbp]
\centering
\begin{tabularx}{0.6\linewidth}{lX}
\includegraphics[scale=1]{figs/detail_instrumentation_plant.png}
\caption{\label{fig:detail_instrumentation_plant}Block diagram of the NASS with considered instrumentation}
\end{figure}
\chapter{Dynamic Error Budgeting}
\label{sec:detail_instrumentation_dynamic_error_budgeting}
\textbf{Goal}: get maximum noise of instrumentation
\textbf{Procedure}:
\begin{itemize}
\item Get closed-loop transfer functions from noises to positioning error (only vertical?)
Need the multi-body model with controllers
Or maybe simplified 1DoF ?
\item Suppose a maximum error ASD.
Suppose flat ASD, bandwidth of \textasciitilde{}200Hz (\textbf{should we really consider 200Hz? and not 10kHz? makes use differences}), maximum RMS of \textasciitilde{}10nmRMS => x nm/sqrt(Hz)
\item Deduce the maximum ASD of the noise sources
\end{itemize}
Have a look at his report: \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/nass-simscape/org/noise\_budgeting.org}{file:\textasciitilde{}/Cloud/work-projects/ID31-NASS/matlab/nass-simscape/org/noise\_budgeting.org}
\section{Closed-Loop transfer functions}
\begin{itemize}
\item Most stringent requirement: vertical vibrations below 15nm RMS
\item Because of system symmetry, only one strut is considered
It is suppose that the vibrations induced by each strut is uncorrelated
combination of 6 actuators with uncorrelated noise => x2.5
\item Therefore, each actuator should induce less than 15/2.5=6nm RMS of vibration in the vertical direction
\end{itemize}
The following noise sources are considered:
\begin{itemize}
\item from noise of the actuator voltage to error
\item from force sensor noise to error
\item from measurement noise to error
\end{itemize}
\section{Estimation of maximum instrumentation noise}
\begin{itemize}
\item Output the maximum instrumentation noise ASD in \texttt{.mat} files (that will be used to compare with the obtained instrumentation)
\end{itemize}
\chapter{Choice of Instrumentation}
\label{sec:detail_instrumentation_choice}
In previous section: noise characteristics.
In this section, other characteristics (range, bandwidth, etc\ldots{})
ADC, DAC, Voltage amplifier, Encoder
\textbf{Model of each instrument} (transfer function + noise source).
In this section, also tell which instrumentation has been bought, and different options.
\section{Piezoelectric Voltage Amplifier}
Low pass Filter
\begin{itemize}
\item Capacitance of the piezoelectric actuator
\item Output impedance of the voltage amplifier
\end{itemize}
Noise: \cite{spengen20_high_voltag_amplif}
Bandwidth: \cite{spengen16_high_voltag_amplif}
A picture of the PD200 amplifier is shown in Figure \ref{fig:amplifier_PD200}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.7\linewidth]{figs/amplifier_PD200.png}
\caption{\label{fig:amplifier_PD200}Picture of the PD200 Voltage Amplifier}
\end{figure}
The specifications as well as the amplifier characteristics as shown in the datasheet are summarized in Table \ref{tab:pd200_characteristics}.
\begin{table}[htbp]
\caption{\label{tab:pd200_characteristics}Characteristics of the PD200 compared with the specifications}
\centering
\begin{tabularx}{0.7\linewidth}{lcc}
\toprule
\textbf{Sections} & \textbf{Matlab File}\\
\textbf{Characteristics} & \textbf{Manual} & \textbf{Specification}\\
\midrule
Section \ref{sec:instrumentation}\_ & \texttt{instrumentation\_1\_.m}\\
Input Voltage Range & +/- 10 [V] & +/- 10 [V]\\
Output Voltage Range & -50/150 [V] & -20/150 [V]\\
Gain & 20 [V/V] & \\
Maximum RMS current & 0.9 [A] & > 50 [mA]\\
Maximum Pulse current & 10 [A] & \\
Slew Rate & 150 [V/us] & \\
Noise (10uF load) & 0.7 [mV RMS] & < 2 [mV rms]\\
Small Signal Bandwidth (10uF load) & 7.4 [kHz] & > 5 [kHz]\\
Large Signal Bandwidth (150V, 10uF) & 300 [Hz] & > 1 [Hz]\\
\bottomrule
\end{tabularx}
\end{table}
\chapter{Digital to Analog converters}
\label{sec:instrumentation_dac}
\chapter{Conclusion}
\label{sec:instrumentation_conclusion}
The most important characteristics are the large (small signal) bandwidth > 5 [kHz] and the small noise (< 2 [mV RMS]).
For a load capacitance of \(10\,\mu F\), the expected \(-3\,dB\) bandwidth is \(6.4\,kHz\) (Figure \ref{fig:pd200_expected_small_signal_bandwidth}) and the low frequency noise is \(650\,\mu V\,\text{rms}\) (Figure \ref{fig:pd200_expected_noise}).
These two characteristics are respectively measured in Section \ref{sec:tf_meas} and Section \ref{sec:noise_meas}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.7\linewidth]{./figs/pd200_expected_small_signal_bandwidth.png}
\caption{\label{fig:pd200_expected_small_signal_bandwidth}Expected small signal bandwidth}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.7\linewidth]{figs/pd200_expected_noise.png}
\caption{\label{fig:pd200_expected_noise}Expected Low frequency noise from 0.03Hz to 20Hz}
\end{figure}
\section{ADC}
Talk about input impedance, \ldots{}
Add resistor, reading of the force sensor: ADC + \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-force-sensor/test-bench-force-sensor.org}{test-bench-force-sensor}
\section{DAC}
ADC and DAC need to be sample synchronously with the control system, with low jitter.
\cite{abramovitch22_pract_method_real_world_contr_system}
\cite{abramovitch23_tutor_real_time_comput_issues_contr_system}
\section{Relative Displacement Sensors}
\begin{itemize}
\item Encoders
\item Capacitive Sensors
\item Eddy current sensors
\item[{$\square$}] Speak about slip-ring issue
\end{itemize}
Specifications:
\begin{itemize}
\item used for relative positioning
\item vertical errors of 15nmRMS => 6nmRMS for each strut
\item Stroke > 100um
\end{itemize}
The Vionic encoder is shown in Figure \ref{fig:encoder_vionic}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.6\linewidth]{figs/encoder_vionic.png}
\caption{\label{fig:encoder_vionic}Picture of the Vionic Encoder}
\end{figure}
From the Renishaw \href{https://www.renishaw.com/en/how-optical-encoders-work--36979}{website}:
\begin{quote}
The VIONiC encoder features the third generation of Renishaw's unique filtering optics that average the contributions from many scale periods and effectively filter out non-periodic features such as dirt.
The nominally square-wave scale pattern is also filtered to leave a pure sinusoidal fringe field at the detector.
Here, a multiple finger structure is employed, fine enough to produce photocurrents in the form of four symmetrically phased signals.
These are combined to remove DC components and produce sine and cosine signal outputs with high spectral purity and low offset while maintaining \textbf{bandwidth to beyond 500 kHz}.
Fully integrated advanced dynamic signal conditioning, Auto Gain , Auto Balance and Auto Offset Controls combine to ensure \textbf{ultra-low Sub-Divisional Error (SDE) of typically} \(<\pm 15\, nm\).
This evolution of filtering optics, combined with carefully-selected electronics, provide incremental signals with wide bandwidth achieving a maximum speed of 12 m/s with the lowest positional jitter (noise) of any encoder in its class.
Interpolation is within the readhead, with fine resolution versions being further augmented by additional noise-reducing electronics to achieve \textbf{jitter of just 1.6 nm RMS}.
\end{quote}
The expected interpolation errors (non-linearity) is shown in Figure \ref{fig:vionic_expected_noise}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=\linewidth]{./figs/vionic_expected_noise.png}
\caption{\label{fig:vionic_expected_noise}Expected interpolation errors for the Vionic Encoder}
\end{figure}
The characteristics as advertise in the manual as well as our specifications are shown in Table \ref{tab:vionic_characteristics}.
\begin{table}[htbp]
\caption{\label{tab:vionic_characteristics}Characteristics of the Vionic compared with the specifications}
\centering
\begin{tabularx}{0.6\linewidth}{lcc}
\toprule
\textbf{Characteristics} & \textbf{Specification} & \textbf{Manual}\\
\midrule
Time Delay & < 0.5 ms & < 10 ns\\
Bandwidth & > 5 kHz & > 500 kHz\\
Noise & < 50 nm rms & < 1.6 nm rms\\
Linearity & & < +/- 15 nm\\
Range & > 200 um & Ruler length\\
\bottomrule
\end{tabularx}
\end{table}
\chapter{Characterization of Instrumentation}
\label{sec:detail_instrumentation_characterization}
For each element, make a table with the specifications, and the measured performances for comparison.
\section{Analog to Digital Converters}
\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org}{Quantization Noise of the ADC}
\paragraph{Quantization Noise}
Let's note:
\begin{itemize}
\item \(q = \frac{\Delta V}{2^n}\) the quantization in [V], which is the corresponding value in [V] of the least significant bit
\item \(\Delta V\) is the full range of the ADC in [V]
\item \(n\) is the number of ADC's bits
\item \(f_s\) is the sample frequency in [Hz]
\end{itemize}
Let's suppose that the ADC is ideal and the only noise comes from the quantization error.
Interestingly, the noise amplitude is uniformly distributed.
The quantization noise can take a value between \(\pm q/2\), and the probability density function is constant in this range (i.e., its a uniform distribution).
Since the integral of the probability density function is equal to one, its value will be \(1/q\) for \(-q/2 < e < q/2\) (Fig. \ref{fig:probability_density_function_adc}).
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/probability_density_function_adc.png}
\caption{\label{fig:probability_density_function_adc}Probability density function \(p(e)\) of the ADC error \(e\)}
\end{figure}
Now, we can calculate the time average power of the quantization noise as
\begin{equation}
P_q = \int_{-q/2}^{q/2} e^2 p(e) de = \frac{q^2}{12}
\end{equation}
The other important parameter of a noise source is the power spectral density (PSD), which indicates how the noise power spreads in different frequency bands.
To find the power spectral density, we need to calculate the Fourier transform of the autocorrelation function of the noise.
Assuming that the noise samples are not correlated with one another, we can approximate the autocorrelation function with a delta function in the time domain.
Since the Fourier transform of a delta function is equal to one, the \textbf{power spectral density will be frequency independent}.
Therefore, the quantization noise is white noise with total power equal to \(P_q = \frac{q^2}{12}\).
Thus, the two-sided PSD (from \(\frac{-f_s}{2}\) to \(\frac{f_s}{2}\)), we should divide the noise power \(P_q\) by \(f_s\):
\begin{equation}
\int_{-f_s/2}^{f_s/2} \Gamma(f) d f = f_s \Gamma = \frac{q^2}{12}
\end{equation}
Finally, the Power Spectral Density of the quantization noise of an ADC is equal to:
\begin{equation}
\begin{aligned}
\Gamma &= \frac{q^2}{12 f_s} \\
&= \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \text{ in } \left[ \frac{V^2}{Hz} \right]
\end{aligned}
\end{equation}
Let's take a 16bits ADC with a range of +/-10V and a sample frequency of 10kHz.
The quantization is:
\[ q = \frac{20}{2^{16}} \approx 0.3\,mV \]
\[ \Gamma_Q = \frac{q^2}{12 f_N} = 7.5 \cdot 10^{-13} \quad [V^2/Hz] \]
ASD:
\[ 0.88\,\mu V/\sqrt{Hz} \]
\paragraph{Speedgoat - IO131 board}
Internally uses the AD7609 ADC from Analog Devices.
200kSPS
16 bits
+/-10V
\textbf{oversampling}: \href{../../../../brain/analog_to_digital_converters.org}{Analog to Digital Converters}
\cite{lab13_improv_adc}
To have additional \(w\) bits of resolution, the oversampling frequency \(f_{os}\) should be:
\begin{equation}
f_{os} = 4^w \cdot f_s
\end{equation}
\cite{hauser91_princ_overs_conver}
\begin{quote}
Key points to consider are:
\begin{itemize}
\item The noise must approximate \textbf{white noise} with uniform power spectral density over the frequency band of interest.
\item The \textbf{noise amplitude must be sufficient} to cause the input signal to change randomly from sample to sample by amounts comparable to at least the distance between two adjacent codes (i.e., 1 LSB).
\item The input signal can be represented as a random variable that has equal probability of existing at any value between two adjacent ADC codes.
\end{itemize}
\end{quote}
\begin{itemize}
\item[{$\boxtimes$}] Check noise and compare with quantization noise
\item[{$\square$}] See is oversampling increase performances, and how much compared to the prediction
Seems to increase the perf too much
\end{itemize}
\paragraph{Measured Noise}
\section{Instrumentation Amplifier}
Because the ADC noise may be too large to measure noise of other instruments, a low noise instrumentation amplifier may be used.
Different instrumentation amplifiers were used:
\begin{itemize}
\item EG\&G 5113, 4nV/sqrt(Hz), gain up to 100000 (100dB)
\item Femto DLPVA-101-B-S 2nV/sqrt(Hz), gain from 20 to 80dB
\item Koheron AMP200, 2.4nV/sqrt(Hz), gain up to 100
\end{itemize}
Here, the Femto amplifier is used.
To measure its noise, the gain is set to xxdB, \ldots{}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/noise_measure_setup_preamp.png}
\caption{\label{fig:noise_measure_setup_preamp}Sources of noise in the experimental setup}
\end{figure}
\section{Digital to Analog Converters}
\paragraph{Noise Measurement}
\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org}{16bits DAC noise measurement}
In order not to have any quantization noise and only measure the output voltage noise of the DAC, we ``ask'' the DAC to output a zero voltage.
The measurement setup is schematically represented in Figure \ref{fig:noise_measure_setup_dac}.
The gain of the pre-amplifier is adjusted such that the measured amplified noise is much larger than the quantization noise of the ADC.
The Amplitude Spectral Density \(\Gamma_n(\omega)\) of the measured signal is computed.
The Amplitude Spectral Density of the DAC output voltage noise \(n_{da}\) can be computed taking into account the gain of the pre-amplifier:
\begin{equation}
\Gamma_{n_{da}}(\omega) = \frac{\Gamma_m(\omega)}{|G_a(\omega)|}
\end{equation}
And it is verified that the Amplitude Spectral Density of \(n_{da}\) is much larger than the one of \(n_a\):
\begin{equation}
\Gamma_{n_{da}} \gg \Gamma_{n_a}
\end{equation}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/noise_measure_setup_dac.png}
\caption{\label{fig:noise_measure_setup_dac}Sources of noise in the experimental setup}
\end{figure}
The obtained Amplitude Spectral Density of the DAC's output voltage is shown in Figure \ref{fig:asd_noise_dac}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/asd_noise_dac.png}
\caption{\label{fig:asd_noise_dac}Amplitude Spectral Density of the measured output voltage noise of the 16bits DAC}
\end{figure}
\paragraph{Bandwidth}
DAC is directly wired to the ADC.
The transfer function from DAC to ADC is computed.
It corresponds to 1 sample delay.
\section{Piezoelectric Voltage Amplifier}
\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-PD200/test-bench-pd200.org}{test-bench-PD200}
\subsection{Noise}
\paragraph{PD200 - Low frequency noise measurement}
The measurement setup is shown in Figure \ref{fig:noise_measure_setup_pd200}.
The input of the PD200 amplifier is shunted with a 50 Ohm resistor such that there in no voltage input expected the PD200 input voltage noise.
The gain of the pre-amplifier is increased in order to measure a signal much larger than the quantization noise of the ADC.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/noise_measure_setup_pd200.png}
\caption{\label{fig:noise_measure_setup_pd200}Sources of noise in the experimental setup}
\end{figure}
The measured low frequency (<20Hz) \textbf{output} noise of one of the PD200 amplifiers is shown in Figure \ref{fig:pd200_noise_time_lpf}.
It is very similar to the one specified in the datasheet in Figure \ref{fig:pd200_expected_noise}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200_noise_time_lpf.png}
\caption{\label{fig:pd200_noise_time_lpf}Measured low frequency noise of the PD200 from 0.01Hz to 20Hz}
\end{figure}
The obtained RMS and peak to peak values of the measured \textbf{output} noise are shown in Table \ref{tab:rms_pkp_noise} and found to be very similar to the specified ones.
\begin{table}[htbp]
\caption{\label{tab:rms_pkp_noise}RMS and Peak to Peak measured low frequency output noise (0.01Hz to 20Hz)}
\centering
\begin{tabularx}{0.5\linewidth}{lcc}
\toprule
& \textbf{RMS [\(\mu V\)]} & \textbf{Peak to Peak [\(mV\)]}\\
\midrule
Specification [\(10\,\mu F\)] & 714.0 & 4.3\\
PD200 1 & 565.1 & 3.7\\
PD200 2 & 767.6 & 3.5\\
PD200 3 & 479.9 & 3.0\\
PD200 4 & 615.7 & 3.5\\
PD200 5 & 651.0 & 2.4\\
PD200 6 & 473.2 & 2.7\\
PD200 7 & 423.1 & 2.3\\
\bottomrule
\end{tabularx}
\end{table}
\paragraph{PD200 - High frequency noise measurement}
The measurement setup is the same as in Figure \ref{fig:noise_measure_setup_pd200}.
The Amplitude Spectral Density \(\Gamma_n(\omega)\) of the measured signal by the ADC is computed.
The Amplitude Spectral Density of the input voltage noise of the PD200 amplifier \(n_p\) is then computed taking into account the gain of the pre-amplifier and the gain of the PD200 amplifier:
\begin{equation}
\Gamma_{n_p}(\omega) = \frac{\Gamma_n(\omega)}{|G_p(j\omega) G_a(j\omega)|}
\end{equation}
And we verify that we are indeed measuring the noise of the PD200 and not the noise of the pre-amplifier by checking that:
\begin{equation}
\Gamma_{n_p}(\omega) |G_p(j\omega)| \ll \Gamma_{n_a}
\end{equation}
The Amplitude Spectral Density of the measured \textbf{input} noise is computed and shown in Figure \ref{fig:asd_noise_pd200_10uF}.
It is verified that the contribution of the PD200 noise is much larger than the contribution of the pre-amplifier noise of the quantization noise.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/asd_noise_pd200_10uF.png}
\caption{\label{fig:asd_noise_pd200_10uF}Amplitude Spectral Density of the measured input voltage noise of the PD200 amplifiers}
\end{figure}
\begin{note}
The Amplitude Spectral Density of the input noise of the PD200 amplifiers present sharp peaks.
It is not clear yet what causes such peaks and if these peaks have high influence on the total RMS noise of the amplifiers.
\end{note}
\subsection{Bandwidth}
\paragraph{Maximum Frequency/Voltage to not overload the amplifier}
\label{sec:tf_meas_w_max}
Then the maximum output current of the amplifier is reached, the amplifier automatically shuts down itself.
We should then make sure that the output current does not reach this maximum specified current.
The maximum current is 1A [rms] which corresponds to 0.7A in amplitude of the sin wave.
The impedance of the capacitance is:
\[ Z_C(\omega) = \frac{1}{jC\omega} \]
Therefore the relation between the output current amplitude and the output voltage amplitude for sinusoidal waves of frequency \(\omega\):
\[ V_{out} = \frac{1}{C\omega} I_{out} \]
Moreover, there is a gain of 20 between the input voltage and the output voltage:
\[ 20 V_{in} = \frac{1}{C\omega} I_{out} \]
For a specified voltage input amplitude \(V_{in}\), the maximum frequency at which the output current reaches its maximum value is:
\begin{equation}
\boxed{\omega_{\text{max}} = \frac{1}{20 C V_{in}} I_{out,\text{max}}}
\end{equation}
with:
\begin{itemize}
\item \(\omega_{\text{max}}\) the maximum input sinusoidal frequency in Radians per seconds
\item \(C\) the load capacitance in Farads
\item \(V_{in}\) the input voltage sinusoidal amplitude in Volts
\item \(I_{out,\text{max}}\) the specified maximum output current in Amperes
\end{itemize}
\(\omega_{\text{max}}/2\pi\) as a function of \(V_{in}\) is shown in Figure \ref{fig:max_frequency_voltage}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/max_frequency_voltage.png}
\caption{\label{fig:max_frequency_voltage}Maximum frequency as a function of the excitation voltage amplitude}
\end{figure}
When doing sweep sine excitation, we make sure not to reach this maximum excitation frequency.
\paragraph{Small Signal Bandwidth}
\label{sec:meas_small_signal_bandwidth}
Here the small signal dynamics of all the 7 PD200 amplifiers are identified.
A (logarithmic) sweep sine excitation voltage is generated by the Speedgoat DAC with an amplitude of 0.1V and a frequency going from 1Hz up to 5kHz.
The output voltage of the PD200 amplifier is measured thanks to the monitor voltage of the PD200 amplifier.
The input voltage of the PD200 amplifier (the generated voltage by the DAC) is measured with another ADC of the Speedgoat.
This way, the time delay related to the ADC will not be apparent in the results.
The obtained transfer functions from \(V_{in}\) to \(V_{out}\) are shown in Figure \ref{fig:pd200_small_signal_tf}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200_small_signal_tf.png}
\caption{\label{fig:pd200_small_signal_tf}Identified dynamics from input voltage to output voltage}
\end{figure}
We can see the very well matching between all the 7 amplifiers.
The amplitude is constant over a wide frequency band and the phase drop is limited to less than 1 degree up to 500Hz.
\paragraph{Model of the amplifier small signal dynamics}
\label{sec:model_small_signal_bandwidth}
The identified dynamics in Figure \ref{fig:pd200_small_signal_tf} can very well be modeled this dynamics with a first order low pass filter (even a constant could work fine).
Below is the defined transfer function \(G_p(s)\).
Comparison of the model with the identified dynamics is shown in Figure \ref{fig:pd200_small_signal_tf_model}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200_small_signal_tf_model.png}
\caption{\label{fig:pd200_small_signal_tf_model}Bode plot of \(G_d(s)\) as well as the identified transfer functions of all 7 amplifiers}
\end{figure}
And finally this model is saved.
\paragraph{Large Signal Bandwidth}
\label{sec:bandwidth_amplitude}
The PD200 amplifiers will most likely not be used for large signals, but it is still nice to see how the amplifier dynamics is changing with the input voltage amplitude.
Several identifications using sweep sin were performed with input voltage amplitude ranging from 0.1V to 4V.
The maximum excitation frequency for each amplitude was limited from the estimation in Section \ref{sec:tf_meas_w_max}.
The obtained transfer functions for the different excitation amplitudes are shown in Figure \ref{fig:pd200_large_signal_tf}.
It is shown that the input voltage amplitude does not affect that much the amplifier dynamics.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200_large_signal_tf.png}
\caption{\label{fig:pd200_large_signal_tf}Amplifier dynamics for several input voltage amplitudes}
\end{figure}
\paragraph{Output Impedance}
The goal of this experimental setup is to estimate the output impedance \(R_\text{out}\) of the PD200 voltage amplifiers.
A DAC with a constant output voltage (here 0.1V) is connected to the input of the PD200 amplifier.
Then, the output voltage of the PD200 amplifier is measured in two conditions:
\begin{itemize}
\item \(V\) when the output is not connected to any load
\item \(V_p\) when a load \(R = 10\,\Omega\) is connected at the output of the amplifier
\end{itemize}
The load and the output impedance form a voltage divider, and thus:
\[ V^\prime = \frac{R}{R + R_\text{out}} V \]
From the two values of voltage, the output impedance of the amplifier can be estimated:
\[ R_\text{out} = R \frac{V - V^\prime}{V^\prime} \]
A schematic of the setup is shown in Figure \ref{fig:setup_output_impedance}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/setup_output_impedance.png}
\caption{\label{fig:setup_output_impedance}Schematic of the setup use to estimate the output impedance of the PD200 amplifier}
\end{figure}
Below are defined the measured output voltages with and without the 10Ohm load:
The output impedance of the amplifier can then be estimated using:
\begin{equation}
R_{\text{out}} = R_{\text{load}} \frac{V - V_p}{V}
\end{equation}
The obtained output impedances are shown in Table \ref{tab:pd200_output_impedance}.
\begin{table}[htbp]
\caption{\label{tab:pd200_output_impedance}Obtained Output Impedance for the PD200 Amplifiers}
\centering
\begin{tabularx}{0.4\linewidth}{Xccc}
\toprule
PD200 & \(V\ [V]\) & \(V_p\ [V]\) & \(R_\text{out}\ [\Omega]\)\\
\midrule
1 & 1.988 & 1.794 & 1.081\\
2 & 1.99 & 1.789 & 1.124\\
3 & 1.982 & 1.795 & 1.042\\
4 & 1.984 & 1.789 & 1.09\\
5 & 1.998 & 1.81 & 1.039\\
6 & 1.984 & 1.799 & 1.028\\
7 & 2.004 & 1.812 & 1.06\\
\bottomrule
\end{tabularx}
\end{table}
The output impedance of the PD200 Amplifier is estimated to be \(\approx 1\,\Omega\).
\subsection{Model}
\paragraph{PD200 Amplifier noise model}
\label{sec:pd200_noise_model}
Let's design a transfer function \(G_n(s)\) whose norm represent the Amplitude Spectral Density of the input voltage noise of the PD200 amplifier as shown in Figure \ref{fig:pd200-model-schematic-normalized-bis}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200-model-schematic-normalized.png}
\caption{\label{fig:pd200-model-schematic-normalized-bis}Model of the voltage amplifier with normalized noise input}
\end{figure}
A simple transfer function that allows to obtain a good fit is defined below.
The comparison between the measured ASD of the modeled ASD is done in Figure \ref{fig:pd200_asd_noise_model}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200_asd_noise_model.png}
\caption{\label{fig:pd200_asd_noise_model}ASD of the measured input voltage noise and modeled noise using \(G_n(s)\)}
\end{figure}
Let's now compute the Cumulative Amplitude Spectrum corresponding to the measurement and the model and compare them.
The integration from low to high frequency and from high to low frequency are both shown in Figure \ref{fig:pd200_cas_noise_model}.
The fit between the model and the measurements is rather good considering the complex shape of the measured ASD and the simple model used.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200_cas_noise_model.png}
\caption{\label{fig:pd200_cas_noise_model}Cumulative Amplitude Spectrum of the measured input voltage noise and modeled noise using \(G_n(s)\)}
\end{figure}
The obtained RMS noise of the model is \texttt{286.74} uV RMS which is not that far from the specifications.
Finally the model of the amplifier noise is saved.
\paragraph{Voltage Amplifier Model}
\label{sec:amplifier_model}
The Amplifier is characterized by its dynamics \(G_p(s)\) from voltage inputs \(V_{in}\) to voltage output \(V_{out}\).
Ideally, the gain from \(V_{in}\) to \(V_{out}\) is constant over a wide frequency band with very small phase drop.
It is also characterized by its \textbf{input} noise \(n\).
The objective is therefore to determine the transfer function \(G_p(s)\) from the input voltage to the output voltage as well as the Power Spectral Density \(S_n(\omega)\) of the amplifier input noise.
As \(G_p\) depends on the load capacitance, it should be measured when loading the amplifier with a \(10\,\mu F\) capacitor.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200-model-schematic.png}
\caption{\label{fig:pd200-model-schematic}Model of the voltage amplifier}
\end{figure}
The input noise of the amplifier \(n\) can be further modeled by shaping a white noise with unitary PSD \(\tilde{n}\) with a transfer function \(G_n(s)\) as shown in Figure \ldots{}
The Amplitude Spectral Density \(\Gamma_n\) is then:
\begin{equation}
\Gamma_n(\omega) = |G_n(j\omega)| \Gamma_{\tilde{n}}(\omega)
\end{equation}
with \(\Gamma_{\tilde{n}}(\omega) = 1\).
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/pd200-model-schematic-normalized.png}
\caption{\label{fig:pd200-model-schematic-normalized}Model of the voltage amplifier with normalized noise input}
\end{figure}
\subsection{Conclusion}
\begin{table}[htbp]
\caption{\label{tab:table_name}Measured characteristics, Manual characterstics and specified ones}
\centering
\begin{tabularx}{\linewidth}{lXXX}
\toprule
\textbf{Characteristics} & \textbf{Measurement} & \textbf{Manual} & \textbf{Specification}\\
\midrule
Input Voltage Range & - & +/- 10 [V] & +/- 10 [V]\\
Output Voltage Range & - & -50/150 [V] & -20/150 [V]\\
Gain & & 20 [V/V] & -\\
Maximum RMS current & & 0.9 [A] & > 50 [mA]\\
Maximum Pulse current & & 10 [A] & -\\
Slew Rate & & 150 [V/us] & -\\
Noise (10uF load) & & 0.7 [mV RMS] & < 2 [mV rms]\\
Small Signal Bandwidth (10uF load) & & 7.4 [kHz] & > 5 [kHz]\\
Large Signal Bandwidth (150V, 10uF) & & 300 [Hz] & -\\
\bottomrule
\end{tabularx}
\end{table}
\section{Noise of the full setup with 16bits DAC}
Let's now measure the noise of the full setup in Figure \ref{fig:noise_meas_procedure_bis} and analyze the results.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/noise_meas_procedure.png}
\caption{\label{fig:noise_meas_procedure_bis}Sources of noise in the experimental setup}
\end{figure}
The Amplitude Spectral Density of the measured noise is computed and the shown in Figure \ref{fig:asd_noise_tot}.
We can very well see that to total measured noise is the sum of the DAC noise and the PD200 noise.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/asd_noise_tot.png}
\caption{\label{fig:asd_noise_tot}Amplitude Spectral Density of the measured noise and of the individual sources of noise}
\end{figure}
\begin{important}
The input noise of the PD200 amplifier is limited by the output voltage noise of the DAC.
Having a DAC with lower output voltage noise could lower the overall noise of the setup.
SSI2V 20bits DACs are used in the next section to verify that.
\end{important}
\section{Linear Encoders}
\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-vionic/test-bench-vionic.org}{test-bench-vionic}
\begin{itemize}
\item Section \ref{sec:noise_bench}: the measurement bench is described
\item Section \ref{sec:thermal_drifts}: long measurement is performed to estimate the low frequency drifts in the measurement
\item Section \ref{sec:vionic_noise_time}: high frequency measurements are performed to estimate the high frequency noise
\item Section \ref{sec:noise_asd}: the Spectral density of the measurement noise is estimated
\item Section \ref{sec:vionic_noise_model}: finally, the measured noise is modeled
\end{itemize}
\subsection{Test Bench}
\label{sec:noise_bench}
To measure the noise \(n\) of the encoder, one can rigidly fix the head and the ruler together such that no motion should be measured.
Then, the measured signal \(y_m\) corresponds to the noise \(n\).
The measurement bench is shown in Figures \ref{fig:meas_bench_top_view} and \ref{fig:meas_bench_side_view}.
Note that the bench is then covered with a ``plastic bubble sheet'' in order to keep disturbances as small as possible.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.8\linewidth]{figs/IMG_20210211_170554.jpg}
\caption{\label{fig:meas_bench_top_view}Top view picture of the measurement bench}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.8\linewidth]{figs/IMG_20210211_170607.jpg}
\caption{\label{fig:meas_bench_side_view}Side view picture of the measurement bench}
\end{figure}
\subsection{Thermal drifts}
\label{sec:thermal_drifts}
Measured displacement were recording during approximately 40 hours with a sample frequency of 100Hz.
A first order low pass filter with a corner frequency of 1Hz
The measured time domain data are shown in Figure \ref{fig:vionic_drifts_time}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_drifts_time.png}
\caption{\label{fig:vionic_drifts_time}Measured thermal drifts}
\end{figure}
The measured data seems to experience a constant drift after approximately 20 hour.
Let's estimate this drift.
\begin{verbatim}
The mean drift is approximately 60.9 [nm/hour] or 1.0 [nm/min]
\end{verbatim}
Comparison between the data and the linear fit is shown in Figure \ref{fig:vionic_drifts_linear_fit}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_drifts_linear_fit.png}
\caption{\label{fig:vionic_drifts_linear_fit}Measured drift and linear fit}
\end{figure}
Let's now estimate the Power Spectral Density of the measured displacement.
The obtained low frequency ASD is shown in Figure \ref{fig:vionic_noise_asd_low_freq}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_asd_low_freq.png}
\caption{\label{fig:vionic_noise_asd_low_freq}Amplitude Spectral density of the measured displacement}
\end{figure}
\subsection{Time Domain signals}
\label{sec:vionic_noise_time}
Then, and for all the 7 encoders, we record the measured motion during 100s with a sampling frequency of 20kHz.
The raw measured data as well as the low pass filtered data (using a first order low pass filter with a cut-off at 10Hz) are shown in Figure \ref{fig:vionic_noise_raw_lpf}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_raw_lpf.png}
\caption{\label{fig:vionic_noise_raw_lpf}Time domain measurement (raw data and low pass filtered data with first order 10Hz LPF)}
\end{figure}
The time domain data for all the encoders are compared in Figure \ref{fig:vionic_noise_time}.
We can see some drifts that are in the order of few nm to 20nm per minute.
As shown in Section \ref{sec:thermal_drifts}, these drifts should diminish over time down to 1nm/min.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_time.png}
\caption{\label{fig:vionic_noise_time}Comparison of the time domain measurement}
\end{figure}
\subsection{Noise Spectral Density}
\label{sec:noise_asd}
The amplitude spectral densities for all the encoder are computed and shown in Figure \ref{fig:vionic_noise_asd}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_asd.png}
\caption{\label{fig:vionic_noise_asd}Amplitude Spectral Density of the measured signal}
\end{figure}
We can combine these measurements with the low frequency noise computed in Section \ref{sec:thermal_drifts}.
The obtained ASD is shown in Figure \ref{fig:vionic_noise_asd_combined}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_asd_combined.png}
\caption{\label{fig:vionic_noise_asd_combined}Combined low frequency and high frequency noise measurements}
\end{figure}
\subsection{Noise Model}
\label{sec:vionic_noise_model}
Let's create a transfer function that approximate the measured noise of the encoder.
The amplitude of the transfer function and the measured ASD are shown in Figure \ref{fig:vionic_noise_asd_model}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_asd_model.png}
\caption{\label{fig:vionic_noise_asd_model}Measured ASD of the noise and modeled one}
\end{figure}
The cumulative amplitude spectrum is now computed and shown in Figure \ref{fig:vionic_noise_cas_model}.
We can see that the Root Mean Square value of the measurement noise is \(\approx 1.6 \, nm\) as advertise in the datasheet.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/vionic_noise_cas_model.png}
\caption{\label{fig:vionic_noise_cas_model}Meassured CAS of the noise and modeled one}
\end{figure}
\subsection{Automatic Gain Control}
\section{External Metrology}
\href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-attocube/test-bench-attocube.org}{test-bench-attocube}
Different options:
\begin{itemize}
\item Attocube: issue of non-linearity estimated from the encoders
\item Smaract
\item QuDIS
\end{itemize}
For the final tests, QuDIS were used.
\chapter*{Conclusion}
\label{sec:detail_instrumentation_conclusion}
\printbibliography[heading=bibintoc,title={Bibliography}]
\end{document}

View File

@ -1,137 +1,16 @@
\usepackage{float}
\usepackage[ %
acronym, % Separate acronyms and glossary
toc, % appear in ToC
automake, % auto-use the makeglossaries command (requires shell-escape)
nonumberlist, % don't back reference pages
nogroupskip, % don't group by letter
nopostdot % don't add a dot at the end of each element
]{glossaries}
\usepackage{caption,tabularx,booktabs}
\usepackage{bm}
\usepackage[stylemods=longextra]{glossaries-extra}
\usepackage{xpatch} % Recommanded for biblatex
\usepackage[ % use biblatex for bibliography
backend=biber, % use biber backend (bibtex replacement) or bibtex
style=ieee, % bib style
hyperref=true, % activate hyperref support
backref=true, % activate backrefs
isbn=false, % don't show isbn tags
url=false, % don't show url tags
doi=false, % don't show doi tags
urldate=long, % display type for dates
maxnames=3, %
minnames=1, %
maxbibnames=5, %
minbibnames=3, %
maxcitenames=2, %
mincitenames=1 %
]{biblatex}
\setabbreviationstyle[acronym]{long-short}
\setglossarystyle{long-name-desc}
\setlength\bibitemsep{1.1\itemsep}
% \renewcommand*{\bibfont}{\footnotesize}
\usepackage{fontawesome}
\usepackage{caption}
\usepackage{subcaption}
\captionsetup[figure]{labelfont=bf}
\captionsetup[subfigure]{labelfont=bf}
\captionsetup[listing]{labelfont=bf}
\captionsetup[table]{labelfont=bf}
\usepackage{xcolor}
\definecolor{my-blue}{HTML}{6b7adb}
\definecolor{my-pale-blue}{HTML}{e6e9f9}
\definecolor{my-red}{HTML}{db6b6b}
\definecolor{my-pale-red}{HTML}{f9e6e6}
\definecolor{my-green}{HTML}{6bdbb6}
\definecolor{my-pale-green}{HTML}{e6f9f3}
\definecolor{my-yellow}{HTML}{dbd26b}
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
\definecolor{my-orange}{HTML}{dba76b}
\definecolor{my-pale-orange}{HTML}{f9f0e6}
\definecolor{my-grey}{HTML}{a3a3a3}
\definecolor{my-pale-grey}{HTML}{f0f0f0}
\definecolor{my-turq}{HTML}{6bc7db}
\definecolor{my-pale-turq}{HTML}{e6f6f9}
\usepackage{inconsolata}
\usepackage[newfloat=true, chapter]{minted}
\usemintedstyle{autumn}
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
\setminted[matlab]{label=Matlab}
\setminted[latex]{label=LaTeX}
\setminted[bash]{label=Bash}
\setminted[python]{label=Python}
\setminted[text]{label=Results}
\setminted[md]{label=Org Mode}
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
\newtcolorbox{my-quote}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
\newtcolorbox{my-verse}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{aside}{%
\marginpar{\BODY}
}
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
\usepackage{soul}
\sethlcolor{my-pale-grey}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
\makeatletter
\preto\Gin@extensions{png,}
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
\preto\Gin@extensions{gif,}
\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png}
\makeatother
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
allcolors = my-blue
}
\usepackage{hypcap}
\makeindex
\makeglossaries

134
preamble_extra.tex Normal file
View File

@ -0,0 +1,134 @@
\usepackage{float}
\usepackage{enumitem}
\usepackage{caption,tabularx,booktabs}
\usepackage{bm}
\usepackage{xpatch} % Recommanded for biblatex
\usepackage[ % use biblatex for bibliography
backend=biber, % use biber backend (bibtex replacement) or bibtex
style=ieee, % bib style
hyperref=true, % activate hyperref support
backref=true, % activate backrefs
isbn=false, % don't show isbn tags
url=false, % don't show url tags
doi=false, % don't show doi tags
urldate=long, % display type for dates
maxnames=3, %
minnames=1, %
maxbibnames=5, %
minbibnames=3, %
maxcitenames=2, %
mincitenames=1 %
]{biblatex}
\setlength\bibitemsep{1.1\itemsep}
\usepackage{caption}
\usepackage{subcaption}
\captionsetup[figure]{labelfont=bf}
\captionsetup[subfigure]{labelfont=bf}
\captionsetup[listing]{labelfont=bf}
\captionsetup[table]{labelfont=bf}
\usepackage{xcolor}
\definecolor{my-blue}{HTML}{6b7adb}
\definecolor{my-pale-blue}{HTML}{e6e9f9}
\definecolor{my-red}{HTML}{db6b6b}
\definecolor{my-pale-red}{HTML}{f9e6e6}
\definecolor{my-green}{HTML}{6bdbb6}
\definecolor{my-pale-green}{HTML}{e6f9f3}
\definecolor{my-yellow}{HTML}{dbd26b}
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
\definecolor{my-orange}{HTML}{dba76b}
\definecolor{my-pale-orange}{HTML}{f9f0e6}
\definecolor{my-grey}{HTML}{a3a3a3}
\definecolor{my-pale-grey}{HTML}{f0f0f0}
\definecolor{my-turq}{HTML}{6bc7db}
\definecolor{my-pale-turq}{HTML}{e6f6f9}
\usepackage{inconsolata}
\usepackage[newfloat=true, chapter]{minted}
\usemintedstyle{autumn}
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
\setminted[matlab]{label=Matlab}
\setminted[latex]{label=LaTeX}
\setminted[bash]{label=Bash}
\setminted[python]{label=Python}
\setminted[text]{label=Results}
\setminted[md]{label=Org Mode}
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
\newtcolorbox{my-quote}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
\newtcolorbox{my-verse}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{aside}{%
\marginpar{\BODY}
}
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
\usepackage{soul}
\sethlcolor{my-pale-grey}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
\makeatletter
\preto\Gin@extensions{png,}
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
\preto\Gin@extensions{gif,}
\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png}
\makeatother
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
allcolors = my-blue
}
\usepackage{hypcap}