mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-27 13:39:33 +00:00
Merge branch 'master' into ros-book
This commit is contained in:
3865
docs/assets/flight/basic_movements_multicopter.svg
Normal file
3865
docs/assets/flight/basic_movements_multicopter.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 408 KiB |
BIN
docs/assets/flight/buzzer.jpg
Normal file
BIN
docs/assets/flight/buzzer.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
docs/assets/flight/buzzer_acb.jpg
Normal file
BIN
docs/assets/flight/buzzer_acb.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
BIN
docs/assets/flight/buzzer_connection.jpg
Normal file
BIN
docs/assets/flight/buzzer_connection.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/assets/flight/controller_arm.jpg
Normal file
BIN
docs/assets/flight/controller_arm.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
569
docs/assets/flight/rc_basic_commands.svg
Normal file
569
docs/assets/flight/rc_basic_commands.svg
Normal file
@@ -0,0 +1,569 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1417.32 680.31" style="enable-background:new 0 0 1417.32 680.31;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#DD0C29;}
|
||||
.st1{fill:#FFFFFF;}
|
||||
.st2{fill:#999998;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st0" d="M1028.08,97.86v-33.6h14.45c3.5,0,6.24,0.91,8.21,2.74c2.02,1.78,3.02,4.13,3.02,7.01
|
||||
c0,2.93-1.01,5.33-3.02,7.2c-1.97,1.87-4.7,2.79-8.21,2.79h-9.17v13.87H1028.08z M1033.36,79.13h8.74c3.98,0,6.34-1.82,6.34-5.04
|
||||
s-2.35-4.99-6.34-4.99h-8.74V79.13z"/>
|
||||
<path class="st0" d="M1059.14,66.8c0-1.87,1.39-3.31,3.26-3.31c1.78,0,3.22,1.44,3.22,3.31c0,1.87-1.44,3.26-3.22,3.26
|
||||
C1060.53,70.06,1059.14,68.67,1059.14,66.8z M1059.81,97.86V74.29h5.18v23.57H1059.81z"/>
|
||||
<path class="st0" d="M1075.27,78.85h-5.04v-4.56h5.04v-6.87h5.19v6.87h7.44v4.56h-7.44v11.09c0,2.69,1.2,3.79,3.7,3.79
|
||||
c1.3,0,2.45-0.29,3.55-0.86v4.46c-1.1,0.77-2.88,1.15-5.23,1.15c-4.42,0-7.2-2.45-7.2-7.06V78.85z"/>
|
||||
<path class="st0" d="M1095.28,94.98c-2.45-2.35-3.7-5.33-3.7-8.98c0-3.6,1.25-6.58,3.7-8.88c2.5-2.3,5.52-3.46,9.07-3.46
|
||||
c2.64,0,5.04,0.53,7.1,1.63v4.46c-2.11-1.01-4.22-1.54-6.34-1.54c-2.35,0-4.32,0.72-5.95,2.21c-1.58,1.49-2.4,3.36-2.4,5.62
|
||||
s0.82,4.18,2.4,5.67c1.63,1.49,3.6,2.21,5.95,2.21c2.5,0,4.75-0.58,6.72-1.78v4.42c-2.26,1.3-4.75,1.92-7.54,1.92
|
||||
C1100.8,98.48,1097.78,97.33,1095.28,94.98z"/>
|
||||
<path class="st0" d="M1123.41,97.86h-5.19v-33.6h5.19v13.15c2.3-2.5,5.18-3.75,8.64-3.75c5.57,0,8.74,3.7,8.74,9.79v14.4h-5.18
|
||||
V84.61c0-2.26-0.53-3.84-1.63-4.75c-1.1-0.91-2.4-1.34-3.89-1.34c-2.64,0-5.33,1.68-6.67,3.84V97.86z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M1270.24,339.94v-33.6h15.31c3.41,0,6.14,0.86,8.11,2.64s2.98,4.08,2.98,6.91c0,4.61-2.69,8.16-7.3,9.27
|
||||
l10.56,14.79h-6.38l-10.13-14.21h-7.87v14.21H1270.24z M1275.52,321.07h9.7c3.84,0,6.1-1.78,6.1-4.99c0-3.07-2.26-4.9-6.1-4.9h-9.7
|
||||
V321.07z"/>
|
||||
<path class="st0" d="M1305.76,336.96c-2.45-2.4-3.65-5.33-3.65-8.83c0-3.46,1.2-6.38,3.65-8.78s5.52-3.6,9.31-3.6
|
||||
c3.74,0,6.82,1.2,9.26,3.6c2.45,2.4,3.65,5.33,3.65,8.78c0,3.46-1.2,6.38-3.65,8.83c-2.45,2.4-5.52,3.6-9.26,3.6
|
||||
C1311.28,340.56,1308.21,339.36,1305.76,336.96z M1320.6,333.75c1.49-1.49,2.21-3.36,2.21-5.62c0-2.21-0.72-4.08-2.21-5.57
|
||||
s-3.31-2.26-5.52-2.26c-2.21,0-4.08,0.77-5.57,2.26c-1.49,1.49-2.21,3.36-2.21,5.57c0,2.26,0.72,4.13,2.21,5.62
|
||||
c1.49,1.49,3.31,2.26,5.57,2.26C1317.28,336,1319.11,335.23,1320.6,333.75z"/>
|
||||
<path class="st0" d="M1333.7,334.37v-28.04h5.19v26.59c0,1.92,0.86,2.88,2.59,2.88c0.72,0,1.39-0.14,1.97-0.48v4.46
|
||||
c-1.01,0.53-2.3,0.77-3.84,0.77C1336.19,340.56,1333.7,338.83,1333.7,334.37z"/>
|
||||
<path class="st0" d="M1348.39,334.37v-28.04h5.18v26.59c0,1.92,0.86,2.88,2.59,2.88c0.72,0,1.39-0.14,1.97-0.48v4.46
|
||||
c-1.01,0.53-2.3,0.77-3.84,0.77C1350.88,340.56,1348.39,338.83,1348.39,334.37z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M87.85,339.94v-15.22l-13.01-18.39h6.14l9.6,13.58l9.6-13.58h5.95l-13.01,18.24v15.36H87.85z"/>
|
||||
<path class="st0" d="M129.03,335.57v3.94c-0.72,0.53-1.73,0.77-3.02,0.77c-2.64,0-4.32-1.1-4.94-3.36
|
||||
c-2.16,2.45-5.04,3.65-8.69,3.65c-2.54,0-4.66-0.72-6.34-2.11c-1.68-1.39-2.5-3.36-2.5-5.81c0-2.5,0.91-4.42,2.74-5.76
|
||||
c1.82-1.39,4.08-2.06,6.72-2.06c2.83,0,5.38,0.62,7.54,1.82v-1.3c0-3.41-2.3-5.14-6.91-5.14c-2.69,0-5.18,0.72-7.44,2.11v-4.56
|
||||
c2.35-1.34,5.18-2.02,8.59-2.02c6.53,0,10.9,3.26,10.9,9.03v8.78c0,1.49,0.82,2.35,1.97,2.35
|
||||
C128.17,335.91,128.6,335.81,129.03,335.57z M120.54,330.38c-1.97-1.1-4.08-1.68-6.29-1.68c-3.46,0-5.52,1.34-5.52,3.65
|
||||
c0,2.5,2.06,3.74,5.09,3.74c2.69,0,5.23-1.25,6.72-2.83V330.38z"/>
|
||||
<path class="st0" d="M139.25,340.13l-8.21-23.76h5.28l5.52,16.03l5.47-16.13h4.27l5.57,16.13l5.47-16.03h5.23l-8.26,23.76h-4.51
|
||||
l-5.71-16.27l-5.66,16.27H139.25z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g id="XMLID_4_">
|
||||
<g>
|
||||
<path d="M666.51,323.52c0,30.75-25.02,55.76-55.77,55.76s-55.76-25.01-55.76-55.76s25.01-55.77,55.76-55.77
|
||||
S666.51,292.77,666.51,323.52z M652.14,342.9v-38.25c0-6.03-4.91-10.93-10.94-10.93h-61.03c-6.04,0-10.94,4.9-10.94,10.93v38.25
|
||||
c0,6.03,4.9,10.94,10.94,10.94h61.03C647.23,353.84,652.14,348.93,652.14,342.9z"/>
|
||||
<path d="M650.78,235.12c1.18,0,2.14,0.96,2.14,2.14c0,1.18-0.96,2.14-2.14,2.14h-7.98c-1.18,0-2.14-0.96-2.14-2.14
|
||||
c0-1.18,0.96-2.14,2.14-2.14H650.78z"/>
|
||||
<path d="M650.78,234.12c1.73,0,3.14,1.41,3.14,3.14c0,0.22-0.02,0.43-0.06,0.63c-0.3,1.43-1.57,2.51-3.08,2.51h-7.98
|
||||
c-1.51,0-2.78-1.08-3.08-2.51c-0.04-0.2-0.06-0.41-0.06-0.63c0-1.73,1.41-3.14,3.14-3.14H650.78z M650.78,239.4
|
||||
c1.18,0,2.14-0.96,2.14-2.14c0-1.18-0.96-2.14-2.14-2.14h-7.98c-1.18,0-2.14,0.96-2.14,2.14c0,1.18,0.96,2.14,2.14,2.14H650.78z"
|
||||
/>
|
||||
<path d="M656.1,236.86c0,5.13-4.18,9.31-9.31,9.31s-9.31-4.18-9.31-9.31c0-5.13,4.18-9.31,9.31-9.31S656.1,231.73,656.1,236.86z
|
||||
M646.79,245.17c4.17,0,7.64-3.09,8.22-7.11c0.06-0.39,0.09-0.79,0.09-1.2c0-4.58-3.73-8.31-8.31-8.31
|
||||
c-4.58,0-8.31,3.73-8.31,8.31c0,0.41,0.03,0.81,0.09,1.2C639.15,242.08,642.62,245.17,646.79,245.17z"/>
|
||||
<path d="M611.32,298.51c13.93,0,25.26,11.34,25.26,25.27c0,13.93-11.33,25.26-25.26,25.26s-25.26-11.33-25.26-25.26
|
||||
C586.06,309.85,597.39,298.51,611.32,298.51z M620.36,323.78c0-4.99-4.06-9.05-9.04-9.05c-4.99,0-9.04,4.06-9.04,9.05
|
||||
c0,4.98,4.05,9.04,9.04,9.04C616.3,332.82,620.36,328.76,620.36,323.78z"/>
|
||||
<path d="M604.46,228.33c1.18,0,2.14,0.96,2.14,2.14c0,1.18-0.96,2.15-2.14,2.15h-7.98c-1.18,0-2.14-0.97-2.14-2.15
|
||||
c0-1.18,0.96-2.14,2.14-2.14H604.46z"/>
|
||||
<path d="M619.36,323.78c0-4.44-3.61-8.05-8.04-8.05c-4.44,0-8.04,3.61-8.04,8.05c0,4.43,3.6,8.04,8.04,8.04
|
||||
C615.75,331.82,619.36,328.21,619.36,323.78z M611.32,314.73c4.98,0,9.04,4.06,9.04,9.05c0,4.98-4.06,9.04-9.04,9.04
|
||||
c-4.99,0-9.04-4.06-9.04-9.04C602.28,318.79,606.33,314.73,611.32,314.73z"/>
|
||||
<path d="M621.85,404.58v-8.91h-26.3v8.91H621.85z M622.85,394.67v10.91h-28.3v-10.91H622.85z"/>
|
||||
<path d="M606.6,230.47c0-1.18-0.96-2.14-2.14-2.14h-7.98c-1.18,0-2.14,0.96-2.14,2.14c0,1.18,0.96,2.15,2.14,2.15h7.98
|
||||
C605.64,232.62,606.6,231.65,606.6,230.47z M604.46,227.33c1.73,0,3.14,1.41,3.14,3.14c0,0.22-0.02,0.43-0.06,0.64
|
||||
c-0.3,1.43-1.57,2.51-3.08,2.51h-7.98c-1.51,0-2.78-1.08-3.08-2.51c-0.04-0.21-0.06-0.42-0.06-0.64c0-1.73,1.41-3.14,3.14-3.14
|
||||
H604.46z"/>
|
||||
<path d="M608.69,231.28c0.06-0.39,0.09-0.8,0.09-1.21c0-4.58-3.73-8.3-8.31-8.3c-4.58,0-8.31,3.72-8.31,8.3
|
||||
c0,0.43,0.03,0.85,0.1,1.26c0.61,3.99,4.06,7.05,8.21,7.05C604.64,238.38,608.1,235.29,608.69,231.28z M609.78,230.07
|
||||
c0,5.14-4.18,9.31-9.31,9.31c-5.13,0-9.31-4.17-9.31-9.31c0-5.13,4.18-9.3,9.31-9.3C605.6,220.77,609.78,224.94,609.78,230.07z"
|
||||
/>
|
||||
<path d="M612.82,509.4v-29.85c0-2.06-1.67-3.73-3.73-3.73h-14.21c-2.06,0-3.74,1.67-3.74,3.73v29.85c0,2.05,1.68,3.73,3.74,3.73
|
||||
h14.21C611.15,513.13,612.82,511.45,612.82,509.4z M613.82,479.55v29.85c0,2.61-2.12,4.73-4.73,4.73h-14.21
|
||||
c-2.61,0-4.74-2.12-4.74-4.73v-29.85c0-2.61,2.13-4.73,4.74-4.73h14.21C611.7,474.82,613.82,476.94,613.82,479.55z"/>
|
||||
<path d="M613.23,452.87l-0.7-1.27h-16.79l-5.09,6.63l0.99,1.61h16.48L613.23,452.87z M613.12,450.6l1.29,2.35l-5.79,7.89h-17.54
|
||||
l-1.65-2.67l5.81-7.57H613.12z"/>
|
||||
<path d="M613.23,429.09l-0.7-1.27h-16.79l-5.09,6.63l0.99,1.61h16.48L613.23,429.09z M613.12,426.82l1.29,2.35l-5.79,7.89h-17.54
|
||||
l-1.65-2.67l5.81-7.57H613.12z"/>
|
||||
<path d="M585.76,112.73l0.99,19.03l-53.35,5.22c-4.6,0.45-9.25,0.34-13.81-0.33l-17.41-2.55l-1.82-21.37H585.76z"/>
|
||||
<path d="M611.32,349.04c13.93,0,25.26-11.33,25.26-25.26c0-13.93-11.33-25.27-25.26-25.27s-25.26,11.34-25.26,25.27
|
||||
C586.06,337.71,597.39,349.04,611.32,349.04z M611.32,297.51c14.48,0,26.26,11.79,26.26,26.27c0,14.48-11.78,26.26-26.26,26.26
|
||||
s-26.26-11.78-26.26-26.26C585.06,309.3,596.84,297.51,611.32,297.51z"/>
|
||||
<path d="M641.2,293.72c6.03,0,10.94,4.9,10.94,10.93v38.25c0,6.03-4.91,10.94-10.94,10.94h-61.03c-6.04,0-10.94-4.91-10.94-10.94
|
||||
v-38.25c0-6.03,4.9-10.93,10.94-10.93H641.2z M651.14,342.9v-38.25c0-5.48-4.46-9.93-9.94-9.93h-29.88h-31.15
|
||||
c-5.48,0-9.94,4.45-9.94,9.93v38.25c0,5.48,4.46,9.94,9.94,9.94h31.15h29.88C646.68,352.84,651.14,348.38,651.14,342.9z"/>
|
||||
<path d="M554.09,323.52c0-31.24,25.42-56.65,56.65-56.65c31.24,0,56.65,25.41,56.65,56.65c0,31.23-25.41,56.65-56.65,56.65
|
||||
C579.51,380.17,554.09,354.75,554.09,323.52z M610.74,267.75c-30.75,0-55.76,25.02-55.76,55.77s25.01,55.76,55.76,55.76
|
||||
s55.77-25.01,55.77-55.76S641.49,267.75,610.74,267.75z"/>
|
||||
<path d="M546.51,323.52c0-35.42,28.82-64.24,64.23-64.24c35.42,0,64.24,28.82,64.24,64.24s-28.82,64.23-64.24,64.23
|
||||
C575.33,387.75,546.51,358.94,546.51,323.52z M610.74,260.28c-34.86,0-63.23,28.37-63.23,63.24c0,34.86,28.37,63.23,63.23,63.23
|
||||
c34.87,0,63.24-28.37,63.24-63.23C673.98,288.65,645.61,260.28,610.74,260.28z"/>
|
||||
<path d="M532.71,345.38v-25.04h-9.19v25.04H532.71z M533.65,319.4v26.92h-11.07V319.4H533.65z"/>
|
||||
<path d="M537.22,203.84c0-6.61-5.38-12-12-12c-6.61,0-11.99,5.39-11.99,12c0,6.62,5.38,12,11.99,12
|
||||
C531.84,215.84,537.22,210.46,537.22,203.84z M525.22,190.9c7.14,0,12.94,5.81,12.94,12.94c0,7.14-5.8,12.94-12.94,12.94
|
||||
c-7.13,0-12.94-5.8-12.94-12.94C512.28,196.71,518.09,190.9,525.22,190.9z"/>
|
||||
<path d="M497.92,365.19v-66.7h-12.74h-12.74v66.7h12.74H497.92z M498.86,297.54v68.6h-13.68h-13.69v-68.6h13.69H498.86z"/>
|
||||
<path d="M468.18,134.1l-17.41,2.55c-4.57,0.67-9.22,0.78-13.81,0.33l-53.35-5.22l0.98-19.03H470L468.18,134.1z"/>
|
||||
<path d="M436.71,319.4h11.07v26.92h-11.07V319.4z M437.65,345.38h9.18v-25.04h-9.18V345.38z"/>
|
||||
<path d="M445.13,191.84c-6.61,0-12,5.39-12,12c0,6.62,5.39,12,12,12c6.62,0,12-5.38,12-12
|
||||
C457.13,197.23,451.75,191.84,445.13,191.84z M432.19,203.84c0-7.13,5.8-12.94,12.94-12.94c7.14,0,12.94,5.81,12.94,12.94
|
||||
c0,7.14-5.8,12.94-12.94,12.94C437.99,216.78,432.19,210.98,432.19,203.84z"/>
|
||||
<path d="M415.38,323.52c0,30.75-25.02,55.76-55.77,55.76s-55.77-25.01-55.77-55.76s25.02-55.77,55.77-55.77
|
||||
S415.38,292.77,415.38,323.52z M401.13,342.9v-38.25c0-6.03-4.91-10.93-10.94-10.93h-61.03c-6.03,0-10.94,4.9-10.94,10.93v38.25
|
||||
c0,6.03,4.91,10.94,10.94,10.94h61.03C396.22,353.84,401.13,348.93,401.13,342.9z"/>
|
||||
<path d="M404.65,511.81h80.53h80.52v-79.59h-80.52h-80.53V511.81z M485.18,512.81h-81.53v-81.59h81.53h81.52v81.59H485.18z"/>
|
||||
<path d="M382.32,109.67c0.36,0,0.7,0.14,0.96,0.41c0.28,0.27,0.41,0.64,0.39,1.03l-4.32,83.59c-0.02,0.28,0.1,0.57,0.3,0.77
|
||||
c0.21,0.2,0.49,0.3,0.78,0.28l19.05-1.47c1.18-0.1,2.33-0.48,3.34-1.12l15.15-9.67c0.43-0.27,0.92-0.44,1.43-0.47l22.45-1.55
|
||||
c0.57-0.04,1.05-0.43,1.19-0.99l0.98-3.65c0.06-0.22,0.25-0.38,0.48-0.39l19.55-0.9c0.92-0.04,1.67-0.76,1.74-1.68l5.53-64.85
|
||||
c0.08-0.93,0.69-1.74,1.57-2.05l12.29-4.43l12.28,4.43c0.88,0.31,1.5,1.12,1.58,2.05l5.52,64.85c0.08,0.92,0.83,1.64,1.75,1.68
|
||||
l19.55,0.9c0.22,0.01,0.42,0.17,0.48,0.39l0.97,3.65c0.15,0.56,0.63,0.95,1.2,0.99l22.45,1.55c0.5,0.03,1,0.2,1.42,0.47
|
||||
l15.16,9.67c1,0.64,2.15,1.02,3.34,1.12l19.04,1.47c0.29,0.02,0.57-0.08,0.78-0.28c0.21-0.2,0.32-0.49,0.3-0.77l-4.32-83.59
|
||||
c-0.02-0.39,0.12-0.76,0.39-1.03c0.27-0.28,0.63-0.42,1.02-0.41l9.53,0.36c0.8,0.03,1.52,0.53,1.82,1.28l11.49,28.41
|
||||
c0.07,0.16,0.12,0.33,0.15,0.49l12.66,57.96c0.14,0.62,0.66,1.1,1.3,1.19l39.52,5.48c1.5,0.21,2.81,1.13,3.53,2.46l20.4,37.99
|
||||
c0.48,0.91,0.74,1.92,0.74,2.95v261.47c0,1.65-0.69,3.26-1.88,4.41l-27.53,26.42c-2.14,2.06-4.96,3.19-7.93,3.19H318.46
|
||||
c-2.97,0-5.79-1.13-7.93-3.19l-27.52-26.42c-1.2-1.15-1.88-2.76-1.88-4.41V248.24c0-1.03,0.25-2.05,0.74-2.95l20.4-37.99
|
||||
c0.71-1.33,2.03-2.25,3.52-2.46l39.53-5.48c0.63-0.09,1.15-0.57,1.29-1.19l12.66-57.96c0.04-0.16,0.09-0.33,0.15-0.49
|
||||
l11.49-28.41c0.3-0.75,1.02-1.25,1.82-1.28l9.53-0.36C382.28,109.67,382.3,109.67,382.32,109.67z M610.74,387.75
|
||||
c35.42,0,64.24-28.81,64.24-64.23s-28.82-64.24-64.24-64.24c-35.41,0-64.23,28.82-64.23,64.24S575.33,387.75,610.74,387.75z
|
||||
M656.1,236.86c0-5.13-4.18-9.31-9.31-9.31s-9.31,4.18-9.31,9.31c0,5.13,4.18,9.31,9.31,9.31S656.1,241.99,656.1,236.86z
|
||||
M622.85,405.58v-10.91h-28.3v10.91H622.85z M614.41,429.17l-1.29-2.35h-17.88l-5.81,7.57l1.65,2.67h17.54L614.41,429.17z
|
||||
M614.41,452.95l-1.29-2.35h-17.88l-5.81,7.57l1.65,2.67h17.54L614.41,452.95z M613.82,509.4v-29.85c0-2.61-2.12-4.73-4.73-4.73
|
||||
h-14.21c-2.61,0-4.74,2.12-4.74,4.73v29.85c0,2.61,2.13,4.73,4.74,4.73h14.21C611.7,514.13,613.82,512.01,613.82,509.4z
|
||||
M609.78,230.07c0-5.13-4.18-9.3-9.31-9.3c-5.13,0-9.31,4.17-9.31,9.3c0,5.14,4.18,9.31,9.31,9.31
|
||||
C605.6,239.38,609.78,235.21,609.78,230.07z M566.7,512.81v-81.59h-81.52h-81.53v81.59h81.53H566.7z M538.16,203.84
|
||||
c0-7.13-5.8-12.94-12.94-12.94c-7.13,0-12.94,5.81-12.94,12.94c0,7.14,5.81,12.94,12.94,12.94
|
||||
C532.36,216.78,538.16,210.98,538.16,203.84z M533.65,346.32V319.4h-11.07v26.92H533.65z M498.86,366.14v-68.6h-13.68h-13.69
|
||||
v68.6h13.69H498.86z M445.13,216.78c7.14,0,12.94-5.8,12.94-12.94c0-7.13-5.8-12.94-12.94-12.94c-7.14,0-12.94,5.81-12.94,12.94
|
||||
C432.19,210.98,437.99,216.78,445.13,216.78z M447.78,346.32V319.4h-11.07v26.92H447.78z M359.61,387.75
|
||||
c35.42,0,64.24-28.81,64.24-64.23s-28.82-64.24-64.24-64.24s-64.24,28.82-64.24,64.24S324.19,387.75,359.61,387.75z
|
||||
M383.29,509.44c0-9.26-7.53-16.79-16.79-16.79s-16.8,7.53-16.8,16.79s7.54,16.8,16.8,16.8S383.29,518.7,383.29,509.44z
|
||||
M379.19,230.07c0-5.13-4.18-9.3-9.31-9.3s-9.3,4.17-9.3,9.3c0,5.14,4.17,9.31,9.3,9.31S379.19,235.21,379.19,230.07z
|
||||
M375.81,405.58v-10.91H347.5v10.91H375.81z M368.37,434.39l-5.81-7.57h-17.88l-1.29,2.35l5.79,7.89h17.54L368.37,434.39z
|
||||
M368.37,458.17l-5.81-7.57h-17.88l-1.29,2.35l5.79,7.89h17.54L368.37,458.17z M332.87,236.86c0-5.13-4.18-9.31-9.31-9.31
|
||||
s-9.3,4.18-9.3,9.31c0,5.13,4.17,9.31,9.3,9.31S332.87,241.99,332.87,236.86z"/>
|
||||
<path d="M373.87,228.33c1.19,0,2.15,0.96,2.15,2.14c0,1.18-0.96,2.15-2.15,2.15h-7.97c-1.18,0-2.15-0.97-2.15-2.15
|
||||
c0-1.18,0.97-2.14,2.15-2.14H373.87z"/>
|
||||
<path d="M366.5,496.51c3.61,0,6.54,2.94,6.54,6.55c0,3.61-2.93,6.55-6.54,6.55c-3.61,0-6.55-2.94-6.55-6.55
|
||||
C359.95,499.45,362.89,496.51,366.5,496.51z"/>
|
||||
<path d="M376.02,230.47c0-1.18-0.96-2.14-2.15-2.14h-7.97c-1.18,0-2.15,0.96-2.15,2.14c0,1.18,0.97,2.15,2.15,2.15h7.97
|
||||
C375.06,232.62,376.02,231.65,376.02,230.47z M377.02,230.47c0,0.22-0.02,0.43-0.06,0.64c-0.3,1.43-1.57,2.51-3.09,2.51h-7.97
|
||||
c-1.52,0-2.79-1.08-3.09-2.51c-0.04-0.21-0.06-0.42-0.06-0.64c0-1.73,1.41-3.14,3.15-3.14h7.97
|
||||
C375.61,227.33,377.02,228.74,377.02,230.47z"/>
|
||||
<path d="M369.88,238.38c4.17,0,7.63-3.09,8.22-7.1c0.06-0.39,0.09-0.8,0.09-1.21c0-4.58-3.73-8.3-8.31-8.3
|
||||
c-4.58,0-8.3,3.72-8.3,8.3c0,0.43,0.03,0.85,0.1,1.26C362.29,235.32,365.73,238.38,369.88,238.38z M369.88,220.77
|
||||
c5.13,0,9.31,4.17,9.31,9.3c0,5.14-4.18,9.31-9.31,9.31s-9.3-4.17-9.3-9.31C360.58,224.94,364.75,220.77,369.88,220.77z"/>
|
||||
<path d="M373.04,503.06c0-3.61-2.93-6.55-6.54-6.55c-3.61,0-6.55,2.94-6.55,6.55c0,3.61,2.94,6.55,6.55,6.55
|
||||
C370.11,509.61,373.04,506.67,373.04,503.06z M366.5,495.51c4.16,0,7.54,3.39,7.54,7.55s-3.38,7.55-7.54,7.55
|
||||
s-7.55-3.39-7.55-7.55S362.34,495.51,366.5,495.51z"/>
|
||||
<path d="M359.04,348.98c4.98,0,9.04-4.06,9.04-9.04c0-4.99-4.06-9.04-9.04-9.04c-4.99,0-9.05,4.05-9.05,9.04
|
||||
C349.99,344.92,354.05,348.98,359.04,348.98z M384.3,323.78c0,13.93-11.33,25.26-25.26,25.26c-13.93,0-25.27-11.33-25.27-25.26
|
||||
c0-13.93,11.34-25.27,25.27-25.27C372.97,298.51,384.3,309.85,384.3,323.78z"/>
|
||||
<path d="M349.7,509.44c0-9.26,7.54-16.79,16.8-16.79s16.79,7.53,16.79,16.79s-7.53,16.8-16.79,16.8S349.7,518.7,349.7,509.44z
|
||||
M366.5,525.24c8.71,0,15.79-7.09,15.79-15.8c0-8.7-7.08-15.79-15.79-15.79s-15.8,7.09-15.8,15.79
|
||||
C350.7,518.15,357.79,525.24,366.5,525.24z"/>
|
||||
<path d="M367.08,339.94c0-4.44-3.61-8.04-8.04-8.04c-4.44,0-8.05,3.6-8.05,8.04c0,4.43,3.61,8.04,8.05,8.04
|
||||
C363.47,347.98,367.08,344.37,367.08,339.94z M368.08,339.94c0,4.98-4.06,9.04-9.04,9.04c-4.99,0-9.05-4.06-9.05-9.04
|
||||
c0-4.99,4.06-9.04,9.05-9.04C364.02,330.9,368.08,334.95,368.08,339.94z"/>
|
||||
<path d="M374.81,404.58v-8.91H348.5v8.91H374.81z M375.81,394.67v10.91H347.5v-10.91H375.81z"/>
|
||||
<path d="M344.58,429.09l5.11,6.97h16.47l1-1.61l-5.09-6.63h-16.8L344.58,429.09z M362.56,426.82l5.81,7.57l-1.65,2.67h-17.54
|
||||
l-5.79-7.89l1.29-2.35H362.56z"/>
|
||||
<path d="M343.39,452.95l1.29-2.35h17.88l5.81,7.57l-1.65,2.67h-17.54L343.39,452.95z M344.58,452.87l5.11,6.97h16.47l1-1.61
|
||||
l-5.09-6.63h-16.8L344.58,452.87z"/>
|
||||
<path d="M359.04,297.51c14.48,0,26.26,11.79,26.26,26.27c0,14.48-11.78,26.26-26.26,26.26c-14.48,0-26.27-11.78-26.27-26.26
|
||||
C332.77,309.3,344.56,297.51,359.04,297.51z M359.04,349.04c13.93,0,25.26-11.33,25.26-25.26c0-13.93-11.33-25.27-25.26-25.27
|
||||
c-13.93,0-25.27,11.34-25.27,25.27C333.77,337.71,345.11,349.04,359.04,349.04z"/>
|
||||
<path d="M327.56,235.12c1.18,0,2.14,0.96,2.14,2.14c0,1.18-0.96,2.14-2.14,2.14h-7.98c-1.18,0-2.15-0.96-2.15-2.14
|
||||
c0-1.18,0.97-2.14,2.15-2.14H327.56z"/>
|
||||
<path d="M329.16,352.84h29.88h31.15c5.48,0,9.94-4.46,9.94-9.94v-38.25c0-5.48-4.46-9.93-9.94-9.93h-31.15h-29.88
|
||||
c-5.48,0-9.94,4.45-9.94,9.93v38.25C319.22,348.38,323.68,352.84,329.16,352.84z M390.19,353.84h-61.03
|
||||
c-6.03,0-10.94-4.91-10.94-10.94v-38.25c0-6.03,4.91-10.93,10.94-10.93h61.03c6.03,0,10.94,4.9,10.94,10.93v38.25
|
||||
C401.13,348.93,396.22,353.84,390.19,353.84z"/>
|
||||
<path d="M330.64,237.89c-0.3,1.43-1.57,2.51-3.08,2.51h-7.98c-1.52,0-2.79-1.08-3.09-2.51c-0.04-0.2-0.06-0.41-0.06-0.63
|
||||
c0-1.73,1.41-3.14,3.15-3.14h7.98c1.73,0,3.14,1.41,3.14,3.14C330.7,237.48,330.68,237.69,330.64,237.89z M327.56,239.4
|
||||
c1.18,0,2.14-0.96,2.14-2.14c0-1.18-0.96-2.14-2.14-2.14h-7.98c-1.18,0-2.15,0.96-2.15,2.14c0,1.18,0.97,2.14,2.15,2.14H327.56z"
|
||||
/>
|
||||
<path d="M323.56,245.17c4.17,0,7.64-3.09,8.22-7.11c0.06-0.39,0.09-0.79,0.09-1.2c0-4.58-3.73-8.31-8.31-8.31s-8.3,3.73-8.3,8.31
|
||||
c0,0.41,0.03,0.81,0.09,1.2C315.93,242.08,319.39,245.17,323.56,245.17z M332.87,236.86c0,5.13-4.18,9.31-9.31,9.31
|
||||
s-9.3-4.18-9.3-9.31c0-5.13,4.17-9.31,9.3-9.31S332.87,231.73,332.87,236.86z"/>
|
||||
<path d="M422.84,323.52c0-34.87-28.36-63.24-63.23-63.24s-63.23,28.37-63.23,63.24c0,34.86,28.36,63.23,63.23,63.23
|
||||
S422.84,358.38,422.84,323.52z M359.61,259.28c35.42,0,64.24,28.82,64.24,64.24s-28.82,64.23-64.24,64.23
|
||||
s-64.24-28.81-64.24-64.23S324.19,259.28,359.61,259.28z"/>
|
||||
<path d="M416.26,323.52c0,31.23-25.41,56.65-56.65,56.65s-56.65-25.42-56.65-56.65c0-31.24,25.41-56.65,56.65-56.65
|
||||
S416.26,292.28,416.26,323.52z M415.38,323.52c0-30.75-25.02-55.77-55.77-55.77s-55.77,25.02-55.77,55.77
|
||||
s25.02,55.76,55.77,55.76S415.38,354.27,415.38,323.52z"/>
|
||||
<path d="M470,112.73h-85.41l-0.98,19.03l53.35,5.22c4.59,0.45,9.24,0.34,13.81-0.33l17.41-2.55L470,112.73z M399.4,193.28
|
||||
c1.02-0.08,2.01-0.41,2.88-0.96l15.15-9.67c0.57-0.37,1.23-0.58,1.9-0.63l22.45-1.55c0.14-0.01,0.26-0.1,0.3-0.24l0.97-3.66
|
||||
c0.17-0.64,0.74-1.1,1.4-1.13l19.55-0.9c0.42-0.02,0.76-0.35,0.8-0.76l3.29-38.65l-17.18,2.51c-2.78,0.41-5.59,0.61-8.4,0.61
|
||||
c-1.89,0-3.77-0.09-5.65-0.27l-53.3-5.22l-3.21,61.99L399.4,193.28z M533.4,136.98l53.35-5.22l-0.99-19.03h-85.4l1.82,21.37
|
||||
l17.41,2.55C524.15,137.32,528.8,137.43,533.4,136.98z M552.92,182.65l15.16,9.67c0.86,0.55,1.86,0.88,2.88,0.96l19.04,1.48
|
||||
l-3.2-62l-53.3,5.22c-1.88,0.18-3.77,0.27-5.65,0.27c-2.81,0-5.63-0.2-8.41-0.61l-17.17-2.51l3.29,38.65
|
||||
c0.03,0.41,0.37,0.74,0.79,0.76l19.55,0.9c0.67,0.03,1.23,0.49,1.4,1.13l0.98,3.66c0.03,0.14,0.15,0.23,0.3,0.24l22.45,1.55
|
||||
C551.7,182.07,552.35,182.28,552.92,182.65z M372.73,110.03c-0.8,0.03-1.52,0.53-1.82,1.28l-11.49,28.41
|
||||
c-0.06,0.16-0.11,0.33-0.15,0.49l-12.66,57.96c-0.14,0.62-0.66,1.1-1.29,1.19l-39.53,5.48c-1.49,0.21-2.81,1.13-3.52,2.46
|
||||
l-20.4,37.99c-0.49,0.9-0.74,1.92-0.74,2.95v261.47c0,1.65,0.68,3.26,1.88,4.41l27.52,26.42c2.14,2.06,4.96,3.19,7.93,3.19
|
||||
h333.43c2.97,0,5.79-1.13,7.93-3.19l27.53-26.42c1.19-1.15,1.88-2.76,1.88-4.41V248.24c0-1.03-0.26-2.04-0.74-2.95l-20.4-37.99
|
||||
c-0.72-1.33-2.03-2.25-3.53-2.46l-39.52-5.48c-0.64-0.09-1.16-0.57-1.3-1.19l-12.66-57.96c-0.03-0.16-0.08-0.33-0.15-0.49
|
||||
l-11.49-28.41c-0.3-0.75-1.02-1.25-1.82-1.28l-9.53-0.36c-0.39-0.01-0.75,0.13-1.02,0.41c-0.27,0.27-0.41,0.64-0.39,1.03
|
||||
L591,194.7c0.02,0.28-0.09,0.57-0.3,0.77c-0.21,0.2-0.49,0.3-0.78,0.28l-19.04-1.47c-1.19-0.1-2.34-0.48-3.34-1.12l-15.16-9.67
|
||||
c-0.42-0.27-0.92-0.44-1.42-0.47l-22.45-1.55c-0.57-0.04-1.05-0.43-1.2-0.99l-0.97-3.65c-0.06-0.22-0.26-0.38-0.48-0.39
|
||||
l-19.55-0.9c-0.92-0.04-1.67-0.76-1.75-1.68l-5.52-64.85c-0.08-0.93-0.7-1.74-1.58-2.05l-12.28-4.43l-12.29,4.43
|
||||
c-0.88,0.31-1.49,1.12-1.57,2.05l-5.53,64.85c-0.07,0.92-0.82,1.64-1.74,1.68l-19.55,0.9c-0.23,0.01-0.42,0.17-0.48,0.39
|
||||
l-0.98,3.65c-0.14,0.56-0.62,0.95-1.19,0.99l-22.45,1.55c-0.51,0.03-1,0.2-1.43,0.47l-15.15,9.67c-1.01,0.64-2.16,1.02-3.34,1.12
|
||||
l-19.05,1.47c-0.29,0.02-0.57-0.08-0.78-0.28c-0.2-0.2-0.32-0.49-0.3-0.77l4.32-83.59c0.02-0.39-0.11-0.76-0.39-1.03
|
||||
c-0.26-0.27-0.6-0.41-0.96-0.41c-0.02,0-0.04,0-0.06,0L372.73,110.03z M369.99,110.93c0.44-1.11,1.51-1.85,2.71-1.9l9.52-0.36
|
||||
c0.66-0.03,1.31,0.23,1.77,0.71c0.47,0.47,0.72,1.12,0.68,1.78l-0.03,0.57h85.44l0.24-2.81c0.11-1.32,0.99-2.45,2.23-2.9
|
||||
l12.63-4.55l12.62,4.55c1.25,0.45,2.12,1.58,2.23,2.9l0.24,2.81h85.44l-0.03-0.57c-0.03-0.66,0.21-1.31,0.68-1.78
|
||||
c0.46-0.48,1.11-0.74,1.77-0.71l9.53,0.36c1.2,0.05,2.26,0.79,2.71,1.9l11.49,28.42c0.08,0.21,0.15,0.43,0.2,0.65l12.66,57.95
|
||||
c0.05,0.22,0.23,0.39,0.45,0.42l39.53,5.48c1.81,0.25,3.4,1.36,4.27,2.97l20.4,38c0.56,1.05,0.86,2.23,0.86,3.42v261.47
|
||||
c0,1.92-0.8,3.8-2.19,5.13l-27.52,26.42c-2.34,2.24-5.4,3.47-8.63,3.47H318.46c-3.23,0-6.29-1.23-8.62-3.47l-27.52-26.42
|
||||
c-1.4-1.33-2.19-3.21-2.19-5.13V248.24c0-1.19,0.29-2.37,0.86-3.42l20.4-38c0.86-1.61,2.46-2.72,4.27-2.97l39.52-5.48
|
||||
c0.22-0.03,0.4-0.2,0.45-0.42L358.29,140c0.05-0.22,0.12-0.44,0.21-0.65L369.99,110.93z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<rect x="486.29" y="240.91" class="st1" width="19.02" height="2.2"/>
|
||||
<rect x="486.29" y="263.95" class="st1" width="19.02" height="2.2"/>
|
||||
<rect x="486.29" y="252.37" class="st1" width="19.02" height="2.2"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st1" d="M471.5,263.91c-5.38,0-9.81-4.1-10.35-9.34h-2.21c0.52,6.47,5.95,11.58,12.55,11.58
|
||||
c6.59,0,12.01-5.1,12.55-11.58h-2.2C481.31,259.81,476.87,263.91,471.5,263.91z"/>
|
||||
<path class="st1" d="M471.5,243.11c5.35,0,9.77,4.06,10.34,9.26h2.21c-0.58-6.42-5.98-11.46-12.54-11.46
|
||||
c-6.55,0-11.95,5.04-12.54,11.46h2.2C461.73,247.17,466.15,243.11,471.5,243.11z"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st1" points="529.24,244.84 529.24,244.84 532.71,240.91 529.77,240.91 521.58,250.2 523.04,251.87 "/>
|
||||
<polygon class="st1" points="520.11,251.86 520.11,251.87 510.45,240.91 507.51,240.91 518.64,253.53 507.51,266.15
|
||||
510.45,266.15 520.11,255.19 520.11,255.19 521.58,253.53 "/>
|
||||
<polygon class="st1" points="521.57,256.86 529.77,266.15 532.71,266.15 523.04,255.19 "/>
|
||||
</g>
|
||||
<path class="st1" d="M439.85,253.47c0-5.74,4.67-10.42,10.42-10.42h6.4v-2.2h-6.52c-6.89,0.08-12.49,5.74-12.49,12.62
|
||||
c0,6.87,5.4,12.41,12.31,12.62h6.75v-2.2h-6.44C444.52,263.89,439.85,259.22,439.85,253.47z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon class="st0" points="373.49,438.57 373.49,396.61 343.95,396.61 343.95,438.57 323.37,438.57 358.72,492.7 394.08,438.57
|
||||
"/>
|
||||
<rect x="343.95" y="376.14" class="st0" width="29.54" height="13.53"/>
|
||||
<rect x="343.95" y="362.44" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st0" points="343.95,208.46 343.95,250.42 373.5,250.42 373.5,208.46 394.08,208.46 358.73,154.33 323.37,208.46
|
||||
"/>
|
||||
|
||||
<rect x="343.95" y="257.36" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 717.4507 528.2437)" class="st0" width="29.54" height="13.53"/>
|
||||
|
||||
<rect x="343.95" y="277.82" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 717.4507 562.4137)" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st0" points="244.2,338.36 286.16,338.36 286.16,308.81 244.2,308.81 244.2,288.23 190.07,323.59 244.2,358.94
|
||||
"/>
|
||||
|
||||
<rect x="285.09" y="316.82" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 623.4445 23.7255)" class="st0" width="29.54" height="13.53"/>
|
||||
|
||||
<rect x="302.17" y="320.2" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 640.5295 6.6405)" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st0" points="473.71,308.82 431.75,308.82 431.75,338.36 473.71,338.36 473.71,358.94 527.84,323.59
|
||||
473.71,288.23 "/>
|
||||
|
||||
<rect x="403.28" y="316.82" transform="matrix(6.123234e-17 -1 1 6.123234e-17 94.4599 741.6376)" class="st0" width="29.54" height="13.53"/>
|
||||
|
||||
<rect x="386.19" y="320.21" transform="matrix(6.123234e-17 -1 1 6.123234e-17 77.3748 724.5526)" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g id="XMLID_5_">
|
||||
<g>
|
||||
<path d="M1163.1,248.24v261.47c0,1.92-0.8,3.8-2.19,5.13l-27.52,26.42c-2.34,2.24-5.4,3.47-8.63,3.47H791.33
|
||||
c-3.23,0-6.29-1.23-8.62-3.47l-27.52-26.42c-1.4-1.33-2.19-3.21-2.19-5.13V248.24c0-1.19,0.29-2.37,0.86-3.42l20.4-38
|
||||
c0.86-1.61,2.46-2.72,4.27-2.97l39.52-5.48c0.22-0.03,0.4-0.2,0.45-0.42L831.16,140c0.05-0.22,0.12-0.44,0.21-0.65l11.49-28.42
|
||||
c0.44-1.11,1.51-1.85,2.71-1.9l9.52-0.36c0.66-0.03,1.31,0.23,1.77,0.71c0.47,0.47,0.72,1.12,0.68,1.78l-0.03,0.57h85.44
|
||||
l0.24-2.81c0.11-1.32,0.99-2.45,2.23-2.9l12.63-4.55l12.62,4.55c1.25,0.45,2.12,1.58,2.23,2.9l0.24,2.81h85.44l-0.03-0.57
|
||||
c-0.03-0.66,0.21-1.31,0.68-1.78c0.46-0.48,1.11-0.74,1.77-0.71l9.53,0.36c1.2,0.05,2.26,0.79,2.71,1.9l11.49,28.42
|
||||
c0.08,0.21,0.15,0.43,0.2,0.65l12.66,57.95c0.05,0.22,0.23,0.39,0.45,0.42l39.53,5.48c1.81,0.25,3.4,1.36,4.27,2.97l20.4,38
|
||||
C1162.8,245.87,1163.1,247.05,1163.1,248.24z M1162.1,509.71V248.24c0-1.03-0.26-2.04-0.74-2.95l-20.4-37.99
|
||||
c-0.72-1.33-2.03-2.25-3.53-2.46l-39.52-5.48c-0.64-0.09-1.16-0.57-1.3-1.19l-12.66-57.96c-0.03-0.16-0.08-0.33-0.15-0.49
|
||||
l-11.49-28.41c-0.3-0.75-1.02-1.25-1.82-1.28l-9.53-0.36c-0.39-0.01-0.75,0.13-1.02,0.41c-0.27,0.27-0.41,0.64-0.39,1.03
|
||||
l4.32,83.59c0.02,0.28-0.09,0.57-0.3,0.77c-0.21,0.2-0.49,0.3-0.78,0.28l-19.04-1.47c-1.19-0.1-2.34-0.48-3.34-1.12l-15.16-9.67
|
||||
c-0.42-0.27-0.92-0.44-1.42-0.47l-22.45-1.55c-0.57-0.04-1.05-0.43-1.2-0.99l-0.97-3.65c-0.06-0.22-0.26-0.38-0.48-0.39
|
||||
l-19.55-0.9c-0.92-0.04-1.67-0.76-1.75-1.68l-5.52-64.85c-0.08-0.93-0.7-1.74-1.58-2.05l-12.28-4.43l-12.29,4.43
|
||||
c-0.88,0.31-1.49,1.12-1.57,2.05l-5.53,64.85c-0.07,0.92-0.82,1.64-1.74,1.68l-19.55,0.9c-0.23,0.01-0.42,0.17-0.48,0.39
|
||||
l-0.98,3.65c-0.14,0.56-0.62,0.95-1.19,0.99l-22.45,1.55c-0.51,0.03-1,0.2-1.43,0.47l-15.15,9.67c-1.01,0.64-2.16,1.02-3.34,1.12
|
||||
l-19.05,1.47c-0.29,0.02-0.57-0.08-0.78-0.28c-0.2-0.2-0.32-0.49-0.3-0.77l4.32-83.59c0.02-0.39-0.11-0.76-0.39-1.03
|
||||
c-0.26-0.27-0.6-0.41-0.96-0.41c-0.02,0-0.04,0-0.06,0l-9.53,0.36c-0.8,0.03-1.52,0.53-1.82,1.28l-11.49,28.41
|
||||
c-0.06,0.16-0.11,0.33-0.15,0.49l-12.66,57.96c-0.14,0.62-0.66,1.1-1.29,1.19l-39.53,5.48c-1.49,0.21-2.81,1.13-3.52,2.46
|
||||
l-20.4,37.99c-0.49,0.9-0.74,1.92-0.74,2.95v261.47c0,1.65,0.68,3.26,1.88,4.41l27.52,26.42c2.14,2.06,4.96,3.19,7.93,3.19
|
||||
h333.43c2.97,0,5.79-1.13,7.93-3.19l27.53-26.42C1161.41,512.97,1162.1,511.36,1162.1,509.71z M1062.87,194.76l-3.2-62
|
||||
l-53.3,5.22c-1.88,0.18-3.77,0.27-5.65,0.27c-2.81,0-5.63-0.2-8.41-0.61l-17.17-2.51l3.29,38.65c0.03,0.41,0.37,0.74,0.79,0.76
|
||||
l19.55,0.9c0.67,0.03,1.23,0.49,1.4,1.13l0.98,3.66c0.03,0.14,0.15,0.23,0.3,0.24l22.45,1.55c0.67,0.05,1.32,0.26,1.89,0.63
|
||||
l15.16,9.67c0.86,0.55,1.86,0.88,2.88,0.96L1062.87,194.76z M1059.62,131.76l-0.99-19.03h-85.4l1.82,21.37l17.41,2.55
|
||||
c4.56,0.67,9.21,0.78,13.81,0.33L1059.62,131.76z M941.05,134.1l1.82-21.37h-85.41l-0.98,19.03l53.35,5.22
|
||||
c4.59,0.45,9.24,0.34,13.81-0.33L941.05,134.1z M937.67,173.78l3.29-38.65l-17.18,2.51c-2.78,0.41-5.59,0.61-8.4,0.61
|
||||
c-1.89,0-3.77-0.09-5.65-0.27l-53.3-5.22l-3.21,61.99l19.05-1.47c1.02-0.08,2.01-0.41,2.88-0.96l15.15-9.67
|
||||
c0.57-0.37,1.23-0.58,1.9-0.63l22.45-1.55c0.14-0.01,0.26-0.1,0.3-0.24l0.97-3.66c0.17-0.64,0.74-1.1,1.4-1.13l19.55-0.9
|
||||
C937.29,174.52,937.63,174.19,937.67,173.78z"/>
|
||||
<path d="M1162.1,248.24v261.47c0,1.65-0.69,3.26-1.88,4.41l-27.53,26.42c-2.14,2.06-4.96,3.19-7.93,3.19H791.33
|
||||
c-2.97,0-5.79-1.13-7.93-3.19l-27.52-26.42c-1.2-1.15-1.88-2.76-1.88-4.41V248.24c0-1.03,0.25-2.05,0.74-2.95l20.4-37.99
|
||||
c0.71-1.33,2.03-2.25,3.52-2.46l39.53-5.48c0.63-0.09,1.15-0.57,1.29-1.19l12.66-57.96c0.04-0.16,0.09-0.33,0.15-0.49
|
||||
l11.49-28.41c0.3-0.75,1.02-1.25,1.82-1.28l9.53-0.36c0.02,0,0.04,0,0.06,0c0.36,0,0.7,0.14,0.96,0.41
|
||||
c0.28,0.27,0.41,0.64,0.39,1.03l-4.32,83.59c-0.02,0.28,0.1,0.57,0.3,0.77c0.21,0.2,0.49,0.3,0.78,0.28l19.05-1.47
|
||||
c1.18-0.1,2.33-0.48,3.34-1.12l15.15-9.67c0.43-0.27,0.92-0.44,1.43-0.47l22.45-1.55c0.57-0.04,1.05-0.43,1.19-0.99l0.98-3.65
|
||||
c0.06-0.22,0.25-0.38,0.48-0.39l19.55-0.9c0.92-0.04,1.67-0.76,1.74-1.68l5.53-64.85c0.08-0.93,0.69-1.74,1.57-2.05l12.29-4.43
|
||||
l12.28,4.43c0.88,0.31,1.5,1.12,1.58,2.05l5.52,64.85c0.08,0.92,0.83,1.64,1.75,1.68l19.55,0.9c0.22,0.01,0.42,0.17,0.48,0.39
|
||||
l0.97,3.65c0.15,0.56,0.63,0.95,1.2,0.99l22.45,1.55c0.5,0.03,1,0.2,1.42,0.47l15.16,9.67c1,0.64,2.15,1.02,3.34,1.12l19.04,1.47
|
||||
c0.29,0.02,0.57-0.08,0.78-0.28c0.21-0.2,0.32-0.49,0.3-0.77l-4.32-83.59c-0.02-0.39,0.12-0.76,0.39-1.03
|
||||
c0.27-0.28,0.63-0.42,1.02-0.41l9.53,0.36c0.8,0.03,1.52,0.53,1.82,1.28l11.49,28.41c0.07,0.16,0.12,0.33,0.15,0.49l12.66,57.96
|
||||
c0.14,0.62,0.66,1.1,1.3,1.19l39.52,5.48c1.5,0.21,2.81,1.13,3.53,2.46l20.4,37.99C1161.84,246.2,1162.1,247.21,1162.1,248.24z
|
||||
M1147.85,323.52c0-35.42-28.82-64.24-64.24-64.24c-35.41,0-64.23,28.82-64.23,64.24s28.82,64.23,64.23,64.23
|
||||
C1119.03,387.75,1147.85,358.94,1147.85,323.52z M1128.97,236.86c0-5.13-4.18-9.31-9.31-9.31s-9.31,4.18-9.31,9.31
|
||||
c0,5.13,4.18,9.31,9.31,9.31S1128.97,241.99,1128.97,236.86z M1095.72,405.58v-10.91h-28.3v10.91H1095.72z M1087.28,429.17
|
||||
l-1.29-2.35h-17.88l-5.81,7.57l1.65,2.67h17.54L1087.28,429.17z M1087.28,452.95l-1.29-2.35h-17.88l-5.81,7.57l1.65,2.67h17.54
|
||||
L1087.28,452.95z M1086.69,509.4v-29.85c0-2.61-2.12-4.73-4.73-4.73h-14.21c-2.61,0-4.74,2.12-4.74,4.73v29.85
|
||||
c0,2.61,2.13,4.73,4.74,4.73h14.21C1084.57,514.13,1086.69,512.01,1086.69,509.4z M1082.65,230.07c0-5.13-4.18-9.3-9.31-9.3
|
||||
c-5.13,0-9.31,4.17-9.31,9.3c0,5.14,4.18,9.31,9.31,9.31C1078.47,239.38,1082.65,235.21,1082.65,230.07z M1039.57,512.81v-81.59
|
||||
h-81.52h-81.53v81.59h81.53H1039.57z M1011.03,203.84c0-7.13-5.8-12.94-12.94-12.94c-7.13,0-12.94,5.81-12.94,12.94
|
||||
c0,7.14,5.81,12.94,12.94,12.94C1005.23,216.78,1011.03,210.98,1011.03,203.84z M1006.52,346.32V319.4h-11.07v26.92H1006.52z
|
||||
M971.73,366.14v-68.6h-13.68h-13.69v68.6h13.69H971.73z M930.94,203.84c0-7.13-5.8-12.94-12.94-12.94
|
||||
c-7.14,0-12.94,5.81-12.94,12.94c0,7.14,5.8,12.94,12.94,12.94C925.14,216.78,930.94,210.98,930.94,203.84z M920.65,346.32V319.4
|
||||
h-11.07v26.92H920.65z M896.72,323.52c0-35.42-28.82-64.24-64.24-64.24c-35.42,0-64.24,28.82-64.24,64.24
|
||||
s28.82,64.23,64.24,64.23C867.9,387.75,896.72,358.94,896.72,323.52z M856.16,509.44c0-9.26-7.53-16.79-16.79-16.79
|
||||
c-9.26,0-16.8,7.53-16.8,16.79s7.54,16.8,16.8,16.8C848.63,526.24,856.16,518.7,856.16,509.44z M852.06,230.07
|
||||
c0-5.13-4.18-9.3-9.31-9.3c-5.13,0-9.3,4.17-9.3,9.3c0,5.14,4.17,9.31,9.3,9.31C847.88,239.38,852.06,235.21,852.06,230.07z
|
||||
M848.68,405.58v-10.91h-28.31v10.91H848.68z M841.24,434.39l-5.81-7.57h-17.88l-1.29,2.35l5.79,7.89h17.54L841.24,434.39z
|
||||
M841.24,458.17l-5.81-7.57h-17.88l-1.29,2.35l5.79,7.89h17.54L841.24,458.17z M805.74,236.86c0-5.13-4.18-9.31-9.31-9.31
|
||||
c-5.13,0-9.3,4.18-9.3,9.31c0,5.13,4.17,9.31,9.3,9.31C801.56,246.17,805.74,241.99,805.74,236.86z"/>
|
||||
<path d="M1083.61,259.28c35.42,0,64.24,28.82,64.24,64.24s-28.82,64.23-64.24,64.23c-35.41,0-64.23-28.81-64.23-64.23
|
||||
S1048.2,259.28,1083.61,259.28z M1146.85,323.52c0-34.87-28.37-63.24-63.24-63.24c-34.86,0-63.23,28.37-63.23,63.24
|
||||
c0,34.86,28.37,63.23,63.23,63.23C1118.48,386.75,1146.85,358.38,1146.85,323.52z"/>
|
||||
<path d="M1126.79,237.26c0,0.22-0.02,0.43-0.06,0.63c-0.3,1.43-1.57,2.51-3.08,2.51h-7.98c-1.51,0-2.78-1.08-3.08-2.51
|
||||
c-0.04-0.2-0.06-0.41-0.06-0.63c0-1.73,1.41-3.14,3.14-3.14h7.98C1125.38,234.12,1126.79,235.53,1126.79,237.26z M1125.79,237.26
|
||||
c0-1.18-0.96-2.14-2.14-2.14h-7.98c-1.18,0-2.14,0.96-2.14,2.14c0,1.18,0.96,2.14,2.14,2.14h7.98
|
||||
C1124.83,239.4,1125.79,238.44,1125.79,237.26z"/>
|
||||
<path d="M1119.66,227.55c5.13,0,9.31,4.18,9.31,9.31c0,5.13-4.18,9.31-9.31,9.31s-9.31-4.18-9.31-9.31
|
||||
C1110.35,231.73,1114.53,227.55,1119.66,227.55z M1127.88,238.06c0.06-0.39,0.09-0.79,0.09-1.2c0-4.58-3.73-8.31-8.31-8.31
|
||||
s-8.31,3.73-8.31,8.31c0,0.41,0.03,0.81,0.09,1.2c0.58,4.02,4.05,7.11,8.22,7.11S1127.3,242.08,1127.88,238.06z"/>
|
||||
<path d="M1123.65,235.12c1.18,0,2.14,0.96,2.14,2.14c0,1.18-0.96,2.14-2.14,2.14h-7.98c-1.18,0-2.14-0.96-2.14-2.14
|
||||
c0-1.18,0.96-2.14,2.14-2.14H1123.65z"/>
|
||||
<path d="M1125.01,304.65v38.25c0,6.03-4.91,10.94-10.94,10.94h-61.03c-6.04,0-10.94-4.91-10.94-10.94v-38.25
|
||||
c0-6.03,4.9-10.93,10.94-10.93h61.03C1120.1,293.72,1125.01,298.62,1125.01,304.65z M1124.01,342.9v-38.25
|
||||
c0-5.48-4.46-9.93-9.94-9.93h-29.88h-31.15c-5.48,0-9.94,4.45-9.94,9.93v38.25c0,5.48,4.46,9.94,9.94,9.94h31.15h29.88
|
||||
C1119.55,352.84,1124.01,348.38,1124.01,342.9z"/>
|
||||
<path d="M1083.61,266.87c31.24,0,56.65,25.41,56.65,56.65c0,31.23-25.41,56.65-56.65,56.65c-31.23,0-56.65-25.42-56.65-56.65
|
||||
C1026.96,292.28,1052.38,266.87,1083.61,266.87z M1139.38,323.52c0-30.75-25.02-55.77-55.77-55.77s-55.76,25.02-55.76,55.77
|
||||
s25.01,55.76,55.76,55.76S1139.38,354.27,1139.38,323.52z"/>
|
||||
<path d="M1083.61,267.75c30.75,0,55.77,25.02,55.77,55.77s-25.02,55.76-55.77,55.76s-55.76-25.01-55.76-55.76
|
||||
S1052.86,267.75,1083.61,267.75z M1125.01,342.9v-38.25c0-6.03-4.91-10.93-10.94-10.93h-61.03c-6.04,0-10.94,4.9-10.94,10.93
|
||||
v38.25c0,6.03,4.9,10.94,10.94,10.94h61.03C1120.1,353.84,1125.01,348.93,1125.01,342.9z"/>
|
||||
<path d="M1084.19,297.51c14.48,0,26.26,11.79,26.26,26.27c0,14.48-11.78,26.26-26.26,26.26s-26.26-11.78-26.26-26.26
|
||||
C1057.93,309.3,1069.71,297.51,1084.19,297.51z M1109.45,323.78c0-13.93-11.33-25.27-25.26-25.27
|
||||
c-13.93,0-25.26,11.34-25.26,25.27c0,13.93,11.33,25.26,25.26,25.26C1098.12,349.04,1109.45,337.71,1109.45,323.78z"/>
|
||||
<path d="M1084.19,298.51c13.93,0,25.26,11.34,25.26,25.27c0,13.93-11.33,25.26-25.26,25.26c-13.93,0-25.26-11.33-25.26-25.26
|
||||
C1058.93,309.85,1070.26,298.51,1084.19,298.51z M1093.23,323.78c0-4.99-4.06-9.05-9.04-9.05c-4.99,0-9.04,4.06-9.04,9.05
|
||||
c0,4.98,4.05,9.04,9.04,9.04C1089.17,332.82,1093.23,328.76,1093.23,323.78z"/>
|
||||
<path d="M1095.72,394.67v10.91h-28.3v-10.91H1095.72z M1094.72,404.58v-8.91h-26.3v8.91H1094.72z"/>
|
||||
<path d="M1084.19,314.73c4.98,0,9.04,4.06,9.04,9.05c0,4.98-4.06,9.04-9.04,9.04c-4.99,0-9.04-4.06-9.04-9.04
|
||||
C1075.15,318.79,1079.2,314.73,1084.19,314.73z M1092.23,323.78c0-4.44-3.61-8.05-8.04-8.05c-4.44,0-8.04,3.61-8.04,8.05
|
||||
c0,4.43,3.6,8.04,8.04,8.04C1088.62,331.82,1092.23,328.21,1092.23,323.78z"/>
|
||||
<path d="M1085.99,426.82l1.29,2.35l-5.79,7.89h-17.54l-1.65-2.67l5.81-7.57H1085.99z M1086.1,429.09l-0.7-1.27h-16.79l-5.09,6.63
|
||||
l0.99,1.61h16.48L1086.1,429.09z"/>
|
||||
<path d="M1085.99,450.6l1.29,2.35l-5.79,7.89h-17.54l-1.65-2.67l5.81-7.57H1085.99z M1086.1,452.87l-0.7-1.27h-16.79l-5.09,6.63
|
||||
l0.99,1.61h16.48L1086.1,452.87z"/>
|
||||
<path d="M1086.69,479.55v29.85c0,2.61-2.12,4.73-4.73,4.73h-14.21c-2.61,0-4.74-2.12-4.74-4.73v-29.85
|
||||
c0-2.61,2.13-4.73,4.74-4.73h14.21C1084.57,474.82,1086.69,476.94,1086.69,479.55z M1085.69,509.4v-29.85
|
||||
c0-2.06-1.67-3.73-3.73-3.73h-14.21c-2.06,0-3.74,1.67-3.74,3.73v29.85c0,2.05,1.68,3.73,3.74,3.73h14.21
|
||||
C1084.02,513.13,1085.69,511.45,1085.69,509.4z"/>
|
||||
<path d="M1080.47,230.47c0,0.22-0.02,0.43-0.06,0.64c-0.3,1.43-1.57,2.51-3.08,2.51h-7.98c-1.51,0-2.78-1.08-3.08-2.51
|
||||
c-0.04-0.21-0.06-0.42-0.06-0.64c0-1.73,1.41-3.14,3.14-3.14h7.98C1079.06,227.33,1080.47,228.74,1080.47,230.47z
|
||||
M1079.47,230.47c0-1.18-0.96-2.14-2.14-2.14h-7.98c-1.18,0-2.14,0.96-2.14,2.14c0,1.18,0.96,2.15,2.14,2.15h7.98
|
||||
C1078.51,232.62,1079.47,231.65,1079.47,230.47z"/>
|
||||
<path d="M1073.34,220.77c5.13,0,9.31,4.17,9.31,9.3c0,5.14-4.18,9.31-9.31,9.31c-5.13,0-9.31-4.17-9.31-9.31
|
||||
C1064.03,224.94,1068.21,220.77,1073.34,220.77z M1081.56,231.28c0.06-0.39,0.09-0.8,0.09-1.21c0-4.58-3.73-8.3-8.31-8.3
|
||||
c-4.58,0-8.31,3.72-8.31,8.3c0,0.43,0.03,0.85,0.1,1.26c0.61,3.99,4.06,7.05,8.21,7.05
|
||||
C1077.51,238.38,1080.97,235.29,1081.56,231.28z"/>
|
||||
<path d="M1077.33,228.33c1.18,0,2.14,0.96,2.14,2.14c0,1.18-0.96,2.15-2.14,2.15h-7.98c-1.18,0-2.14-0.97-2.14-2.15
|
||||
c0-1.18,0.96-2.14,2.14-2.14H1077.33z"/>
|
||||
<path d="M1058.63,112.73l0.99,19.03l-53.35,5.22c-4.6,0.45-9.25,0.34-13.81-0.33l-17.41-2.55l-1.82-21.37H1058.63z"/>
|
||||
<path d="M1039.57,431.22v81.59h-81.52h-81.53v-81.59h81.53H1039.57z M1038.57,511.81v-79.59h-80.52h-80.53v79.59h80.53H1038.57z"
|
||||
/>
|
||||
<path d="M998.09,190.9c7.14,0,12.94,5.81,12.94,12.94c0,7.14-5.8,12.94-12.94,12.94c-7.13,0-12.94-5.8-12.94-12.94
|
||||
C985.15,196.71,990.96,190.9,998.09,190.9z M1010.09,203.84c0-6.61-5.38-12-12-12c-6.61,0-11.99,5.39-11.99,12
|
||||
c0,6.62,5.38,12,11.99,12C1004.71,215.84,1010.09,210.46,1010.09,203.84z"/>
|
||||
<path d="M1006.52,319.4v26.92h-11.07V319.4H1006.52z M1005.58,345.38v-25.04h-9.19v25.04H1005.58z"/>
|
||||
<path d="M971.73,297.54v68.6h-13.68h-13.69v-68.6h13.69H971.73z M970.79,365.19v-66.7h-12.74h-12.74v66.7h12.74H970.79z"/>
|
||||
<path d="M942.87,112.73l-1.82,21.37l-17.41,2.55c-4.57,0.67-9.22,0.78-13.81,0.33l-53.35-5.22l0.98-19.03H942.87z"/>
|
||||
<path d="M918,190.9c7.14,0,12.94,5.81,12.94,12.94c0,7.14-5.8,12.94-12.94,12.94c-7.14,0-12.94-5.8-12.94-12.94
|
||||
C905.06,196.71,910.86,190.9,918,190.9z M930,203.84c0-6.61-5.38-12-12-12c-6.61,0-12,5.39-12,12c0,6.62,5.39,12,12,12
|
||||
C924.62,215.84,930,210.46,930,203.84z"/>
|
||||
<path d="M920.65,319.4v26.92h-11.07V319.4H920.65z M919.7,345.38v-25.04h-9.18v25.04H919.7z"/>
|
||||
<path d="M832.48,259.28c35.42,0,64.24,28.82,64.24,64.24s-28.82,64.23-64.24,64.23c-35.42,0-64.24-28.81-64.24-64.23
|
||||
S797.06,259.28,832.48,259.28z M895.71,323.52c0-34.87-28.36-63.24-63.23-63.24s-63.23,28.37-63.23,63.24
|
||||
c0,34.86,28.36,63.23,63.23,63.23S895.71,358.38,895.71,323.52z"/>
|
||||
<path d="M874,304.65v38.25c0,6.03-4.91,10.94-10.94,10.94h-61.03c-6.03,0-10.94-4.91-10.94-10.94v-38.25
|
||||
c0-6.03,4.91-10.93,10.94-10.93h61.03C869.09,293.72,874,298.62,874,304.65z M873,342.9v-38.25c0-5.48-4.46-9.93-9.94-9.93
|
||||
h-31.15h-29.88c-5.48,0-9.94,4.45-9.94,9.93v38.25c0,5.48,4.46,9.94,9.94,9.94h29.88h31.15C868.54,352.84,873,348.38,873,342.9z"
|
||||
/>
|
||||
<path d="M832.48,266.87c31.24,0,56.65,25.41,56.65,56.65c0,31.23-25.41,56.65-56.65,56.65s-56.65-25.42-56.65-56.65
|
||||
C775.83,292.28,801.24,266.87,832.48,266.87z M888.25,323.52c0-30.75-25.02-55.77-55.77-55.77s-55.77,25.02-55.77,55.77
|
||||
s25.02,55.76,55.77,55.76S888.25,354.27,888.25,323.52z"/>
|
||||
<path d="M832.48,267.75c30.75,0,55.77,25.02,55.77,55.77s-25.02,55.76-55.77,55.76s-55.77-25.01-55.77-55.76
|
||||
S801.73,267.75,832.48,267.75z M874,342.9v-38.25c0-6.03-4.91-10.93-10.94-10.93h-61.03c-6.03,0-10.94,4.9-10.94,10.93v38.25
|
||||
c0,6.03,4.91,10.94,10.94,10.94h61.03C869.09,353.84,874,348.93,874,342.9z"/>
|
||||
<path d="M839.37,492.65c9.26,0,16.79,7.53,16.79,16.79s-7.53,16.8-16.79,16.8c-9.26,0-16.8-7.54-16.8-16.8
|
||||
S830.11,492.65,839.37,492.65z M855.16,509.44c0-8.7-7.08-15.79-15.79-15.79c-8.71,0-15.8,7.09-15.8,15.79
|
||||
c0,8.71,7.09,15.8,15.8,15.8C848.08,525.24,855.16,518.15,855.16,509.44z"/>
|
||||
<path d="M831.91,297.51c14.48,0,26.26,11.79,26.26,26.27c0,14.48-11.78,26.26-26.26,26.26s-26.27-11.78-26.27-26.26
|
||||
C805.64,309.3,817.43,297.51,831.91,297.51z M857.17,323.78c0-13.93-11.33-25.27-25.26-25.27s-25.27,11.34-25.27,25.27
|
||||
c0,13.93,11.34,25.26,25.27,25.26S857.17,337.71,857.17,323.78z"/>
|
||||
<path d="M831.91,298.51c13.93,0,25.26,11.34,25.26,25.27c0,13.93-11.33,25.26-25.26,25.26s-25.27-11.33-25.27-25.26
|
||||
C806.64,309.85,817.98,298.51,831.91,298.51z M840.95,339.94c0-4.99-4.06-9.04-9.04-9.04c-4.99,0-9.05,4.05-9.05,9.04
|
||||
c0,4.98,4.06,9.04,9.05,9.04C836.89,348.98,840.95,344.92,840.95,339.94z"/>
|
||||
<path d="M849.89,230.47c0,0.22-0.02,0.43-0.06,0.64c-0.3,1.43-1.57,2.51-3.09,2.51h-7.97c-1.52,0-2.79-1.08-3.09-2.51
|
||||
c-0.04-0.21-0.06-0.42-0.06-0.64c0-1.73,1.41-3.14,3.15-3.14h7.97C848.48,227.33,849.89,228.74,849.89,230.47z M848.89,230.47
|
||||
c0-1.18-0.96-2.14-2.15-2.14h-7.97c-1.18,0-2.15,0.96-2.15,2.14c0,1.18,0.97,2.15,2.15,2.15h7.97
|
||||
C847.93,232.62,848.89,231.65,848.89,230.47z"/>
|
||||
<path d="M842.75,220.77c5.13,0,9.31,4.17,9.31,9.3c0,5.14-4.18,9.31-9.31,9.31c-5.13,0-9.3-4.17-9.3-9.31
|
||||
C833.45,224.94,837.62,220.77,842.75,220.77z M850.97,231.28c0.06-0.39,0.09-0.8,0.09-1.21c0-4.58-3.73-8.3-8.31-8.3
|
||||
c-4.58,0-8.3,3.72-8.3,8.3c0,0.43,0.03,0.85,0.1,1.26c0.61,3.99,4.05,7.05,8.2,7.05C846.92,238.38,850.38,235.29,850.97,231.28z"
|
||||
/>
|
||||
<path d="M848.68,394.67v10.91h-28.31v-10.91H848.68z M847.68,404.58v-8.91h-26.31v8.91H847.68z"/>
|
||||
<path d="M846.74,228.33c1.19,0,2.15,0.96,2.15,2.14c0,1.18-0.96,2.15-2.15,2.15h-7.97c-1.18,0-2.15-0.97-2.15-2.15
|
||||
c0-1.18,0.97-2.14,2.15-2.14H846.74z"/>
|
||||
<path d="M839.37,495.51c4.16,0,7.54,3.39,7.54,7.55s-3.38,7.55-7.54,7.55c-4.16,0-7.55-3.39-7.55-7.55
|
||||
S835.21,495.51,839.37,495.51z M845.91,503.06c0-3.61-2.93-6.55-6.54-6.55c-3.61,0-6.55,2.94-6.55,6.55
|
||||
c0,3.61,2.94,6.55,6.55,6.55C842.98,509.61,845.91,506.67,845.91,503.06z"/>
|
||||
<path d="M839.37,496.51c3.61,0,6.54,2.94,6.54,6.55c0,3.61-2.93,6.55-6.54,6.55c-3.61,0-6.55-2.94-6.55-6.55
|
||||
C832.82,499.45,835.76,496.51,839.37,496.51z"/>
|
||||
<path d="M835.43,426.82l5.81,7.57l-1.65,2.67h-17.54l-5.79-7.89l1.29-2.35H835.43z M840.03,434.45l-5.09-6.63h-16.8l-0.69,1.27
|
||||
l5.11,6.97h16.47L840.03,434.45z"/>
|
||||
<path d="M835.43,450.6l5.81,7.57l-1.65,2.67h-17.54l-5.79-7.89l1.29-2.35H835.43z M840.03,458.23l-5.09-6.63h-16.8l-0.69,1.27
|
||||
l5.11,6.97h16.47L840.03,458.23z"/>
|
||||
<path d="M831.91,330.9c4.98,0,9.04,4.05,9.04,9.04c0,4.98-4.06,9.04-9.04,9.04c-4.99,0-9.05-4.06-9.05-9.04
|
||||
C822.86,334.95,826.92,330.9,831.91,330.9z M839.95,339.94c0-4.44-3.61-8.04-8.04-8.04c-4.44,0-8.05,3.6-8.05,8.04
|
||||
c0,4.43,3.61,8.04,8.05,8.04C836.34,347.98,839.95,344.37,839.95,339.94z"/>
|
||||
<path d="M803.57,237.26c0,0.22-0.02,0.43-0.06,0.63c-0.3,1.43-1.57,2.51-3.08,2.51h-7.98c-1.52,0-2.79-1.08-3.09-2.51
|
||||
c-0.04-0.2-0.06-0.41-0.06-0.63c0-1.73,1.41-3.14,3.15-3.14h7.98C802.16,234.12,803.57,235.53,803.57,237.26z M802.57,237.26
|
||||
c0-1.18-0.96-2.14-2.14-2.14h-7.98c-1.18,0-2.15,0.96-2.15,2.14c0,1.18,0.97,2.14,2.15,2.14h7.98
|
||||
C801.61,239.4,802.57,238.44,802.57,237.26z"/>
|
||||
<path d="M796.43,227.55c5.13,0,9.31,4.18,9.31,9.31c0,5.13-4.18,9.31-9.31,9.31c-5.13,0-9.3-4.18-9.3-9.31
|
||||
C787.13,231.73,791.3,227.55,796.43,227.55z M804.65,238.06c0.06-0.39,0.09-0.79,0.09-1.2c0-4.58-3.73-8.31-8.31-8.31
|
||||
c-4.58,0-8.3,3.73-8.3,8.31c0,0.41,0.03,0.81,0.09,1.2c0.58,4.02,4.04,7.11,8.21,7.11C800.6,245.17,804.07,242.08,804.65,238.06z
|
||||
"/>
|
||||
<path d="M800.43,235.12c1.18,0,2.14,0.96,2.14,2.14c0,1.18-0.96,2.14-2.14,2.14h-7.98c-1.18,0-2.15-0.96-2.15-2.14
|
||||
c0-1.18,0.97-2.14,2.15-2.14H800.43z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<rect x="959.16" y="240.91" class="st1" width="19.02" height="2.2"/>
|
||||
<rect x="959.16" y="263.95" class="st1" width="19.02" height="2.2"/>
|
||||
<rect x="959.16" y="252.37" class="st1" width="19.02" height="2.2"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st1" d="M944.36,263.91c-5.38,0-9.81-4.1-10.35-9.34h-2.21c0.52,6.47,5.95,11.58,12.55,11.58
|
||||
c6.59,0,12.01-5.1,12.55-11.58h-2.2C954.18,259.81,949.74,263.91,944.36,263.91z"/>
|
||||
<path class="st1" d="M944.36,243.11c5.35,0,9.77,4.06,10.34,9.26h2.21c-0.58-6.42-5.98-11.46-12.54-11.46
|
||||
c-6.55,0-11.95,5.04-12.54,11.46h2.2C934.59,247.17,939.01,243.11,944.36,243.11z"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st1" points="1002.11,244.84 1002.11,244.84 1005.57,240.91 1002.64,240.91 994.44,250.2 995.91,251.87 "/>
|
||||
<polygon class="st1" points="992.98,251.86 992.98,251.87 983.31,240.91 980.38,240.91 991.51,253.53 980.38,266.15
|
||||
983.31,266.15 992.98,255.19 992.98,255.19 994.45,253.53 "/>
|
||||
<polygon class="st1" points="994.44,256.86 1002.64,266.15 1005.57,266.15 995.91,255.19 "/>
|
||||
</g>
|
||||
<path class="st1" d="M912.72,253.47c0-5.74,4.67-10.42,10.42-10.42h6.4v-2.2h-6.52c-6.89,0.08-12.49,5.74-12.49,12.62
|
||||
c0,6.87,5.4,12.41,12.31,12.62h6.75v-2.2h-6.44C917.39,263.89,912.72,259.22,912.72,253.47z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon class="st0" points="1098.73,438.57 1098.73,396.61 1069.18,396.61 1069.18,438.57 1048.6,438.57 1083.95,492.7
|
||||
1119.31,438.57 "/>
|
||||
<rect x="1069.18" y="376.14" class="st0" width="29.54" height="13.53"/>
|
||||
<rect x="1069.18" y="362.44" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st0" points="1069.19,208.46 1069.19,250.42 1098.73,250.42 1098.73,208.46 1119.31,208.46 1083.96,154.33
|
||||
1048.6,208.46 "/>
|
||||
|
||||
<rect x="1069.19" y="257.36" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 2167.9158 528.2437)" class="st0" width="29.54" height="13.53"/>
|
||||
|
||||
<rect x="1069.19" y="277.82" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 2167.9158 562.4137)" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st0" points="969.43,338.36 1011.39,338.36 1011.39,308.81 969.43,308.81 969.43,288.23 915.3,323.59
|
||||
969.43,358.94 "/>
|
||||
|
||||
<rect x="1010.32" y="316.82" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 1348.677 -701.5071)" class="st0" width="29.54" height="13.53"/>
|
||||
|
||||
<rect x="1027.41" y="320.2" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 1365.7621 -718.5921)" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon class="st0" points="1198.94,308.82 1156.98,308.82 1156.98,338.36 1198.94,338.36 1198.94,358.94 1253.07,323.59
|
||||
1198.94,288.23 "/>
|
||||
|
||||
<rect x="1128.51" y="316.82" transform="matrix(6.123234e-17 -1 1 6.123234e-17 819.6924 1466.8701)" class="st0" width="29.54" height="13.53"/>
|
||||
|
||||
<rect x="1111.42" y="320.21" transform="matrix(6.123234e-17 -1 1 6.123234e-17 802.6074 1449.7852)" class="st0" width="29.54" height="6.76"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M410.44,624.16v-26.6h5.43l7.71,11.02l7.71-11.02h5.39v26.6h-5.39v-18.2l-6.12,8.55h-3.04l-6.23-8.55v18.2
|
||||
H410.44z"/>
|
||||
<path class="st2" d="M446.34,601.06c2.62-2.7,5.93-4.03,9.88-4.03c3.95,0,7.22,1.33,9.84,4.03c2.62,2.66,3.95,5.93,3.95,9.8
|
||||
c0,3.84-1.33,7.1-3.95,9.8c-2.62,2.7-5.89,4.03-9.84,4.03c-3.95,0-7.26-1.33-9.88-4.03c-2.62-2.7-3.91-5.97-3.91-9.8
|
||||
C442.43,606.99,443.72,603.72,446.34,601.06z M456.22,619.56c2.36,0,4.29-0.84,5.85-2.47s2.36-3.72,2.36-6.23s-0.8-4.6-2.36-6.23
|
||||
s-3.5-2.47-5.85-2.47s-4.33,0.84-5.89,2.47s-2.32,3.72-2.32,6.23s0.76,4.6,2.32,6.23S453.87,619.56,456.22,619.56z"/>
|
||||
<path class="st2" d="M475.72,624.16v-26.6h9.95c4.29,0,7.83,1.25,10.52,3.72c2.7,2.47,4.07,5.66,4.07,9.58
|
||||
c0,3.91-1.37,7.14-4.07,9.61c-2.7,2.47-6.23,3.69-10.52,3.69H475.72z M481.19,619.26h4.03c5.93,0,9.42-3.12,9.42-8.4
|
||||
s-3.5-8.4-9.42-8.4h-4.03V619.26z"/>
|
||||
<path class="st2" d="M505.97,624.16v-26.6h19.53v4.9h-14.06v5.13h11.32v4.83h-11.32v6.84h14.48v4.9H505.97z"/>
|
||||
<path class="st2" d="M539.94,624.16v-3.99l7.83-7.11c1.79-1.63,3-2.92,3.69-3.95c0.72-1.03,1.06-2.09,1.06-3.23
|
||||
c0-2.28-1.82-3.72-4.56-3.72c-2.51,0-4.9,1.03-7.18,3.04v-5.62c2.17-1.71,4.75-2.55,7.75-2.55c2.55,0,4.75,0.76,6.61,2.24
|
||||
c1.86,1.48,2.81,3.46,2.81,5.89c0,1.86-0.42,3.53-1.25,4.98c-0.8,1.44-2.28,3.12-4.37,5.05l-4.56,4.18h11.09v4.79H539.94z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M883.3,624.16v-26.6h5.43l7.71,11.02l7.71-11.02h5.39v26.6h-5.39v-18.2l-6.12,8.55H895l-6.23-8.55v18.2H883.3z
|
||||
"/>
|
||||
<path class="st2" d="M919.21,601.06c2.62-2.7,5.93-4.03,9.88-4.03c3.95,0,7.22,1.33,9.84,4.03c2.62,2.66,3.95,5.93,3.95,9.8
|
||||
c0,3.84-1.33,7.1-3.95,9.8c-2.62,2.7-5.89,4.03-9.84,4.03c-3.95,0-7.26-1.33-9.88-4.03c-2.62-2.7-3.91-5.97-3.91-9.8
|
||||
C915.3,606.99,916.59,603.72,919.21,601.06z M929.09,619.56c2.36,0,4.29-0.84,5.85-2.47s2.36-3.72,2.36-6.23s-0.8-4.6-2.36-6.23
|
||||
s-3.5-2.47-5.85-2.47s-4.33,0.84-5.89,2.47s-2.32,3.72-2.32,6.23s0.76,4.6,2.32,6.23S926.73,619.56,929.09,619.56z"/>
|
||||
<path class="st2" d="M948.59,624.16v-26.6h9.95c4.29,0,7.83,1.25,10.52,3.72c2.7,2.47,4.07,5.66,4.07,9.58
|
||||
c0,3.91-1.37,7.14-4.07,9.61c-2.7,2.47-6.23,3.69-10.52,3.69H948.59z M954.06,619.26h4.03c5.93,0,9.42-3.12,9.42-8.4
|
||||
s-3.5-8.4-9.42-8.4h-4.03V619.26z"/>
|
||||
<path class="st2" d="M978.83,624.16v-26.6h19.53v4.9H984.3v5.13h11.32v4.83H984.3v6.84h14.48v4.9H978.83z"/>
|
||||
<path class="st2" d="M1012.8,624.16v-3.99l7.83-7.11c1.79-1.63,3-2.92,3.69-3.95c0.72-1.03,1.06-2.09,1.06-3.23
|
||||
c0-2.28-1.82-3.72-4.56-3.72c-2.51,0-4.9,1.03-7.18,3.04v-5.62c2.17-1.71,4.75-2.55,7.75-2.55c2.55,0,4.75,0.76,6.61,2.24
|
||||
c1.86,1.48,2.81,3.46,2.81,5.89c0,1.86-0.42,3.53-1.25,4.98c-0.8,1.44-2.28,3.12-4.37,5.05l-4.56,4.18h11.09v4.79H1012.8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st0" d="M263.39,64.25h27.51v4.85h-11.14v28.75h-5.28V69.1h-11.09V64.25z"/>
|
||||
<path class="st0" d="M301.36,97.86h-5.18v-33.6h5.18v13.15c2.3-2.5,5.18-3.74,8.64-3.74c5.57,0,8.74,3.7,8.74,9.79v14.4h-5.18
|
||||
V84.61c0-2.26-0.53-3.84-1.63-4.75c-1.1-0.91-2.4-1.34-3.89-1.34c-2.64,0-5.33,1.68-6.67,3.84V97.86z"/>
|
||||
<path class="st0" d="M325.64,97.86V74.29h5.18v4.08c1.58-2.74,5.04-4.71,8.69-4.71c0.19,0,0.34,0,0.48,0.05v5.18
|
||||
c-0.43-0.05-0.91-0.1-1.44-0.1c-3.7,0-6.62,2.16-7.73,4.61v14.45H325.64z"/>
|
||||
<path class="st0" d="M346.67,94.88c-2.45-2.4-3.65-5.33-3.65-8.83c0-3.46,1.2-6.38,3.65-8.78s5.52-3.6,9.31-3.6
|
||||
c3.74,0,6.82,1.2,9.26,3.6s3.65,5.33,3.65,8.78c0,3.46-1.2,6.38-3.65,8.83c-2.45,2.4-5.52,3.6-9.26,3.6
|
||||
C352.19,98.48,349.11,97.28,346.67,94.88z M361.5,91.66c1.49-1.49,2.21-3.36,2.21-5.62c0-2.21-0.72-4.08-2.21-5.57
|
||||
c-1.49-1.49-3.31-2.26-5.52-2.26c-2.21,0-4.08,0.77-5.57,2.26c-1.49,1.49-2.21,3.36-2.21,5.57c0,2.26,0.72,4.13,2.21,5.62
|
||||
c1.49,1.49,3.31,2.26,5.57,2.26C358.19,93.92,360.01,93.15,361.5,91.66z"/>
|
||||
<path class="st0" d="M376.38,78.85h-5.04v-4.56h5.04v-6.87h5.18v6.87H389v4.56h-7.44v11.09c0,2.69,1.2,3.79,3.7,3.79
|
||||
c1.3,0,2.45-0.29,3.55-0.86v4.46c-1.1,0.77-2.88,1.15-5.23,1.15c-4.42,0-7.2-2.45-7.2-7.06V78.85z"/>
|
||||
<path class="st0" d="M397.31,78.85h-5.04v-4.56h5.04v-6.87h5.18v6.87h7.44v4.56h-7.44v11.09c0,2.69,1.2,3.79,3.7,3.79
|
||||
c1.3,0,2.45-0.29,3.55-0.86v4.46c-1.1,0.77-2.88,1.15-5.23,1.15c-4.42,0-7.2-2.45-7.2-7.06V78.85z"/>
|
||||
<path class="st0" d="M415.79,92.29V64.25h5.18v26.59c0,1.92,0.86,2.88,2.59,2.88c0.72,0,1.39-0.14,1.97-0.48v4.46
|
||||
c-1.01,0.53-2.3,0.77-3.84,0.77C418.28,98.48,415.79,96.75,415.79,92.29z"/>
|
||||
<path class="st0" d="M432.15,77.21c2.26-2.35,5.14-3.55,8.74-3.55c2.4,0,4.46,0.62,6.19,1.92c3.5,2.5,4.99,6.38,4.99,10.66v1.34
|
||||
h-18.05c0.62,3.98,4.08,6.34,8.88,6.34c2.74,0,5.23-0.72,7.58-2.11v4.37c-2.16,1.54-5.04,2.3-8.69,2.3s-6.72-1.15-9.26-3.46
|
||||
c-2.5-2.3-3.74-5.28-3.74-8.98C428.79,82.54,429.9,79.57,432.15,77.21z M446.84,83.65c-0.05-1.44-0.58-2.74-1.68-3.89
|
||||
c-1.1-1.15-2.59-1.73-4.51-1.73c-3.79,0-6.24,2.54-6.58,5.62H446.84z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 49 KiB |
@@ -16,6 +16,9 @@
|
||||
* [Flight modes](modes.md)
|
||||
* [Power setup](power.md)
|
||||
* [Failsafe configuration](failsafe.md)
|
||||
* Manual flight
|
||||
* [Basics](flight.md)
|
||||
* [Exercises](flight_exercises.md)
|
||||
* Working with Raspberry Pi
|
||||
* [Raspberry Pi](raspberry.md)
|
||||
* [RPi Image](image.md)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Clover 4 assembly
|
||||
# Clover 4.2 assembly
|
||||
|
||||
## Fasteners size
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_6.png" width=300 class="zoom border center">
|
||||
|
||||
6. Install 4 6mm nylon posts and fix them with the M3x8 screws.
|
||||
6. Install 4 6mm nylon posts and fix them with the M3x5 screws.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_7.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -200,7 +200,7 @@ Install the damper struts, fix *COEX Pix* on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_11.png" width=300 class="zoom border center">
|
||||
|
||||
## Installing LED strip
|
||||
## Installing LED strip and legs
|
||||
|
||||
1. Assemble the hoop for the LED strip by combining the lock on the ends.
|
||||
|
||||
|
||||
@@ -78,3 +78,13 @@ You can use **nano** to edit files on the Raspberry Pi. It is one of the more us
|
||||
```
|
||||
|
||||
You may also use other editors like **vim** if you prefer.
|
||||
|
||||
## Resetting changes
|
||||
|
||||
For resetting all the changes in Clover package related files (`launch`-files), use git:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/clover
|
||||
git checkout .
|
||||
sudo systemctl restart clover
|
||||
```
|
||||
|
||||
110
docs/en/flight.md
Normal file
110
docs/en/flight.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# Flight
|
||||
|
||||
> **Info** See also official PX4 flying guide: https://docs.px4.io/v1.9.0/en/flying/.
|
||||
|
||||
This section explains the basics of manual controlling the quadcopter in different modes using radio remote control (for autonomous flying see "[Programming](programming.md)") section.
|
||||
|
||||
## Main features of radio remote control
|
||||
|
||||
Before you can launch your drone, you need to understand how the radio remote control works.
|
||||
|
||||
The drone is controlled using two sticks on the remote control. By default, the left stick controls throttle and yaw, and the right stick controls roll and pitch. These terms are used for all aircraft, from airplanes to quadcopters.
|
||||
|
||||
<img src="../assets/flight/rc_basic_commands.svg" width=400 class="zoom center">
|
||||
|
||||
* Throttle – is responsible for rotation speed of the motors.
|
||||
* Yaw – is responsible for rotation around the vertical axis (Z), clockwise (when tilted to the right) and counterclockwise (when tilted to the left).
|
||||
* Pitch – is responsible for tilting or moving forward / backward.
|
||||
* Roll – is responsible for tilting or moving left / right.
|
||||
|
||||
These descriptions assume the aircraft is turned with its back to the pilot.
|
||||
|
||||
<img src="../assets/flight/basic_movements_multicopter.svg" width=400 class="zoom center">
|
||||
|
||||
## Flight Modes
|
||||
|
||||
Manual flight using the PX4 flight controller can be performed in different flight modes. They determine the radio controller stick assignments and other flight characteristics. For the complete list of flight modes, see the article "[Flight modes](modes.md)".
|
||||
|
||||
The main manual modes are described below.
|
||||
|
||||
**STABILIZED** - horizontal angle stabilization mode. In this mode, the aircraft will hold the horizon if not controlled. Functions of sticks:
|
||||
|
||||
* Throttle – the average speed of rotation of the motors.
|
||||
* Yaw – angular velocity around the vertical axis.
|
||||
* Pitch – the angle of inclination around the transverse axis (forward / backward).
|
||||
* Roll – the angle of inclination around the longitudinal axis (left / right).
|
||||
|
||||
**POSCTL** - position holding mode (requires positioning system enabled). Functions of sticks:
|
||||
|
||||
* Throttle – vertical flight speed.
|
||||
* Yaw – angular velocity around the vertical axis.
|
||||
* Pitch – linear speed of the drone (forward / backward).
|
||||
* Roll – linear speed of the drone (left / right).
|
||||
|
||||
**ACRO** - controlling the average rotational speed of the motors and angular speeds of the drone. This mode is the most difficult to fly and is most often used by drone racers and 3D piloting shows to perform tricks. Functions of sticks:
|
||||
|
||||
* Throttle – the average speed of rotation of the motors.
|
||||
* Yaw – angular velocity around the vertical axis.
|
||||
* Pitch – angular velocity around the transverse axis (forward / backward).
|
||||
* Roll – angular velocity around the longitudinal axis (left / right).
|
||||
|
||||
> **Info** Other flight controllers may have different names for similar flight modes.
|
||||
|
||||
## Preparing to fly
|
||||
|
||||
### Installing propellers and batteries
|
||||
|
||||
1. Install the battery strap.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_1.png" width=300 class="zoom border center">
|
||||
|
||||
2. Set the propellers according to the [motor direction pattern](#prop_rotation).
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_3.png" width=300 class="zoom border center">
|
||||
|
||||
3. Attach the buzzer and install the battery.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/flight/buzzer_acb.jpg" width=200 class="zoom border">
|
||||
<img src="../assets/assembling_clever4_2/final_4.png" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
### Setting the buzzer
|
||||
|
||||
In order not to over-discharge or damage the battery, it is recommended to use a voltage indicator (*buzzer*).
|
||||
|
||||
To configure the buzzer, connect it to the balance connector of your battery. By pressing the button, change the minimum voltage on the cells. The optimal value for the minimum voltage is *3.5-3.6 V*.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/flight/buzzer_connection.jpg" width=300 class="zoom border">
|
||||
<img src="../assets/flight/buzzer.jpg" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
### Flight readiness states
|
||||
|
||||
Before starting the flight, the aircraft must be in the *Armed* state.
|
||||
|
||||
* *Armed* state – motors rotate according to throttle stick position, copter is ready to fly.
|
||||
* *Disarmed* state – motors do not rotate, copter does not respond to throttle stick.
|
||||
|
||||
By default, the aircraft is in the *Disarmed* state and switches to it automatically if you do not take off for a long time.
|
||||
|
||||
There are several ways to change the copter's state to *Armed*:
|
||||
|
||||
* Using the stick – move the left stick down to the right and wait a couple of seconds.
|
||||
|
||||
<img src="../assets/flight/controller_arm.jpg" width=300 class="zoom center">
|
||||
|
||||
* Using the toggle switch – the Armed / Disarmed states can be set to one of the toggle switches. For more information on setting up, see the article on [flight modes](modes.md).
|
||||
* With QGC – you can arm your drone programmatically. To do this, click on the *Disarmed* label in the header and select another state.
|
||||
* In the [user program](programming.md) – the copter can switch to *Armed* state if the `auto_arm=True` argument is specified in the navigation command, such as `navigate`, `set_position`, etc.
|
||||
|
||||
### Kill switch
|
||||
|
||||
When the *Kill Switch* is activated, no control signals are sent to the motors and the motors stop rotating. This function is used in extreme cases, for example, if you lose control of the aircraft.
|
||||
|
||||
> **Caution** Be careful, *Kill Switch* does not put the copter into *Disarmed* state!
|
||||
|
||||
Before disabling the *Kill Switch*, make sure the throttle stick is its down position and the aircraft is in *Disarmed* state. If the throttle stick is not in the lower position, when the *Kill Switch* is turned off, a signal corresponding to the stick position will be sent to the motors, which will lead your copter to jerk.
|
||||
|
||||
**Next**: [Drone control exercises](flight_exercises.md).
|
||||
149
docs/en/flight_exercises.md
Normal file
149
docs/en/flight_exercises.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# Drone control exercises
|
||||
|
||||
The following are the recommended exercises for novice pilots. Repeat each exercise as many times as necessary until you feel confident in it.
|
||||
|
||||
> **Hint** In case there is a person nearby who can control a copter, use [trainer mode](trainer_mode.md).
|
||||
|
||||
<!---->
|
||||
|
||||
> **Hint** The first flights are strongly recommended to be performed behind a protective grid. In the absence of such, the flight area must be at least 6x6 m.
|
||||
|
||||
## Turning on/off motors, changing flight modes
|
||||
|
||||
> **Hint** For convenience, connect to the aircraft using [QGC over Wi-Fi](gcs_bridge.md) and turn on the sound. This will allow you to monitor the change in flight modes. If you cannot connect via Wi-Fi, connect via USB to check flight modes.
|
||||
|
||||
Be sure to set the flight mode to one of the toggle switches. To do this, switch the toggle to different positions and make sure that the mode change.
|
||||
|
||||
It is recommended to configure *Kill Switch*. To check it, follow these steps:
|
||||
|
||||
* Turn on *Kill Switch*, make sure QGC has a notification.
|
||||
* Put the aircraft in *Armed* state and then enable *Kill Switch*. Make sure the motors stop. Then switch the *Kill Switch* to its original position. If the aircraft haven't automatically entered the *Disarmed* state due to inactivity, the motors will start rotating again.
|
||||
|
||||
> **Caution** Set the aircraft to *Armed* state on the flight zone only.
|
||||
|
||||
Make sure modes switching is assigned to toggle switch that is convenient for you. Otherwise, change it according to the [article on setting flight modes](modes.md). Repeat the above steps several times in order to remember which toggle switches are responsible for what.
|
||||
|
||||
## Working with throttle
|
||||
|
||||
The first step is to feel the responsiveness of the copter to the movement of the throttle stick and learn how to control it. Each drone has slightly different power reserves and therefore lifts off the ground at different stick positions.
|
||||
|
||||
For this exercise, only the throttle stick should be used. It is recommended not to use the rest of the sticks during the exercise.
|
||||
|
||||
The main tasks of the exercise:
|
||||
|
||||
1. Drift of the copter on the ground without taking off the ground.
|
||||
|
||||
### Preflight checks
|
||||
|
||||
Do the following before takeoff:
|
||||
|
||||
1. Check the integrity of the aircraft and the propellers are clear to rotate.
|
||||
2. Make sure the aircraft is with its back toward you.
|
||||
3. Turn on the aircraft by connecting the battery.
|
||||
4. Move back to a safe distance. It is recommended to maintain a minimum distance of 4-5 m to the aircraft.
|
||||
5. Make sure the aircraft is in *Stabilized* mode.
|
||||
|
||||
Do not try to lift the copter off the ground right away, find the lowest possible stick position for the copter to start drifting on the ground. Failure to do so may result in damage or injury.
|
||||
|
||||
> **Caution** If you lose control of the aircraft, you must immediately turn on *Kill Switch*.
|
||||
|
||||
**Exercise №1**. Slowly lift the throttle stick up until the aircraft starts to move. At this point, it will begin to slowly drift on the ground. Leave the throttle stick in this position and wait a couple of seconds, then move the throttle stick to its original position to land the aircraft. After landing the aircraft, turn off the motors by switching to *Disarmed* state. Repeat the exercise 5–10 times to get better feel for the copter's throttle stick response.
|
||||
|
||||
**Exercise №2**. Slowly lift the throttle stick up until the aircraft starts to lift slightly off the ground. Leave the throttle stick in this position and wait a couple of seconds, then land the aircraft as in Exercise №1. Repeat the exercise 5–10 times.
|
||||
|
||||
**Exercise №3**. Raise the throttle stick until the aircraft starts to drift on the ground, wait a second and continue increasing the throttle until the aircraft starts to lift off the ground, wait a second and land the aircraft. To consolidate, repeat the exercises 5–10 times, increasing the number of repetitions if necessary.
|
||||
|
||||
## Working with roll and pitch
|
||||
|
||||
After mastering the throttle control of the copter, it is necessary to learn how to control its horizontal position. The right stick on the remote control is responsible for this.
|
||||
|
||||
Manipulating these axes is intuitive:
|
||||
|
||||
* Stick tilted forward (up) - aircraft moves forward.
|
||||
* Stick tilted back (down) - aircraft moves backward.
|
||||
* Stick tilted to the right - aircraft moves to the right.
|
||||
* Stick tilted to the left - aircraft moves to the left.
|
||||
|
||||
The more the stick is tilted to the side, the more the aircraft will tilt to the side and the faster it moves.
|
||||
|
||||
The main tasks of the exercise:
|
||||
|
||||
1. Flying along the X axis, forward / backward.
|
||||
2. Flying along the Y axis, left / right.
|
||||
3. Stabilization of the copter in one place.
|
||||
4. Flying in a square clockwise and counterclockwise.
|
||||
|
||||
> **Hint** Always stay behind the aircraft with the rear facing towards you, otherwise you may lose control over it by mixing sides.
|
||||
|
||||
As with throttle control, perform [the following steps](#preflight-checks) before flying.
|
||||
|
||||
> **Hint** If the aircraft is spinning strongly around its axis, land it and recalibrate the magnetometer and gyroscope.
|
||||
|
||||
**Exercise №1**. Similar to throttle exercises, raise the throttle stick until the aircraft starts to drift on the ground or bounce a little, then release the throttle stick, leaving it in that position, and raise the pitch stick, first up for a second, then down. The copter will gradually move away from you and then towards you. Repeat the exercise 5–10 times until you feel the copter's responsiveness to the stick movement.
|
||||
|
||||
**Exercise №2**. Raise the throttle stick until the aircraft starts to drift, then leave it and move the roll stick first to the right for a second, then to the left. The aircraft will gradually move first to the right and then to the left. Repeat the exercise 5–10 times until you feel the copter's responsiveness to the stick movement.
|
||||
|
||||
**Exercise №3**. Raise the throttle stick until the aircraft starts to drift, then leave it. Combine the first and second exercises and try to stabilize the aircraft at one point, compensating for its drift with the stick. Hold the aircraft for 50–60 seconds.
|
||||
|
||||
**Exercise №4**. Raise the throttle stick until the aircraft starts to drift, then leave it. When you feel the copter's responsiveness to stick changes, make a "square" shape with a side of 1 m, first clockwise and then counterclockwise. Perform the figures 2–3 times.
|
||||
|
||||
## Air cushion and control in it
|
||||
|
||||
The concept of *air cushion* is very important for all flying vehicles. The air cushion itself is a zone of increased pressure created by the air being forced through the propellers. This area is characterized by turbulence and air currents affecting the flight of the copter.
|
||||
|
||||
Pilots try to avoid flying in an air cushion, but there is a stable area at the boundary where the aircraft can hover at minimum throttle. In this case, it feels like the copter has "sat down" on an air cushion.
|
||||
|
||||
The main feature and advantage of such a flight is that the copter will not change altitude with one throttle value.
|
||||
|
||||
Main tasks:
|
||||
|
||||
1. Stabilization of the copter in one place.
|
||||
2. Flying in a square.
|
||||
3. Flying in a circle.
|
||||
|
||||
Similarly to the previous exercises, perform [the following steps](#pre-flight-checks) before take off.
|
||||
|
||||
**Exercise №1**. Raise the throttle stick until the copter flies over the air cushion and is above it (height from floor ~ 25-30 cm, for Clover 4 copter). The aircraft should not climb up or fall down, the flight altitude should stabilize. As in the previous exercise, adjust the X and Y position of the aircraft using the roll and pitch sticks. As a result, the copter should hover at one point with slight wiggle to the sides. Hold the aircraft for 30–40 seconds.
|
||||
|
||||
**Exercise №2**. Raise the aircraft on the air cushion and stabilize it at one point. Next, fly over a square with a side of 1 m, first clockwise, then counterclockwise. Repeat the path 2–3 times in each direction.
|
||||
|
||||
**Exercise №3**. Raise the aircraft on the air cushion and stabilize it at one point. Try to fly a circle with the copter around 1 m in diameter, clockwise and counterclockwise. Repeat the path 2–3 times in each direction.
|
||||
|
||||
## Working with yaw
|
||||
|
||||
In the visual control of multicopter devices, yaw does not play as important role as with fixed wing vehicles, since the copter can move in any direction regardless of where it is directed.
|
||||
|
||||
> **Info** The term *yaw* refers to the rotation of the aircraft around the vertical axis.
|
||||
|
||||
Main tasks:
|
||||
|
||||
1. Rotate the copter, orienting the rear of the copter towards you.
|
||||
2. Turning around the copter, orienting the rear part towards you.
|
||||
|
||||
It is recommended that you find plenty of free space for the exercises presented.
|
||||
|
||||
Similarly to previous exercises, perform [preflight checks](#preflight-checks) before takeoff.
|
||||
|
||||
**Exercise №1**. Raise the aircraft on the air cushion and stabilize it at one point. Fly a circle around you with the copter, at a distance of 2–3 m, while rotating it so that the back of the copter is always directed towards you. Do the exercise clockwise and counterclockwise. Repeat the exercise 4–5 times.
|
||||
|
||||
**Exercise №2**. Raise the aircraft on the air cushion and stabilize it at one point. Walk around the aircraft while turning it so that the rear is facing you. Walk around the aircraft clockwise and counterclockwise. Repeat the exercise 4–5 times.
|
||||
|
||||
> **Caution** Additional exercises are much more difficult than usual and are not required. Only proceed with them if you are already confidently flying the copter.
|
||||
|
||||
**Additional exercise №1**. Raise the aircraft on the air cushion and stabilize it at one point. Face the aircraft with its front facing you and try to fly it backwards.
|
||||
|
||||
**Additional exercise №2**. Raise the aircraft on the air cushion and stabilize it at one point. Fly so that the front of the aircraft is always facing the direction of the aircraft.
|
||||
|
||||
## Free flight
|
||||
|
||||
If you can complete each of the exercises described above, chances are you already know how to freely take off and fly the aircraft. Some exercises will be presented below to consolidate the acquired skills.
|
||||
|
||||
Exercises:
|
||||
|
||||
* Flying in a vertical square.
|
||||
* Flying along the sides of the cube.
|
||||
* Flying in a vertical circle.
|
||||
* Flight of the eight.
|
||||
* Ascent of the copter in a spiral.
|
||||
|
||||
Strengthen the acquired skills as many times as necessary for you.
|
||||
@@ -8,7 +8,7 @@ Main frames in the `clover` package:
|
||||
* `map` has its origin at the flight controller initialization point and may be considered stationary. It is shown as a white grid on the image above;
|
||||
* `base_link` is rigidly bound to the drone. It is shown by the simplified drone model on the image above;
|
||||
* `body` is bound to the drone, but its Z axis points up regardless of the drone's pitch and roll. It is shown by the red, blue and green lines in the illustration;
|
||||
* `navigate_target` is bound to the current navigation target (as set by the [navigate](simple_offboard.md#navigate) service);
|
||||
* <a name="navigate_target"></a>`navigate_target` is bound to the current navigation target (as set by the [navigate](simple_offboard.md#navigate) service);
|
||||
* `setpoint` is current position setpoint.
|
||||
|
||||
Additional frames become available when [ArUco positioning system](aruco.md) is active:
|
||||
|
||||
@@ -52,15 +52,18 @@ Set the following parameters when LPE is used (`SYS_MC_EST_GROUP` = `local_posit
|
||||
In order to receive data from the topic, create a subscriber:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from sensor_msgs.msg import Range
|
||||
|
||||
# ...
|
||||
rospy.init_node('flight')
|
||||
|
||||
def range_callback(msg):
|
||||
# Process data from the rangefinder
|
||||
print 'Rangefinder distance:', msg.range
|
||||
|
||||
rospy.Subscriber('rangefinder/range', Range, range_callback)
|
||||
|
||||
rospy.spin()
|
||||
```
|
||||
|
||||
Also it's possible to read one rangefinder measurement at a time:
|
||||
|
||||
@@ -32,6 +32,8 @@ Read more in the [GPS connection](gps.md) article.
|
||||
|
||||
## Autonomous flight {#flight}
|
||||
|
||||
> **Info** For studying Python programming language, see [tutorial](https://www.learnpython.org/en/Welcome).
|
||||
|
||||
After you've configured your positioning system, you can start writing programs for autonomous flights. Use the [SSH connection to the Raspberry Pi](ssh.md) to run your scripts. In order to run a Python script use the `python` command:
|
||||
|
||||
```bash
|
||||
@@ -74,7 +76,7 @@ rospy.sleep(3)
|
||||
land()
|
||||
```
|
||||
|
||||
> **Note** The `navigate` function call is not blocking; that is, the program will continue executing the next commands before the drone arrives at the set point. Look at the [`navigate_wait`](snippets.md#block-nav) snippet for a blocking function.
|
||||
> **Note** The `navigate` function call is not blocking; that is, the program will continue executing the next commands before the drone arrives at the set point. Look at the [`navigate_wait`](snippets.md#navigate_wait) snippet for a blocking function.
|
||||
|
||||
Note that only the first `navigate` call has its `auto_arm` parameter set to `True`. This parameter arms the drone and transitions it to the OFFBOARD flight mode.
|
||||
|
||||
|
||||
@@ -57,10 +57,10 @@ sudo ./ubuntu.sh --no-nuttx
|
||||
The `sitl_gazebo` package containing required Gazebo plugins needs patching due to recent changes in MAVLink. These patches are already preapplied in the [virtual machine image](simulation_vm.md) and are stored in the VM repository. Run the following commands to download and apply the patches:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/Firmware/Tools/sitl_gazebo
|
||||
wget https://raw.githubusercontent.com/CopterExpress/clover_vm/master/assets/patches/sitl_gazebo.patch
|
||||
cd ~/catkin_ws/src/Firmware/Tools/sitl_gazebo
|
||||
wget https://raw.githubusercontent.com/CopterExpress/clover_vm/master/assets/patches/sitl_gazebo.patch
|
||||
patch -p1 < sitl_gazebo.patch
|
||||
rm sitl_gazebo.patch
|
||||
rm sitl_gazebo.patch
|
||||
```
|
||||
|
||||
## Install geographiclib datasets
|
||||
@@ -69,7 +69,7 @@ rm sitl_gazebo.patch
|
||||
|
||||
```bash
|
||||
cd ~
|
||||
wget https://raw.githubusercontent.com/mavlink/mavros/6f5bd5a1a67c19c2e605f33de296b1b1be9d02fc/mavros/scripts/install_geographiclib_datasets.sh
|
||||
wget https://raw.githubusercontent.com/mavlink/mavros/6f5bd5a1a67c19c2e605f33de296b1b1be9d02fc/mavros/scripts/install_geographiclib_datasets.sh
|
||||
chmod +x ./install_geographiclib_datasets.sh
|
||||
sudo ./install_geographiclib_datasets.sh
|
||||
rm ./install_geographiclib_datasets.sh
|
||||
|
||||
@@ -79,7 +79,7 @@ In this example you should set `PX4_SIM_SPEED_FACTOR` to `0.42` when launching t
|
||||
PX4_SIM_SPEED_FACTOR=0.42 roslaunch clover_simulation simulator.launch
|
||||
```
|
||||
|
||||
> **Note** If you are using the VM, it may be convenient to put the value in the Gazebo desktop shortcut. Right-click on the Gazebo icon, select "Properties..." and add `PX4_SIM_SPEED_FACTOR=0.42` to the Command field as follows:
|
||||
> **Note** If you are using the VM, it may be convenient to put the value in the Gazebo desktop shortcut. Right-click on the Gazebo icon, select "Properties..." and add `PX4_SIM_SPEED_FACTOR=0.42` to the Command field as follows:
|
||||

|
||||
|
||||
### Allocate more resources to the VM
|
||||
|
||||
@@ -26,8 +26,8 @@ Make sure that you have hardware virtualization enabled in your BIOS/UEFI (it ma
|
||||
|
||||

|
||||
|
||||
> **Note** You may see a dialog box with a warning about the VM format:
|
||||

|
||||
> **Note** You may see a dialog box with a warning about the VM format:
|
||||

|
||||
You can safely ignore the warning and press **Retry**.
|
||||
|
||||
2. Right-click on the VM name and select **Virtual Machine Settings**. In the new window, set the following parameters:
|
||||
|
||||
@@ -1,103 +1,22 @@
|
||||
Code examples
|
||||
===
|
||||
# Code examples
|
||||
|
||||
Python
|
||||
---
|
||||
## Python
|
||||
|
||||
### # {#distance}
|
||||
### # {#navigate_wait}
|
||||
|
||||
Calculating the distance between two points (**important**: the points are to be in the same [system of coordinates](frames.md)):
|
||||
<a name="block-nav"></a><!-- old name of anchor -->
|
||||
|
||||
<a name="block-takeoff"></a><!-- old name of anchor -->
|
||||
|
||||
Fly towards a point and wait for copter's arrival:
|
||||
|
||||
```python
|
||||
def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
|
||||
```
|
||||
import math
|
||||
|
||||
### # {#distance-global}
|
||||
#...
|
||||
|
||||
Approximation of distance (in meters) between two global coordinates (latitude/longitude):
|
||||
|
||||
```python
|
||||
def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
|
||||
### # {#block-takeoff}
|
||||
|
||||
Takeoff and waiting for it to finish:
|
||||
|
||||
```python
|
||||
z = 2 # altitude
|
||||
tolerance = 0.2 # precision of altitude check (m)
|
||||
|
||||
# Saving the initial point
|
||||
start = get_telemetry()
|
||||
|
||||
# Take off and leveling at 2 m above the ground
|
||||
print navigate(z=z, speed=0.5, frame_id='body', auto_arm=True)
|
||||
|
||||
# Waiting for takeoff
|
||||
while not rospy.is_shutdown():
|
||||
# Checking current altitude
|
||||
if start.z + z - get_telemetry().z < tolerance:
|
||||
# Takeoff complete
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
This code can be wrapped in a function:
|
||||
|
||||
```python
|
||||
def takeoff_wait(alt, speed=0.5, tolerance=0.2):
|
||||
start = get_telemetry()
|
||||
print navigate(z=alt, speed=speed, frame_id='body', auto_arm=True)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
if start.z + alt - get_telemetry().z < tolerance:
|
||||
break
|
||||
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#block-nav}
|
||||
|
||||
Flying towards a point and waiting for copter's arrival:
|
||||
|
||||
```python
|
||||
tolerance = 0.2 # precision of arrival check (m)
|
||||
frame_id='aruco_map'
|
||||
|
||||
# Flying to point 1:2:3 in the field of ArUco markers
|
||||
print navigate(frame_id=frame_id, x=1, y=2, z=3, speed=0.5)
|
||||
|
||||
# Wait for the copter to arrive at the requested point
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id=frame_id)
|
||||
# Calculating the distance to the requested point
|
||||
if get_distance(1, 2, 3, telem.x, telem.y, telem.z) < tolerance:
|
||||
# Arrived at the requested point
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
This code can be wrapped into a function:
|
||||
|
||||
```python
|
||||
def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id=frame_id)
|
||||
if get_distance(x, y, z, telem.x, telem.y, telem.z) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
A more universal solution, utilizing the `navigate_target` frame, which corresponds to the navigating target point of the drone:
|
||||
|
||||
```python
|
||||
def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id)
|
||||
def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
@@ -106,11 +25,25 @@ def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
This code also can be used for navigating using `body` frame.
|
||||
This function utilizes [`navigate_target`](frames.md#navigate_target) frame for computing the distance to the target.
|
||||
|
||||
Using the function for flying to the point x=3, y=2, z=1 in [marker's map](aruco_map.md):
|
||||
|
||||
```python
|
||||
navigate_wait(x=3, y=2, z=1, frame_id='aruco_map')
|
||||
```
|
||||
|
||||
This function can be used for taking off as well:
|
||||
|
||||
```python
|
||||
navigate_wait(z=1, frame_id='body', auto_arm=True)
|
||||
```
|
||||
|
||||
### # {#block-land}
|
||||
|
||||
Landing and waiting until the copter lands:
|
||||
<a name="block-land"></a><!-- old name of anchor -->
|
||||
|
||||
Land and wait until the copter lands:
|
||||
|
||||
```python
|
||||
land()
|
||||
@@ -118,18 +51,50 @@ while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
This code can be wrapped in a function:
|
||||
Usage:
|
||||
|
||||
```python
|
||||
def land_wait():
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
land_wait()
|
||||
```
|
||||
|
||||
### # {#wait_arrival}
|
||||
|
||||
Wait for copter's arrival to the [navigate](simple_offboard.md#navigate) target:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def wait_arrival(tolerance=0.2):
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#get_distance}
|
||||
|
||||
Calculate the distance between two points (**important**: the points are to be in the same [coordinate system](frames.md)):
|
||||
|
||||
```python
|
||||
def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
|
||||
```
|
||||
|
||||
### # {#get_distance_global}
|
||||
|
||||
Approximation of distance (in meters) between two global coordinates (latitude/longitude):
|
||||
|
||||
```python
|
||||
def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
|
||||
### # {#disarm}
|
||||
|
||||
Quadcopter disarm (disabling propellers **the copter will fall down**):
|
||||
Disarm the drone (propellers will stop, **the drone will fall down**):
|
||||
|
||||
```python
|
||||
# Declaring a proxy:
|
||||
@@ -143,7 +108,7 @@ arming(False) # дизарм
|
||||
|
||||
### # {#transform}
|
||||
|
||||
Transforming the position (`PoseStamped`) from one system of coordinates ([of frame](frames.md)) to another one using [tf2] (http://wiki.ros.org/tf2):
|
||||
Transform the position (`PoseStamped`) from one [coordinate system](frames.md) to another using [tf2](http://wiki.ros.org/tf2):
|
||||
|
||||
```python
|
||||
import tf2_ros
|
||||
@@ -155,25 +120,25 @@ tf_listener = tf2_ros.TransformListener(tf_buffer)
|
||||
|
||||
# ...
|
||||
|
||||
# PoseStamped object creation (or getting it from a topic):
|
||||
# Create PoseStamped object (or get it from a topic):
|
||||
pose = PoseStamped()
|
||||
pose.header.frame_id = 'map' # frame, which is the position is specified
|
||||
pose.header.stamp = rospy.get_rostime() # the instant for which the position is specified (current time)
|
||||
pose.header.frame_id = 'map' # coordinate frame, in which the position is specified
|
||||
pose.header.stamp = rospy.get_rostime() # the time for which the position is specified (current time)
|
||||
pose.pose.position.x = 1
|
||||
pose.pose.position.y = 2
|
||||
pose.pose.position.z = 3
|
||||
pose.pose.orientation.w = 1
|
||||
|
||||
frame_id = 'base_link' # target frame
|
||||
transform_timeout = rospy.Duration(0.2) # wait for transformation timeout
|
||||
frame_id = 'base_link' # target coordinate frame
|
||||
transform_timeout = rospy.Duration(0.2) # timeout for transformation
|
||||
|
||||
# Transforming the position from the old frame to the new one:
|
||||
# Transform the position from the old frame to the new one:
|
||||
new_pose = tf_buffer.transform(pose, frame_id, transform_timeout)
|
||||
```
|
||||
|
||||
### # {#upside-down}
|
||||
|
||||
Determining whether the copter is turned upside-down:
|
||||
Determine whether the copter is turned upside-down:
|
||||
|
||||
```python
|
||||
PI_2 = math.pi / 2
|
||||
@@ -184,7 +149,7 @@ flipped = abs(telem.pitch) > PI_2 or abs(telem.roll) > PI_2
|
||||
|
||||
### # {#angle-hor}
|
||||
|
||||
Calculating the copter total horizontal angle:
|
||||
Calculate the copter horizontal angle:
|
||||
|
||||
```python
|
||||
PI_2 = math.pi / 2
|
||||
@@ -198,7 +163,7 @@ if flipped:
|
||||
|
||||
### # {#circle}
|
||||
|
||||
Flying along a circular path:
|
||||
Fly along a circular path:
|
||||
|
||||
```python
|
||||
RADIUS = 0.6 # m
|
||||
@@ -220,7 +185,7 @@ while not rospy.is_shutdown():
|
||||
|
||||
### # {#rate}
|
||||
|
||||
repeating an action at a frequency of 10 Hz:
|
||||
Repeat an action at a frequency of 10 Hz:
|
||||
|
||||
```python
|
||||
r = rospy.Rate(10)
|
||||
@@ -231,7 +196,7 @@ while not rospy.is_shutdown():
|
||||
|
||||
### # {#mavros-sub}
|
||||
|
||||
An example of subscription to a topic from MAVROS
|
||||
An example of subscription to a topic from MAVROS:
|
||||
|
||||
```python
|
||||
from geometry_msgs.msg import PoseStamped, TwistStamped
|
||||
@@ -261,7 +226,7 @@ Information about MAVROS topics is available at [the link](mavros.md).
|
||||
|
||||
<!-- markdownlint-enable MD044 -->
|
||||
|
||||
Sending an arbitrary [MAVLink message](mavlink.md) to the copter:
|
||||
Send an arbitrary [MAVLink message](mavlink.md) to the copter:
|
||||
|
||||
```python
|
||||
# ...
|
||||
@@ -285,15 +250,15 @@ mavlink_pub.publish(ros_msg)
|
||||
|
||||
### # {#rc-sub}
|
||||
|
||||
Return on mode switching with the transmitter (may be used for starting an autonomous flight, see [example](https://gist.github.com/okalachev/b709f04522d2f9af97e835baedeb806b)):
|
||||
React to the drone's mode switching (may be used for starting an autonomous flight, see [example](https://gist.github.com/okalachev/b709f04522d2f9af97e835baedeb806b)):
|
||||
|
||||
```python
|
||||
from mavros_msgs.msg import RCIn
|
||||
|
||||
# Called when new data is received from the transmitter
|
||||
def rc_callback(data):
|
||||
# Return on switch toggling of the transmitter
|
||||
if data.channels[5] < 1100:
|
||||
# React on toggling the mode of the transmitter
|
||||
if data.channels[5] < 1100:
|
||||
# ...
|
||||
pass
|
||||
elif data.channels[5] > 1900:
|
||||
@@ -361,7 +326,7 @@ rospy.loginfo('flip')
|
||||
flip()
|
||||
```
|
||||
|
||||
Requires the [special PX4 firmware for Clover](firmware.md#modified-firmware-for-clover). Before running a flip, take all necessary safty precautions.
|
||||
Requires the [special PX4 firmware for Clover](firmware.md#modified-firmware-for-clover). Before running a flip, take all necessary safety precautions.
|
||||
|
||||
### # {#calibrate-gyro}
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
* [Полетные режимы](modes.md)
|
||||
* [Настройка питания](power.md)
|
||||
* [Настройка failsafe](failsafe.md)
|
||||
* Ручной полет
|
||||
* [Основы](flight.md)
|
||||
* [Упражнения](flight_exercises.md)
|
||||
* Работа с Raspberry Pi
|
||||
* [Raspberry Pi](raspberry.md)
|
||||
* [Образ для RPi](image.md)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
# Пульт на Android
|
||||
|
||||
Все владельцы мобильных устройств фирмы *Apple* ещё морозным январем 2018го обзавелись приятным приложением под *iOS* для пилотирования квадрокоптеров с помощью **WiFi**. И вот, спустя год вышло такое же приложение но уже для другой операционной системы. Актуальную версию вы можете скачать [**тут**](https://vk.com/away.php?to=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dexpress.copter.cleverrc&cc_key=) .
|
||||
|
||||
|
||||
## Введение
|
||||
|
||||
В данной статье я расскажу вам о том, как можно написать свой или доработать уже имеющийся пульт для Андроид своими руками. Для работы будем использовать модный язык *Kotlin*, а в качестве среды разработки возьмем *Android Studio*. Для тех кто ни разу ей не пользовался рекомендую к ознакомлению следующие [*материалы*](https://www.google.com/search?ei=xQxDXMH0C8OOmgW4mYigDQ&q=%D0%A7%D1%82%D0%BE+%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C+%D0%B5%D1%81%D0%BB%D0%B8+%D1%8F+%D0%BD%D0%B5+%D1%83%D0%BC%D0%B5%D1%8E+%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C+%D0%BF%D0%BE%D0%B4+%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B8%D0%B4%3F&oq=%D0%A7%D1%82%D0%BE+%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C+%D0%B5%D1%81%D0%BB%D0%B8+%D1%8F+%D0%BD%D0%B5+%D1%83%D0%BC%D0%B5%D1%8E+%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C+%D0%BF%D0%BE%D0%B4+%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B8%D0%B4%3F&gs_l=psy-ab.3...4413.17423..17726...9.0..2.442.4577.45j5j1j0j1....2..0....1..gws-wiz.....6..0i71j35i39j0i131j0j0i67j0i131i67j0i22i30j33i22i29i30j33i21j33i160.0bZz-WGxoHY). Весь код приложения можно найти [**тут**](https://github.com/Tennessium/android). Если вы хотите сразу получить приложение с целью дальнейшей доработки, выполните следующую команду:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Сборка Клевера 4
|
||||
# Сборка Клевера 4.2
|
||||
|
||||
## Размер крепежа
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_6.png" width=300 class="zoom border center">
|
||||
|
||||
6. Установите 4 нейлоновые стойки 6мм и закрепите их с помощью винтов М3х8.
|
||||
6. Установите 4 нейлоновые стойки 6мм и закрепите их с помощью винтов М3х5.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_7.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_2.png" width=300 class="zoom border">
|
||||
|
||||
## Установка LED ленты
|
||||
## Установка LED ленты и ножек
|
||||
|
||||
1. Соберите обруч для светодиодной ленты, объединив замок на концах.
|
||||
|
||||
|
||||
@@ -78,3 +78,13 @@ sudo reboot
|
||||
```
|
||||
|
||||
Для редактирования файлов также можно использовать и другие редакторы, например, **vim**.
|
||||
|
||||
## Сброс изменений
|
||||
|
||||
Для сброса изменений всех файлов, относящихся к пакету Клевера (`launch`-файлы) используйте git:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/clover
|
||||
git checkout .
|
||||
sudo systemctl restart clover
|
||||
```
|
||||
|
||||
108
docs/ru/flight.md
Normal file
108
docs/ru/flight.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Полет
|
||||
|
||||
Этот раздел объясняет основы управление квадрокоптером с использование пульта радиоуправления в различных режимах (для автономных полетов смотрите раздел "[Программирование](programming.md)").
|
||||
|
||||
## Основные возможности радиоаппаратуры
|
||||
|
||||
Прежде чем запускать ваш коптер, необходимо разобраться, как работает пульт радиоуправления ("аппаратура" в общепринятой терминологии авиамоделизма).
|
||||
|
||||
Управление дроном происходит с помощью двух стиков на аппаратуре. По умолчанию левый стик отвечает за газ и рысканье, а правый за крен и тангаж. Данные термины используются для всех летательных судов, от самолетов до квадрокоптеров.
|
||||
|
||||
<img src="../assets/flight/rc_basic_commands.svg" width=400 class="zoom center">
|
||||
|
||||
* Газ (*throttle*) – отвечает за скорость вращения двигателей.
|
||||
* Рысканье (*yaw*) – отвечает за повороты вокруг вертикальной оси (Z), по часовой (при наклоне вправо) и против часовой (при наклоне влево) стрелки.
|
||||
* Тангаж (*pitch*) – отвечает за наклон или движение вперёд/назад.
|
||||
* Крен (*roll*) – отвечает за наклон или движение влево/вправо.
|
||||
|
||||
Данные описания предполагают, что коптер находится задней частью к пилоту.
|
||||
|
||||
<img src="../assets/flight/basic_movements_multicopter.svg" width=400 class="zoom center">
|
||||
|
||||
## Полетные режимы
|
||||
|
||||
Ручное полет с использованием полетного контроллера PX4 может происходит с использованием разных полетных режимов, которые определяют назначения стиков радиопульта и другие характеристики полета. Полный список полетных режимов приведен в статье "[Полетные режимы](modes.md)".
|
||||
|
||||
Основные ручные режимы разобраны далее.
|
||||
|
||||
**STABILIZED** - режим стабилизации горизонтального положения. В данном режиме коптер будет удерживать горизонт, если им не управлять. Назначение стиков:
|
||||
|
||||
* Газ – усредненная скорость вращения моторов.
|
||||
* Рысканье – угловая скорость вокруг вертикальной оси.
|
||||
* Тангаж – угол наклона вокруг поперечной оси (вперед/назад).
|
||||
* Крен – угол наклон вокруг продольной оси (влево/вправо).
|
||||
|
||||
**POSCTL** – режим удержания позиции (требуется включенная система позиционирования). Назначение стиков:
|
||||
|
||||
* Газ - вертикальная скорость полета.
|
||||
* Рысканье - угловая скорость вокруг вертикальной оси.
|
||||
* Тангаж - линейная скорость полета дрона (вперед/назад).
|
||||
* Крен - линейная скорость полета дрона (влево/вправо).
|
||||
|
||||
**ACRO** – режим управление средней скоростью вращения моторов и угловыми скоростями дрона. Этот режим является наиболее сложным для пилотирования и чаще всего применяется дрон-рейсерами и в шоу 3D-пилотирования для выполнения трюков. Назначение стиков:
|
||||
|
||||
* Газ – усредненная скорость вращения моторов.
|
||||
* Рысканье – угловая скорость вокруг вертикальной оси.
|
||||
* Тангаж – угловая скорость вокруг поперечной оси (вперед/назад).
|
||||
* Крен – угловая скорость вокруг продольной оси (влево/вправо).
|
||||
|
||||
> **Info** В других полетных контроллерах аналогичные полетные режимы могут называться по-другому.
|
||||
|
||||
## Подготовка к полету
|
||||
|
||||
### Установка пропеллеров и АКБ
|
||||
|
||||
1. Установите ремешок для аккумулятора.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_1.png" width=300 class="zoom border center">
|
||||
|
||||
2. Установите пропеллеры в соответствии со [схемой направления движения моторов](#prop_rotation).
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_3.png" width=300 class="zoom border center">
|
||||
|
||||
3. Закрепите пищалку и установите аккумулятор.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/flight/buzzer_acb.jpg" width=200 class="zoom border">
|
||||
<img src="../assets/assembling_clever4_2/final_4.png" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
### Настройка пищалки
|
||||
|
||||
Для того, чтобы не переразрядить и не испортить аккумулятор, рекомендуется использовать индикатор напряжения (*пищалка*).
|
||||
|
||||
Для настройки *пищалки* подключите ее к балансировочному разъему вашего аккумулятора. Теперь, нажимая на кнопку в основании будет изменяться минимальное напряжение на ячейках. Оптимальное значение минимального напряжения является *3.5-3.6 V*.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/flight/buzzer_connection.jpg" width=300 class="zoom border">
|
||||
<img src="../assets/flight/buzzer.jpg" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
### Состояния готовности к полету
|
||||
|
||||
Прежде чем начинать полет, необходимо перевести коптер в состояние *Armed*.
|
||||
|
||||
* Состояние *Armed* – моторы вращаются в соответсвии с положением стика газа, коптер готов к полету.
|
||||
* Состояние *Disarmed* – моторы не вращаются, коптер не реагирует на стик газа.
|
||||
|
||||
По умолчанию коптер находится в состоянии *Disarmed* и переходит в него в случае если вы долго не взлетаете.
|
||||
|
||||
Для перевода коптера в состояние *Armed* есть несколько способов:
|
||||
|
||||
* С помощью стика – переведите левый стик вниз вправо и подождите пару секунд.
|
||||
|
||||
<img src="../assets/flight/controller_arm.jpg" width=300 class="zoom center">
|
||||
|
||||
* С помощью тумблера – состояния Armed/Disarmed можно настроить на один из тумблеров. Подробнее о настройке в смотрите в статье про [полетные режимы](modes.md).
|
||||
* С помощью QGC – вы можете заармить ваш дрон программно. Для этого нажмите на надпись *Disarmed* в шапке и выберите другое состояние.
|
||||
* С помощью [программы](programming.md) - коптер может перейти в состояние *Armed*, если в навигационной команде, такой как `navigate`, `set_position` и т.д., указан параметр `auto_arm=True`.
|
||||
|
||||
### Kill switch
|
||||
|
||||
При активации тумблера *Kill Switch* на моторы перестают посылаться сигналы управления, и моторы перестают вращаться. Эта функция используется в крайних случаях, к примеру, если вы потеряли управление над коптером.
|
||||
|
||||
> **Caution** Будьте внимательны, *Kill Switch* не переводит коптер в состояние *Disarmed*!
|
||||
|
||||
Перед отключением *Kill Switch* убедитесь, что стик газа находится в нижнем положении и коптер находится в состоянии *Disarmed*. В случае, если стик газа не находится в нижнем положении, при отключении *Kill Switch* на моторы будет подан сигнал соответствующий положению стика в данный момент, что приведет к резкому рывку коптера.
|
||||
|
||||
**Далее**: [Упражнения для управления коптером](flight_exercises.md).
|
||||
149
docs/ru/flight_exercises.md
Normal file
149
docs/ru/flight_exercises.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# Упражнения для управления коптером
|
||||
|
||||
Далее описаны рекомендуемые упражнения для тех, кто учится летать на коптере в первый раз. Повторяйте каждое упражнение необходимое количество раз, пока не будете чувствовать себя уверенно в нем.
|
||||
|
||||
> **Hint** В случае, если рядом есть человек умеющий управлять коптером, используйте [режим тренера](trainer_mode.md).
|
||||
|
||||
<!-- -->
|
||||
|
||||
> **Hint** Настоятельно рекомендуется первые полеты проводить за защитной сеткой. В случае отсутствия таковой, полетная зона должна быть не менее 6x6 м.
|
||||
|
||||
## Включение, выключение моторов, изменение режимов
|
||||
|
||||
> **Hint** Для удобства подключитесь к коптеру с помощью [QGC через Wi-Fi](gcs_bridge.md) и включите звук. Это позволит наблюдать за изменением полетных режимов. Если не имеется возможности подключиться через Wi-Fi, для проверки полетных режимов подключитесь по USB.
|
||||
|
||||
Убедитесь, что настроили полетные режимы на один из тумблеров. Для этого переключите тумблер, в разные позиции и убедитесь, что режимы изменяются.
|
||||
|
||||
Рекомендуется настроить *Kill Switch*. Для его проверки совершите следующие действия:
|
||||
|
||||
* Включите *Kill Switch*, проверьте, что в QGC появилось соответствующее уведомление.
|
||||
* Переведите коптер в состояние *Armed*, а затем включите *Kill Switch*. Убедитесь, что моторы выключились. Затем переключите тумблер *Kill Switch* в изначальное положение. Если коптер автоматически не перешел в состояние *Disarmed* из-за бездействия, моторы снова начнут вращаться.
|
||||
|
||||
> **Caution** Переводите коптер в состояние *Armed* только на полетной зоне.
|
||||
|
||||
Убедитесь, что режимы переключаются удобными для вас тумблерами. В противном случае измените их в соответствии со [статьей по настройке полетных режимов](modes.md). Повторите приведенные действия несколько раз, для того, чтобы запомнить какие тумблеры за что отвечают.
|
||||
|
||||
## Работа с газом
|
||||
|
||||
Первым делом необходимо почувствовать отзывчивость коптера на движение стика газа и научиться им управлять. Каждый коптер имеет немного различные запасы мощности и соответственно отрывается от земли при разных положениях стика.
|
||||
|
||||
В данном упражнении необходимо использовать только стик газа. Во время выполнения упражнения рекомендуется не использовать остальные стики.
|
||||
|
||||
Основные задания упражнения:
|
||||
|
||||
1. Дрейф коптера по земле, не отрываясь от земли.
|
||||
|
||||
### Предполетные проверки
|
||||
|
||||
Перед взлетом выполняйте следующие действия:
|
||||
|
||||
1. Проверьте целостность коптера и возможность вращения пропеллеров.
|
||||
2. Убедитесь, что коптер находится задней частью к вам.
|
||||
3. Включите коптер путем подключения АКБ.
|
||||
4. Отойдите на безопасное расстояние. Рекомендуется соблюдать расстояние до коптера минимум 4–5 м.
|
||||
5. Убедитесь, что коптер находится в режиме *Stabilized*.
|
||||
|
||||
Не пытайтесь сразу оторвать коптер от земли, найдите минимально возможное положение стика для того, чтобы коптер начал дрейфовать по земле. В противном случае это может привести к поломкам или травмам.
|
||||
|
||||
> **Caution** В случае потери контроля над коптером необходимо сразу включать *Kill Switch*.
|
||||
|
||||
**Упражнение №1**. Медленно поднимайте стик газа вверх, пока коптер не начнет двигаться. В этот момент он начнет медленно дрейфовать по земле. Оставьте стик газа в таком положении и подождите пару секунд, затем переведите стик в изначальное положение, чтобы посадить коптер. После посадки коптера выключите моторы переведя в состояние *Disarmed*. Повторите упражнение 5-10 раз, чтобы лучше чувствовать отзывчивость коптера на стик газа.
|
||||
|
||||
**Упражнение №2**. Медленно поднимайте стик газа вверх, пока коптер на начнет немного отрываться от земли. Оставьте стик газа в таком положении и подождите пару секунд, затем посадите коптер аналогично упражнению №1. Повторите упражнение 10-15 раз.
|
||||
|
||||
**Упражнение №3**. Поднимайте стик газа, пока коптер не начнет дрейфовать по земле, подождите секунду и продолжайте увеличивать газ до момента, когда коптер начнет отрываться от земли, подождите секунду и посадите коптер. Для закрепления повторяйте упражнения 10-15 раз, при необходимости увеличивая количество повторений.
|
||||
|
||||
## Работа с креном и тангажом
|
||||
|
||||
После освоения управления газом коптера, необходимо научиться управлять его горизонтальным положением. За это отвечает правый стик на радоаппаратуре.
|
||||
|
||||
Управление данными осями интуитивно понятно:
|
||||
|
||||
* Стик наклонен вперед (вверх) – коптер движется вперед.
|
||||
* Стик наклонен назад (вниз) – коптер движется назад.
|
||||
* Стик наклонен вправо – коптер движется вправо.
|
||||
* Стик наклонен влево – коптер движется влево.
|
||||
|
||||
Чем сильнее стик будет наклонен в сторону, тем сильнее коптер будет наклоняться в сторону быстрее двигаться.
|
||||
|
||||
Основные задания упражнения:
|
||||
|
||||
1. Полет по оси X, вперед/назад.
|
||||
2. Полет по оси Y, влево/вправо.
|
||||
3. Стабилизация коптера на одном месте.
|
||||
4. Полет по квадрату по часовой стреле и против.
|
||||
|
||||
> **Hint** Старайтесь всегда находится позади коптера, таким образом, чтобы его задняя часть была направлена к вам, иначе вы можете потерять управление над ним, перепутав стороны.
|
||||
|
||||
Как и в случае с управлением газом, перед полетом выполняйте [следующие действия](#предполетные-проверки).
|
||||
|
||||
> **Hint** Если коптер сильно вращается вокруг своей оси, посадите его и повторно откалибруйте магнитометр и гироскоп.
|
||||
|
||||
**Упражнение №1**. Аналогично упражнениям по управлению газом поднимайте стик газа, пока коптер на начнет дрейфовать по земле или немного подпрыгивать, затем отпустите стик газа, оставив его в таком положении, и поднимайте стик тангажа, сначала вверх, на протяжении секунды, затем вниз. При этом коптер будет постепенно перемещаться сначала от вас, а затем к вам. Повторите упражнение 5-10 раз, пока не почувствуете отзывчивость коптера на движение стика.
|
||||
|
||||
**Упражнение №2**. Поднимайте стик газа, пока коптер не начнет дрейфовать, затем оставьте его и перемещайте стик крена сначала вправо, на протяжении секунды, затем влево. При этом коптер будет постепенно перемещаться сначала вправо, а затем влево. Повторите упражнение 5-10 раз, пока не почувствуете отзывчивость коптера на движение стика.
|
||||
|
||||
**Упражнение №3**. Поднимайте стик газа, пока коптер не начнет дрейфовать, затем оставьте его. Совместите первое и второе упражнение и постарайтесь стабилизировать коптер в одной точке, компенсируя его дрейф с помощью стика. Удерживайте коптер 20-30 секунд.
|
||||
|
||||
**Упражнение №4**. Поднимайте стик газа, пока коптер не начнет дрейфовать, затем оставьте его. Почувствовав отзывчивость коптера на изменения стиков выполните фигуру "квадрат" со стороной 1 м, сначала по часовой стрелке, а затем против. Выполняйте фигуры по 2-3 раза.
|
||||
|
||||
## Воздушная подушка и управление в ней
|
||||
|
||||
Понятие *воздушной подушки* очень важно во всей летательной технике. Сама по себе воздушная подушка является зоной повышенного давления, возникающая за счет воздуха пропускаемого через пропеллеры. Данная область харрактеризуется турбелентностями и воздушными потоками влияющими на полет коптера.
|
||||
|
||||
Пилоты стараются избегать полетов в воздушной подушке, но на ее границе имеется стабильная область, в которой коптер может зависнуть при минимальном значении газа. В таком случае создается ощущение, что коптер "сел" на воздушную подушку.
|
||||
|
||||
Главная особенность и приемущество такого полета заключается в том, что коптер не будет изменять высоту при одном значении газа.
|
||||
|
||||
Основные задания:
|
||||
|
||||
1. Стабилизация коптера на одном месте.
|
||||
2. Полет по квадрату.
|
||||
3. Полет по кругу.
|
||||
|
||||
Аналогично с предыдущими упражнениями перед взлетом выполните [следующие действия](#предполетные-проверки).
|
||||
|
||||
**Упражнение №1**. Поднимайте стик газа, пока коптер не пролетит воздушную подушку и не окажется над ней (высота от пола ~25-30 см, для коптера Клевер 4). Коптер не должен подниматься вверх или проваливаться вниз, высота полета должа стабилизироваться. Как и в предыдущем упражнении корректируйте позицию коптера по осям X, Y с помощью стика крена и тангажа. В результате коптер должен зависнуть в одной точке с небольшими покачиваниями по сторонам. Удерживайте коптер 30-40 секунд.
|
||||
|
||||
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Далее пролетите по квадрату со стороной 1 м сначала по часовой стрелке, потом против часовой стрели. Повторите траекторию в каждую сторону 2-3 раза.
|
||||
|
||||
**Упражнение №3**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Попробуйте описать коптером круг с диаметром 1 м, по часовой и против часовой стрелки. Повторите траекторию в каждую сторону 2-3 раза.
|
||||
|
||||
## Работа с рысканьем
|
||||
|
||||
При визуальном управлении мультикоптерными устройствами, рысканье не играет на столько важной роли, как с самолетной технике, поскольку коптер может передвигаться в любую сторону вне зависимости от того, куда он направлен.
|
||||
|
||||
> **Info** Термин *рысканье* (*yaw*) обозначает поворот коптера вокруг вертикальной оси.
|
||||
|
||||
Основные задания:
|
||||
|
||||
1. Оборот коптера вокруг себя, ориентируя заднюю часть коптера к себе.
|
||||
2. Оборот вокруг коптера, ориентируя заднюю часть к себе.
|
||||
|
||||
Для выполнения представленных упражнений рекомендуется найти большое свободное пространство.
|
||||
|
||||
Аналогично с предыдущими упражнениями перед взлетом выполните [предполетные проверки](#предполетные-проверки).
|
||||
|
||||
**Упражнение №1**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Описывайте коптером круг вокруг себя, на расстоянии 2-3 м, при этом поворачивая его таким образом, чтобы задняя часть коптера всегда была направлен на вас. Выполняйте упражнение по часовой стрелке и против. Повторите упражнение 4-5 раз.
|
||||
|
||||
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Обойдите коптер вокруг, при этом поворачивая его таким образом, чтобы задяя часть была направлена на вас. Обходите коптер по часовой стрелке и против. Повторите упражнение 4-5 раз.
|
||||
|
||||
> **Caution** Дополнительные упражнения значительно сложнее обычных и не обязательны к выполнению. Приступайте к ним, только если вы уже уверенно управляете коптером.
|
||||
|
||||
**Дополнительное упражнение №1**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Разверните коптер передней частью к себе и пробуйте управлять им задом наперед.
|
||||
|
||||
**Дополнительное упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Выполняйте полет таким образом, чтобы передняя часть коптера всегда смотрела в сторону его движения.
|
||||
|
||||
## Свободный полет
|
||||
|
||||
Если вы можете выполнить каждое из описанных выше упражнений, скорее всего, вы уже умеете свободно взлетать и управлять коптером. Далее будут представленны некоторые упражнения для закрепления полученных навыков.
|
||||
|
||||
Упражнения:
|
||||
|
||||
* Полет по вертикальному квадрату.
|
||||
* Полет по граням куба.
|
||||
* Полет по вертикальному кругу.
|
||||
* Полет по восьмерке.
|
||||
* Подъем коптера по спирали.
|
||||
|
||||
Закрепляйте полученные навыки необходимое для вас количество раз.
|
||||
@@ -10,7 +10,7 @@
|
||||
* `map` — координаты относительно точки инициализации полетного контроллера: белая сетка на иллюстрации;
|
||||
* `base_link` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации;
|
||||
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синяя и зеленая линии на иллюстрации;
|
||||
* `navigate_target` – координаты точки, в которую сейчас летит дрон (с использованием [navigate](simple_offboard.md#navigate));
|
||||
* <a name="navigate_target"></a>`navigate_target` – координаты точки, в которую сейчас летит дрон (с использованием [navigate](simple_offboard.md#navigate));
|
||||
* `setpoint` – текущий setpoint по позиции.
|
||||
|
||||
При использовании [системы позиционирования по ArUco-маркерам](aruco.md) появляются дополнительные фреймы:
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
// Connection callback
|
||||
alert('Connected');
|
||||
});
|
||||
|
||||
|
||||
// Declare get_telemetry service client
|
||||
var getTelemetry = new ROSLIB.Service({ ros: ros, name : '/get_telemetry', serviceType : 'clover/GetTelemetry' });
|
||||
|
||||
@@ -49,6 +49,6 @@
|
||||
|
||||
## Браузерная GCS
|
||||
|
||||
Смотрите также пример реализации упрощенной браузерной наземной станции (GCS) на Клевере по адресу http://192.168.11.1/clover/gcs.html.
|
||||
Смотрите также пример реализации ([`gcs.html`](https://github.com/CopterExpress/clover/blob/master/clover/www/gcs.html), [`gcs.js`](https://github.com/CopterExpress/clover/blob/master/clover/www/js/gcs.js)) упрощенной браузерной наземной станции (GCS) на Клевере по адресу http://192.168.11.1/clover/gcs.html.
|
||||
|
||||
<img src="../assets/web-gcs.png" class="center zoom"/>
|
||||
|
||||
@@ -52,15 +52,18 @@ rostopic echo /rangefinder/range
|
||||
Для получения данных из топика создайте подписчика:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from sensor_msgs.msg import Range
|
||||
|
||||
# ...
|
||||
rospy.init_node('flight')
|
||||
|
||||
def range_callback(msg):
|
||||
# Обработка новых данных с дальномера
|
||||
print 'Rangefinder distance:', msg.range
|
||||
|
||||
rospy.Subscriber('rangefinder/range', Range, range_callback)
|
||||
|
||||
rospy.spin() # дальнейший код программы
|
||||
```
|
||||
|
||||
Также существует возможность однократного получения данных с дальномера:
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
## Система позиционирования {#positioning}
|
||||
|
||||
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование система позиционирования. Такая система должна вычислять и сообщать дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
|
||||
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система должна вычислять и сообщать дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
|
||||
|
||||
### Optical flow
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
|
||||
## Автономный полет {#flight}
|
||||
|
||||
> **Info** Для изучения языка программирования Python обращайтесь к [самоучителю](https://pythonworld.ru/samouchitel-python).
|
||||
|
||||
После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов [подключитесь в Raspberry Pi по SSH](ssh.md). Для того, чтобы запустить Python-скрипт, используйте команду `python`:
|
||||
|
||||
```bash
|
||||
@@ -74,7 +76,7 @@ rospy.sleep(3)
|
||||
land()
|
||||
```
|
||||
|
||||
> **note** Функция navigate не ожидает, пока дрон долетит до целевой точки; скрипт продолжит выполнение сразу. Для блокирующей версии смотрите пример функции [`navigate_wait`](snippets.md#block-nav).
|
||||
> **note** Функция navigate не ожидает, пока дрон долетит до целевой точки; скрипт продолжит выполнение сразу. Для блокирующей версии смотрите пример функции [`navigate_wait`](snippets.md#navigate_wait).
|
||||
|
||||
Обратите внимание, что параметр `auto_arm` установлен на `True` только у первого вызова функции `navigate`. Этот параметр армит дрон и переводит его в режим автономного полета (OFFBOARD).
|
||||
|
||||
|
||||
@@ -2,20 +2,34 @@
|
||||
|
||||
Список возможных проектов для стажировок и практических работ в вузах и колледжах.
|
||||
|
||||
|Проект|Примечания|
|
||||
|Проект/Идея|Примечания|
|
||||
|------|----------|
|
||||
|Шоу дронов|[Решение от COEX](https://github.com/CopterExpress/clever-show) (разработка началась по программе стажировок).|
|
||||
|Интеграция позиционирования по [Vive Tracker](https://www.vive.com/ru/accessory/vive-tracker/)|[Наработки](https://github.com/goldarte/roslibsurvive)|
|
||||
|Интеграция системы позиционирования [Pozyx](https://www.pozyx.io)|[Наработки](https://github.com/goldarte/pozyx_clever)|
|
||||
|Шоу дронов|[Решение от COEX](https://github.com/CopterExpress/clever-show) (разработка началась по программе стажировок). Проект продолжает разрабатываться.|
|
||||
|Интеграция позиционирования по [Vive Tracker](https://www.vive.com/ru/accessory/vive-tracker/)|[Наработки](https://github.com/goldarte/roslibsurvive).|
|
||||
|Интеграция системы позиционирования [Pozyx](https://www.pozyx.io)|[Наработки](https://github.com/goldarte/pozyx_clever).|
|
||||
|Интеграция системы позиционирования типа Motion Capture||
|
||||
|Разработка и интеграция дешевого Motion Capture||
|
||||
|Интеграция блочного программирования (Scratch, Blockly)|[Решение с программы стажировок](clever_blocks.md). Официальное решение COEX в разработке.|
|
||||
|Интеграция блочного программирования (Scratch, Blockly)|[Решение с программы стажировок](clever_blocks.md). Официальное решение COEX [в разработке](https://github.com/CopterExpress/clover/tree/blockly).|
|
||||
|Улучшение алгоритма визуального позиционирования (optical flow): трекинг по фичам, расчет угла по yaw||
|
||||
|Симулятор Клевера|[Решение COEX](https://github.com/CopterExpress/clover_vm) (на основе Gazebo)|
|
||||
|Автоматический захват грузов Клевером|Впервые было [реализовано](https://www.youtube.com/watch?v=E1_ehvJRKxg) на Олимпиаде НТИ 2019|
|
||||
|Симулятор Клевера|[Решение от COEX](https://github.com/CopterExpress/clover_vm) (на основе Gazebo). Проект продолжает разрабатываться.|
|
||||
|Облачная платформа для симулятора Клевера|По аналогии или на основе [ROS Development Studio](http://rosds.online/).|
|
||||
|Автоматический захват грузов Клевером|Впервые было [реализовано](https://www.youtube.com/watch?v=E1_ehvJRKxg) на Олимпиаде НТИ 2019.|
|
||||
|Распознавание и ловля летящих объектов (шариков)||
|
||||
|Веб-инструмент для калибровки камеры||
|
||||
|Инструмент для редактирования карт маркеров|[Решение с программы стажировок](arucogenmap.md)|
|
||||
|Точный полет по линии|[Решение с программы стажировок](https://github.com/Tennessium/robohuyna)|
|
||||
|Двойные, тройные, четверные флипы||
|
||||
|Граффити-дрон|https://tsuru.su/project/graffiti-drone/|
|
||||
|Двойные, тройные, четверные флипы|Исследование стратегий и конфигураций. [Двойные флипы на Клевере](https://www.youtube.com/watch?v=AzVs-DRPE5A).<br>["A Simple Learning Strategy for High-Speed Quadrocopter Multi-Flips"](https://ethz.ch/content/dam/ethz/special-interest/mavt/dynamic-systems-n-control/idsc-dam/Research_DAndrea/FMA/LupashinSchoellig_ICRA2010.pdf).|
|
||||
|Граффити-дрон|[Пример реализации на другой платформе](https://tsuru.su/project/graffiti-drone/).|
|
||||
|Коптер-официант||
|
||||
|Автоматическая зарядная станция для Клевера||
|
||||
|Полет за другим дроном / перехват другого дрона||
|
||||
|Рама Клевера 4 на 3D-принтере||
|
||||
|Измерения уровня загрязнения воздуха / газоанализатор на дроне||
|
||||
|Полет двух коптеров в жесткой связке||
|
||||
|Автоматический подсчёт автомобилей на трассах||
|
||||
|Программное определение падений в PX4||
|
||||
|Начало полета в броске|[Throw Mode](https://ardupilot.org/copter/docs/throw-mode.html) в ArduPilot.|
|
||||
|Полет коптера на точку на изображении с камеры, направленной вертикально вниз||
|
||||
|Зарядная станция для коптера на солнечном концентраторе|<!-- placeholder for gitbook-->|
|
||||
|
||||
Вышеперечисленные и другие проекты вы также можете реализовать в рамках конкурса проектов [Copter Hack](https://ru.coex.tech/copterhack). Мы приглашаем команды для реализации проектов и в других форматах.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Общая информация
|
||||
# Симулятор
|
||||
|
||||
Среда симуляции Клевера позволяет пользователям запускать и отлаживать свой код в симуляторе, используя большинство функций, доступных на реальном дроне. Симулятор использует [режим PX4 SITL](sitl.md) и тот же код, использующий ROS, что и настоящий дрон. Большинство железа также симулируется.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Сборка на собственной машине
|
||||
|
||||
Настройка среды для симуляции с нуля требует некоторых усилий, однако это приведет к улучшению производительности и к уменьшению вероятности появления проблем с драйверами.
|
||||
Настройка среды для симуляции с нуля требует некоторых усилий, однако это приведет к улучшению производительности и к уменьшению вероятности появления проблем с драйверами.
|
||||
|
||||
Требования для сборки: установлены Ubuntu 18.04 и [ROS](ros-install.md).
|
||||
|
||||
@@ -57,10 +57,10 @@ sudo ./ubuntu.sh --no-nuttx
|
||||
Пакет `sitl_gazebo`, содержащий плагины нужно пропатчить, из-за недавних изменений в MAVLink. Эти патчи уже применены в [образе виртуальной машины](simulation_vm.md) и хранятся в репозитории CopterExpress/VM. Запустите следующие команды для загрузки и применения патчей:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/Firmware/Tools/sitl_gazebo
|
||||
wget https://raw.githubusercontent.com/CopterExpress/clover_vm/master/assets/patches/sitl_gazebo.patch
|
||||
cd ~/catkin_ws/src/Firmware/Tools/sitl_gazebo
|
||||
wget https://raw.githubusercontent.com/CopterExpress/clover_vm/master/assets/patches/sitl_gazebo.patch
|
||||
patch -p1 < sitl_gazebo.patch
|
||||
rm sitl_gazebo.patch
|
||||
rm sitl_gazebo.patch
|
||||
```
|
||||
|
||||
## Установка датасетов geographiclib
|
||||
@@ -69,7 +69,7 @@ rm sitl_gazebo.patch
|
||||
|
||||
```bash
|
||||
cd ~
|
||||
wget https://raw.githubusercontent.com/mavlink/mavros/6f5bd5a1a67c19c2e605f33de296b1b1be9d02fc/mavros/scripts/install_geographiclib_datasets.sh
|
||||
wget https://raw.githubusercontent.com/mavlink/mavros/6f5bd5a1a67c19c2e605f33de296b1b1be9d02fc/mavros/scripts/install_geographiclib_datasets.sh
|
||||
chmod +x ./install_geographiclib_datasets.sh
|
||||
sudo ./install_geographiclib_datasets.sh
|
||||
rm ./install_geographiclib_datasets.sh
|
||||
|
||||
@@ -12,7 +12,7 @@ source ~/catkin_ws/devel/setup.bash
|
||||
roslaunch clover_simulation simulator.launch
|
||||
```
|
||||
|
||||
> **Note** Кроме того, если вы используете виртуальную машину, просто дважды щелкните `Gazebo PX4` на рабочем столе.
|
||||
> **Note** Кроме того, если вы используете виртуальную машину, просто дважды щелкните `Gazebo PX4` на рабочем столе.
|
||||
|
||||
Это запустит Gazebo сервер и клиент, бинарные файлы PX4 и ноды Клевера. Терминал, в котором была запущена команда, будет отображать отладочные сообщения от нод и PX4, а также принимать входные данные для интерпретатора команд PX4:
|
||||
|
||||
@@ -79,7 +79,7 @@ PX4, начиная с версии 1.9, поддерживает [принуд
|
||||
PX4_SIM_SPEED_FACTOR=0.42 roslaunch clover_simulation simulator.launch
|
||||
```
|
||||
|
||||
> **Note** При использовании виртуальной машины удобнее добавить эту переменную в ярлык запуска Gazebo на рабочем столе. Нажмите правой кнопкой на значок Gazebo, выберите "Properties..." и добавьте `PX4_SIM_SPEED_FACTOR=0.42` в поле Command, как показано на иллюстрации:
|
||||
> **Note** При использовании виртуальной машины удобнее добавить эту переменную в ярлык запуска Gazebo на рабочем столе. Нажмите правой кнопкой на значок Gazebo, выберите "Properties..." и добавьте `PX4_SIM_SPEED_FACTOR=0.42` в поле Command, как показано на иллюстрации:
|
||||

|
||||
|
||||
### Выделение ресурсов для виртуальной машины
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
Примеры кода
|
||||
===
|
||||
# Примеры кода
|
||||
|
||||
Python
|
||||
---
|
||||
## Python
|
||||
|
||||
<!-- markdownlint-disable MD031 -->
|
||||
|
||||
@@ -13,7 +11,80 @@ Python
|
||||
|
||||
<!-- markdownlint-enable MD031 -->
|
||||
|
||||
### # {#distance}
|
||||
### # {#navigate_wait}
|
||||
|
||||
<a name="block-nav"></a><!-- old name of anchor -->
|
||||
|
||||
<a name="block-takeoff"></a><!-- old name of anchor -->
|
||||
|
||||
Полет в точку и ожидание окончания полета:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Для того, чтобы определить расстояние до целевой точки, функция использует фрейм [`navigate_target`](frames.md#navigate_target).
|
||||
|
||||
Использование функции для полета в точку x=3, y=2, z=1 [относительно карты маркеров](aruco_map.md):
|
||||
|
||||
```python
|
||||
navigate_wait(x=3, y=2, z=1, frame_id='aruco_map')
|
||||
```
|
||||
|
||||
Эту функцию можно использовать и для взлета:
|
||||
|
||||
```python
|
||||
navigate_wait(z=1, frame_id='body', auto_arm=True)
|
||||
```
|
||||
|
||||
### # {#land_wait}
|
||||
|
||||
<a name="block-land"></a><!-- old name of anchor -->
|
||||
|
||||
Посадка и ожидание окончания посадки:
|
||||
|
||||
```python
|
||||
def land_wait():
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Использование:
|
||||
|
||||
```python
|
||||
land_wait()
|
||||
```
|
||||
|
||||
### # {#wait_arrival}
|
||||
|
||||
Ожидание окончания прилета в [navigate](simple_offboard.md#navigate)-точку:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def wait_arrival(tolerance=0.2):
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#get_distance}
|
||||
|
||||
Функция определения расстояния между двумя точками (**важно**: точки должны быть в одной [системе координат](frames.md)):
|
||||
|
||||
@@ -26,7 +97,7 @@ def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
|
||||
```
|
||||
|
||||
### # {#distance-global}
|
||||
### # {#get_distance_global}
|
||||
|
||||
Функция для приблизительного определения расстояния (в метрах) между двумя глобальными координатами (широта/долгота):
|
||||
|
||||
@@ -39,111 +110,6 @@ def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
|
||||
### # {#block-takeoff}
|
||||
|
||||
Взлет и ожидание окончания взлета:
|
||||
|
||||
```python
|
||||
z = 2 # высота
|
||||
tolerance = 0.2 # точность проверки высоты (м)
|
||||
|
||||
# Запоминаем изначальную точку
|
||||
start = get_telemetry()
|
||||
|
||||
# Взлетаем на 2 м
|
||||
print navigate(z=z, speed=0.5, frame_id='body', auto_arm=True)
|
||||
|
||||
# Ожидаем взлета
|
||||
while not rospy.is_shutdown():
|
||||
# Проверяем текущую высоту
|
||||
if start.z + z - get_telemetry().z < tolerance:
|
||||
# Взлет завершен
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Вышеприведенный код может быть обернут в функцию:
|
||||
|
||||
```python
|
||||
def takeoff_wait(alt, speed=0.5, tolerance=0.2):
|
||||
start = get_telemetry()
|
||||
print navigate(z=alt, speed=speed, frame_id='body', auto_arm=True)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
if start.z + alt - get_telemetry().z < tolerance:
|
||||
break
|
||||
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#block-nav}
|
||||
|
||||
Лететь в точку и ждать пока коптер долетит в нее:
|
||||
|
||||
```python
|
||||
tolerance = 0.2 # точность проверки прилета (м)
|
||||
frame_id='aruco_map'
|
||||
|
||||
# Летим в точку 1:2:3 в поле ArUco-маркеров
|
||||
print navigate(frame_id=frame_id, x=1, y=2, z=3, speed=0.5)
|
||||
|
||||
# Ждем, пока коптер долетит до запрошенной точки
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id=frame_id)
|
||||
# Вычисляем расстояние до заданной точки
|
||||
if get_distance(1, 2, 3, telem.x, telem.y, telem.z) < tolerance:
|
||||
# Долетели до необходимой точки
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Вышеприведенный код может быть обернут в функцию:
|
||||
|
||||
```python
|
||||
def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id=frame_id)
|
||||
if get_distance(x, y, z, telem.x, telem.y, telem.z) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Более универсальная функция с использованием фрейма `navigate_target`, который совпадает с целевой точкой навигации дрона:
|
||||
|
||||
```python
|
||||
def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Такой код может быть использован для полета в том числе с использованием фрейма `body`.
|
||||
|
||||
### # {#block-land}
|
||||
|
||||
Посадка и ожидание окончания посадки:
|
||||
|
||||
```python
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Вышеприведенный код может быть обернут в функцию:
|
||||
|
||||
```python
|
||||
def land_wait():
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#disarm}
|
||||
|
||||
Дизарм коптера (выключение винтов, **коптер упадет**):
|
||||
|
||||
Reference in New Issue
Block a user