You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
1.4 KiB
93 lines
1.4 KiB
#!/usr/bin/tclsh |
|
# |
|
# Generate multirotor mixer scale tables compatible with the ArduCopter layout |
|
# |
|
|
|
proc rad {a} { expr ($a / 360.0) * 2 * acos(-1) } |
|
proc rcos {a} { expr cos([rad $a])} |
|
|
|
set quad_x { |
|
45 CCW |
|
-135 CCW |
|
-45 CW |
|
135 CW |
|
} |
|
|
|
set quad_plus { |
|
90 CCW |
|
-90 CCW |
|
0 CW |
|
180 CW |
|
} |
|
|
|
set hex_x { |
|
90 CW |
|
-90 CCW |
|
-30 CW |
|
150 CCW |
|
30 CCW |
|
-150 CW |
|
} |
|
|
|
set hex_plus { |
|
0 CW |
|
180 CCW |
|
-120 CW |
|
60 CCW |
|
-60 CCW |
|
120 CW |
|
} |
|
|
|
set octa_x { |
|
22.5 CW |
|
-157.5 CW |
|
67.5 CCW |
|
157.5 CCW |
|
-22.5 CCW |
|
-112.5 CCW |
|
-67.5 CW |
|
112.5 CW |
|
} |
|
|
|
set octa_plus { |
|
0 CW |
|
180 CW |
|
45 CCW |
|
135 CCW |
|
-45 CCW |
|
-135 CCW |
|
-90 CW |
|
90 CW |
|
} |
|
|
|
set tables {quad_x quad_plus hex_x hex_plus octa_x octa_plus} |
|
|
|
proc factors {a d} { puts [format "\t{ %9.6f, %9.6f, %5.2f }," [rcos [expr $a + 90]] [rcos $a] [expr -$d]]} |
|
|
|
foreach table $tables { |
|
puts [format "const MultirotorMixer::Rotor _config_%s\[\] = {" $table] |
|
|
|
upvar #0 $table angles |
|
foreach {angle dir} $angles { |
|
if {$dir == "CW"} { |
|
set dd -1.0 |
|
} else { |
|
set dd 1.0 |
|
} |
|
factors $angle $dd |
|
} |
|
puts "};" |
|
} |
|
|
|
puts "const MultirotorMixer::Rotor *_config_index\[MultirotorMixer::Geometry::MAX_GEOMETRY\] = {" |
|
foreach table $tables { |
|
puts [format "\t&_config_%s\[0\]," $table] |
|
} |
|
puts "};" |
|
|
|
puts "const unsigned _config_rotor_count\[MultirotorMixer::Geometry::MAX_GEOMETRY\] = {" |
|
foreach table $tables { |
|
upvar #0 $table angles |
|
puts [format "\t%u, /* %s */" [expr [llength $angles] / 2] $table] |
|
} |
|
puts "};"
|
|
|