Browse Source

Rewrote multi_tables with python

sbg
Anton Matosov 10 years ago
parent
commit
2daf30fb25
  1. 156
      src/modules/systemlib/mixer/multi_tables
  2. 159
      src/modules/systemlib/mixer/multi_tables.py

156
src/modules/systemlib/mixer/multi_tables

@ -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 ""

159
src/modules/systemlib/mixer/multi_tables.py

@ -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…
Cancel
Save