Determine maximum noise of instrumentation
Include NASS multi-body model for this analysis
This commit is contained in:
parent
06ec295a68
commit
880e6810ca
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*.pdf binary
|
||||
*.svg binary
|
||||
*.mat binary
|
BIN
figs/detail_instrumentation_plant.pdf
Normal file
BIN
figs/detail_instrumentation_plant.pdf
Normal file
Binary file not shown.
BIN
figs/detail_instrumentation_plant.png
Normal file
BIN
figs/detail_instrumentation_plant.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
336
figs/detail_instrumentation_plant.svg
Normal file
336
figs/detail_instrumentation_plant.svg
Normal 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
1803
matlab/STEPS/APA300ML.STEP
Normal file
File diff suppressed because it is too large
Load Diff
49610
matlab/STEPS/Spindle_Rotor.STEP
Normal file
49610
matlab/STEPS/Spindle_Rotor.STEP
Normal file
File diff suppressed because it is too large
Load Diff
251845
matlab/STEPS/Spindle_Slip_Ring.STEP
Normal file
251845
matlab/STEPS/Spindle_Slip_Ring.STEP
Normal file
File diff suppressed because it is too large
Load Diff
199006
matlab/STEPS/Spindle_Stator.STEP
Normal file
199006
matlab/STEPS/Spindle_Stator.STEP
Normal file
File diff suppressed because one or more lines are too long
12306
matlab/STEPS/Tilt_Guide.STEP
Normal file
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
39764
matlab/STEPS/Tilt_Motor.STEP
Normal file
File diff suppressed because it is too large
Load Diff
16167
matlab/STEPS/Tilt_Motor_Axis.STEP
Normal file
16167
matlab/STEPS/Tilt_Motor_Axis.STEP
Normal file
File diff suppressed because it is too large
Load Diff
79980
matlab/STEPS/Tilt_Stage.STEP
Normal file
79980
matlab/STEPS/Tilt_Stage.STEP
Normal file
File diff suppressed because it is too large
Load Diff
11982
matlab/STEPS/Ty_Granite_Frame.STEP
Normal file
11982
matlab/STEPS/Ty_Granite_Frame.STEP
Normal file
File diff suppressed because it is too large
Load Diff
36208
matlab/STEPS/Ty_Guide.STEP
Normal file
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
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
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
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
17057
matlab/STEPS/Ty_Guide_22.STEP
Normal file
File diff suppressed because it is too large
Load Diff
30385
matlab/STEPS/Ty_Motor_Rotor.STEP
Normal file
30385
matlab/STEPS/Ty_Motor_Rotor.STEP
Normal file
File diff suppressed because it is too large
Load Diff
31879
matlab/STEPS/Ty_Motor_Stator.STEP
Normal file
31879
matlab/STEPS/Ty_Motor_Stator.STEP
Normal file
File diff suppressed because it is too large
Load Diff
77974
matlab/STEPS/Ty_Stage.STEP
Normal file
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
23602
matlab/STEPS/granite.STEP
Normal file
File diff suppressed because it is too large
Load Diff
BIN
matlab/detail_instrumentation_nass.slx
Normal file
BIN
matlab/detail_instrumentation_nass.slx
Normal file
Binary file not shown.
BIN
matlab/mat/nass_model_conf_log.mat
Normal file
BIN
matlab/mat/nass_model_conf_log.mat
Normal file
Binary file not shown.
BIN
matlab/mat/nass_model_conf_simscape.mat
Normal file
BIN
matlab/mat/nass_model_conf_simscape.mat
Normal file
Binary file not shown.
BIN
matlab/mat/nass_model_controller.mat
Normal file
BIN
matlab/mat/nass_model_controller.mat
Normal file
Binary file not shown.
BIN
matlab/mat/nass_model_disturbances.mat
Normal file
BIN
matlab/mat/nass_model_disturbances.mat
Normal file
Binary file not shown.
BIN
matlab/mat/nass_model_references.mat
Normal file
BIN
matlab/mat/nass_model_references.mat
Normal file
Binary file not shown.
BIN
matlab/mat/nass_model_stages.mat
Normal file
BIN
matlab/mat/nass_model_stages.mat
Normal file
Binary file not shown.
37
matlab/src/computeJacobian.m
Normal file
37
matlab/src/computeJacobian.m
Normal 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
|
80
matlab/src/computeJointsPose.m
Normal file
80
matlab/src/computeJointsPose.m
Normal 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
|
77
matlab/src/computeReferencePose.m
Normal file
77
matlab/src/computeReferencePose.m
Normal 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
|
141
matlab/src/describeMicroStationSetup.m
Normal file
141
matlab/src/describeMicroStationSetup.m
Normal 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');
|
80
matlab/src/describeStewartPlatform.m
Normal file
80
matlab/src/describeStewartPlatform.m
Normal 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
|
240
matlab/src/displayArchitecture.m
Normal file
240
matlab/src/displayArchitecture.m
Normal 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
|
41
matlab/src/generateGeneralConfiguration.m
Normal file
41
matlab/src/generateGeneralConfiguration.m
Normal 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
|
45
matlab/src/initializeController.m
Normal file
45
matlab/src/initializeController.m
Normal 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
|
61
matlab/src/initializeCylindricalPlatforms.m
Normal file
61
matlab/src/initializeCylindricalPlatforms.m
Normal 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
|
69
matlab/src/initializeCylindricalStruts.m
Normal file
69
matlab/src/initializeCylindricalStruts.m
Normal 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
|
211
matlab/src/initializeDisturbances.m
Normal file
211
matlab/src/initializeDisturbances.m
Normal 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
|
37
matlab/src/initializeFramesPositions.m
Normal file
37
matlab/src/initializeFramesPositions.m
Normal 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
|
48
matlab/src/initializeGranite.m
Normal file
48
matlab/src/initializeGranite.m
Normal 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
|
35
matlab/src/initializeGround.m
Normal file
35
matlab/src/initializeGround.m
Normal 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
|
48
matlab/src/initializeInertialSensor.m
Normal file
48
matlab/src/initializeInertialSensor.m
Normal 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;
|
136
matlab/src/initializeJointDynamics.m
Normal file
136
matlab/src/initializeJointDynamics.m
Normal 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
|
33
matlab/src/initializeLoggingConfiguration.m
Normal file
33
matlab/src/initializeLoggingConfiguration.m
Normal 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
|
108
matlab/src/initializeMicroHexapod.m
Normal file
108
matlab/src/initializeMicroHexapod.m
Normal 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
|
199
matlab/src/initializeReferences.m
Normal file
199
matlab/src/initializeReferences.m
Normal 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
57
matlab/src/initializeRy.m
Normal 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
47
matlab/src/initializeRz.m
Normal 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
|
38
matlab/src/initializeSample.m
Normal file
38
matlab/src/initializeSample.m
Normal 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
|
91
matlab/src/initializeSimplifiedNanoHexapod.m
Normal file
91
matlab/src/initializeSimplifiedNanoHexapod.m
Normal 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
|
27
matlab/src/initializeSimscapeConfiguration.m
Normal file
27
matlab/src/initializeSimscapeConfiguration.m
Normal 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
|
33
matlab/src/initializeStewartPlatform.m
Normal file
33
matlab/src/initializeStewartPlatform.m
Normal 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
|
29
matlab/src/initializeStewartPose.m
Normal file
29
matlab/src/initializeStewartPose.m
Normal 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
|
76
matlab/src/initializeStrutDynamics.m
Normal file
76
matlab/src/initializeStrutDynamics.m
Normal 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
71
matlab/src/initializeTy.m
Normal 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
|
38
matlab/src/inverseKinematics.m
Normal file
38
matlab/src/inverseKinematics.m
Normal 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
|
BIN
matlab/subsystems/apa300ml_2dof.slx
Normal file
BIN
matlab/subsystems/apa300ml_2dof.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/metrology_6dof.slx
Normal file
BIN
matlab/subsystems/metrology_6dof.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/micro_hexapod_bot_plate.slx
Normal file
BIN
matlab/subsystems/micro_hexapod_bot_plate.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/micro_hexapod_leg.slx
Normal file
BIN
matlab/subsystems/micro_hexapod_leg.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/micro_hexapod_strut.slx
Normal file
BIN
matlab/subsystems/micro_hexapod_strut.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/micro_hexapod_strut_rigid.slx
Normal file
BIN
matlab/subsystems/micro_hexapod_strut_rigid.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/micro_hexapod_top_plate.slx
Normal file
BIN
matlab/subsystems/micro_hexapod_top_plate.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/nano_hexapod_fixed_base.slx
Normal file
BIN
matlab/subsystems/nano_hexapod_fixed_base.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/nano_hexapod_mobile_platform.slx
Normal file
BIN
matlab/subsystems/nano_hexapod_mobile_platform.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/nano_hexapod_simscape.slx
Normal file
BIN
matlab/subsystems/nano_hexapod_simscape.slx
Normal file
Binary file not shown.
BIN
matlab/subsystems/nano_hexapod_strut.slx
Normal file
BIN
matlab/subsystems/nano_hexapod_strut.slx
Normal file
Binary file not shown.
0
nass-instrumentation.bib
Normal file
0
nass-instrumentation.bib
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -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., it’s 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}
|
||||
|
147
preamble.tex
147
preamble.tex
@ -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
134
preamble_extra.tex
Normal 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}
|
Loading…
x
Reference in New Issue
Block a user