Anton Matosov
10 years ago
2 changed files with 159 additions and 156 deletions
@ -1,156 +0,0 @@ |
|||||||
#!/usr/bin/tclsh |
|
||||||
# |
|
||||||
# Generate multirotor mixer scale tables compatible with the ArduCopter layout |
|
||||||
# |
|
||||||
|
|
||||||
puts "/*" |
|
||||||
puts "* These file is automatically generated by multi_tables - do not edit." |
|
||||||
puts "*/" |
|
||||||
puts "" |
|
||||||
|
|
||||||
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 { |
|
||||||
18.8 0.4242 |
|
||||||
-18.8 1.0 |
|
||||||
-18.8 -0.4242 |
|
||||||
18.8 -1.0 |
|
||||||
} |
|
||||||
|
|
||||||
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 hex_cox { |
|
||||||
60 CW |
|
||||||
60 CCW |
|
||||||
180 CW |
|
||||||
180 CCW |
|
||||||
-60 CW |
|
||||||
-60 CCW |
|
||||||
} |
|
||||||
|
|
||||||
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 octa_cox { |
|
||||||
45 CCW |
|
||||||
-45 CW |
|
||||||
-135 CCW |
|
||||||
135 CW |
|
||||||
-45 CCW |
|
||||||
45 CW |
|
||||||
135 CCW |
|
||||||
-135 CW |
|
||||||
} |
|
||||||
|
|
||||||
set twin_engine { |
|
||||||
90 0.0 |
|
||||||
-90 0.0 |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
set tables {quad_x quad_plus quad_v quad_wide hex_x hex_plus hex_cox octa_x octa_plus octa_cox twin_engine} |
|
||||||
|
|
||||||
puts "enum MultirotorMixer::Geometry : unsigned int {" |
|
||||||
foreach table $tables { |
|
||||||
puts [format "\t%s," [string toupper $table]] |
|
||||||
} |
|
||||||
puts "\n\tMAX_GEOMETRY" |
|
||||||
puts "}; // enum MultirotorMixer::Geometry\n" |
|
||||||
|
|
||||||
|
|
||||||
puts "namespace {" |
|
||||||
|
|
||||||
proc factors {a d} { puts [format "\t{ %9.6f, %9.6f, %9.6f }," [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 |
|
||||||
} elseif {$dir == "CCW"} { |
|
||||||
set dd 1.0 |
|
||||||
} else { |
|
||||||
set dd $dir |
|
||||||
} |
|
||||||
factors $angle $dd |
|
||||||
} |
|
||||||
puts "};\n" |
|
||||||
} |
|
||||||
|
|
||||||
puts "const MultirotorMixer::Rotor *_config_index\[\] = {" |
|
||||||
foreach table $tables { |
|
||||||
puts [format "\t&_config_%s\[0\]," $table] |
|
||||||
} |
|
||||||
puts "};\n" |
|
||||||
|
|
||||||
puts "const unsigned _config_rotor_count\[\] = {" |
|
||||||
foreach table $tables { |
|
||||||
upvar #0 $table angles |
|
||||||
puts [format "\t%u, /* %s */" [expr [llength $angles] / 2] $table] |
|
||||||
} |
|
||||||
puts "};\n" |
|
||||||
|
|
||||||
puts "} // anonymous namespace\n" |
|
||||||
|
|
||||||
# Newline at the end of file |
|
||||||
puts "" |
|
@ -0,0 +1,159 @@ |
|||||||
|
#!/usr/bin/python |
||||||
|
# |
||||||
|
# Generate multirotor mixer scale tables compatible with the ArduCopter layout |
||||||
|
# |
||||||
|
|
||||||
|
import math |
||||||
|
|
||||||
|
print "/*" |
||||||
|
print "* These file is automatically generated by multi_tables.py - do not edit." |
||||||
|
print "*/" |
||||||
|
print "" |
||||||
|
|
||||||
|
def rcos(angleInRadians): |
||||||
|
return math.cos(math.radians(angleInRadians)) |
||||||
|
|
||||||
|
CCW = 1.0 |
||||||
|
CW = -CCW |
||||||
|
|
||||||
|
quad_x = [ |
||||||
|
[ 45, CCW], |
||||||
|
[-135, CCW], |
||||||
|
[-45, CW], |
||||||
|
[135, CW], |
||||||
|
] |
||||||
|
|
||||||
|
quad_plus = [ |
||||||
|
[ 90, CCW], |
||||||
|
[ -90, CCW], |
||||||
|
[ 0, CW], |
||||||
|
[ 180, CW], |
||||||
|
] |
||||||
|
|
||||||
|
quad_v = [ |
||||||
|
[ 18.8, 0.4242], |
||||||
|
[ -18.8, 1.0], |
||||||
|
[ -18.8, -0.4242], |
||||||
|
[ 18.8, -1.0], |
||||||
|
] |
||||||
|
|
||||||
|
quad_wide = [ |
||||||
|
[ 68, CCW], |
||||||
|
[ -129, CCW], |
||||||
|
[ -68, CW], |
||||||
|
[ 129, CW], |
||||||
|
] |
||||||
|
|
||||||
|
hex_x = [ |
||||||
|
[ 90, CW], |
||||||
|
[ -90, CCW], |
||||||
|
[ -30, CW], |
||||||
|
[ 150, CCW], |
||||||
|
[ 30, CCW], |
||||||
|
[-150, CW], |
||||||
|
] |
||||||
|
|
||||||
|
hex_plus = [ |
||||||
|
[ 0, CW], |
||||||
|
[ 180, CCW], |
||||||
|
[-120, CW], |
||||||
|
[ 60, CCW], |
||||||
|
[ -60, CCW], |
||||||
|
[ 120, CW], |
||||||
|
] |
||||||
|
|
||||||
|
hex_cox = [ |
||||||
|
[ 60, CW], |
||||||
|
[ 60, CCW], |
||||||
|
[ 180, CW], |
||||||
|
[ 180, CCW], |
||||||
|
[ -60, CW], |
||||||
|
[ -60, CCW], |
||||||
|
] |
||||||
|
|
||||||
|
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], |
||||||
|
] |
||||||
|
|
||||||
|
octa_plus = [ |
||||||
|
[ 0, CW], |
||||||
|
[ 180, CW], |
||||||
|
[ 45, CCW], |
||||||
|
[ 135, CCW], |
||||||
|
[ -45, CCW], |
||||||
|
[-135, CCW], |
||||||
|
[ -90, CW], |
||||||
|
[ 90, CW], |
||||||
|
] |
||||||
|
|
||||||
|
octa_cox = [ |
||||||
|
[ 45, CCW], |
||||||
|
[ -45, CW], |
||||||
|
[-135, CCW], |
||||||
|
[ 135, CW], |
||||||
|
[ -45, CCW], |
||||||
|
[ 45, CW], |
||||||
|
[ 135, CCW], |
||||||
|
[-135, CW], |
||||||
|
] |
||||||
|
|
||||||
|
twin_engine = [ |
||||||
|
[ 90, 0.0], |
||||||
|
[-90, 0.0], |
||||||
|
] |
||||||
|
|
||||||
|
def variableName(variable): |
||||||
|
for variableName, value in list(globals().iteritems()): |
||||||
|
if value is variable: |
||||||
|
return variableName |
||||||
|
|
||||||
|
tables = [quad_x, quad_plus, quad_v, quad_wide, hex_x, hex_plus, hex_cox, octa_x, octa_plus, octa_cox, twin_engine] |
||||||
|
|
||||||
|
|
||||||
|
def printEnum(): |
||||||
|
print "enum MultirotorMixer::Geometry : unsigned int {" |
||||||
|
for table in tables: |
||||||
|
print "\t{},".format(variableName(table).upper()) |
||||||
|
|
||||||
|
print "\n\tMAX_GEOMETRY" |
||||||
|
print "}; // enum MultirotorMixer::Geometry\n" |
||||||
|
|
||||||
|
def printScaleTables(): |
||||||
|
for table in tables: |
||||||
|
print "const MultirotorMixer::Rotor _config_{}[] = {{".format(variableName(table)) |
||||||
|
for (angle, yawScale) in table: |
||||||
|
rollScale = rcos(angle + 90) |
||||||
|
pitchScale = rcos(angle) |
||||||
|
print "\t{{ {:9f}, {:9f}, {:9f} }},".format(rollScale, pitchScale, yawScale) |
||||||
|
print "};\n" |
||||||
|
|
||||||
|
def printScaleTablesIndex(): |
||||||
|
print "const MultirotorMixer::Rotor *_config_index[] = {" |
||||||
|
for table in tables: |
||||||
|
print "\t&_config_{}[0],".format(variableName(table)) |
||||||
|
print "};\n" |
||||||
|
|
||||||
|
|
||||||
|
def printScaleTablesCounts(): |
||||||
|
print "const unsigned _config_rotor_count[] = {" |
||||||
|
for table in tables: |
||||||
|
print "\t{}, /* {} */".format(len(table), variableName(table)) |
||||||
|
print "};\n" |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printEnum() |
||||||
|
|
||||||
|
print "namespace {" |
||||||
|
printScaleTables() |
||||||
|
printScaleTablesIndex() |
||||||
|
printScaleTablesCounts() |
||||||
|
|
||||||
|
print "} // anonymous namespace\n" |
Loading…
Reference in new issue