aboutsummaryrefslogtreecommitdiff
path: root/src/modules/systemlib/mixer/multi_tables
blob: 786b63b023ee405570d7b29490623fa52d17e56b (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
157
158
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"