2 changed files with 159 additions and 156 deletions
@ -1,156 +0,0 @@
@@ -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 @@
@@ -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