#!/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 quad_v { 68 CCW -136 CCW -68 CW 136 CW } set quad_wide { 68 CCW -129 CCW -68 CW 129 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 quad_v quad_wide 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 "};"