aboutsummaryrefslogtreecommitdiff
path: root/src/modules/systemlib/mixer/multi_tables
blob: b29bf540aebcedb3b42ac8dcc8b2010c3ee15c9a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/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 ""