Rev 553 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 553 | Rev 554 | ||
---|---|---|---|
1 | #! /usr/bin/env python |
1 | #! /usr/bin/env python |
2 | 2 | ||
3 | # |
3 | # |
4 | # Mikrokopter Vibration Test |
4 | # Mikrokopter Vibration Test |
5 | # |
5 | # |
6 | # Author: FredericG |
6 | # Author: FredericG |
7 | # |
7 | # |
8 | 8 | ||
9 | 9 | ||
10 | import mkProto |
10 | import mkProto |
11 | import time |
11 | import time |
12 | import traceback |
12 | import traceback |
13 | import getopt |
13 | import getopt |
14 | import sys |
14 | import sys |
15 | 15 | ||
16 | 16 | ||
17 | 17 | ||
18 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
18 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
19 | 19 | ||
20 | def usage(): |
20 | def usage(): |
21 | print |
21 | print |
22 | print "VibrationTest.py COMPORT MOTORS SPEEDS CHANNELS [-m MINSPEED] [-s NBSAMPLES] [-n NAME] [-d FILENAME] [-v]" |
22 | print "VibrationTest.py COMPORT MOTORS SPEEDS CHANNELS [-m MINSPEED] [-s NBSAMPLES] [-n NAME] [-d FILENAME] [-v]" |
23 | print " COMPORT Serial port to use. e.g. COM4" |
23 | print " COMPORT Serial port to use. e.g. COM4" |
24 | print " MOTORS Motors to activate during test. Multiple motors can be used at the same time. e.g. 1,2,3,4" |
24 | print " MOTORS Motors to activate during test. Multiple motors can be used at the same time. e.g. 1,2,3,4" |
25 | print " SPEEDS Indicates at what speeds the motors need to be tested. e.g. 50,80,110,140,170" |
25 | print " SPEEDS Indicates at what speeds the motors need to be tested. " |
- | 26 | print " Format 1: e.g. 50,110,140 Tests at speeds 50, 110 and 140" |
|
- | 27 | print " Format 2: e.g. 100-200:50 Tests at speeds 100, 150 and 200" |
|
26 | print " CHANNELS Channels to monitor. e.g. 5,6,7" |
28 | print " CHANNELS Channels to monitor. e.g. 5,6,7" |
27 | i = 0 |
- | |
28 | for channelName in CHANNEL_NAMES: |
29 | for i,channelName in enumerate(CHANNEL_NAMES): |
29 | print " Channel %d = %s" % (i, channelName) |
30 | print " Channel %d = %s" % (i, channelName) |
30 | i += 1 |
- | |
31 | print " -m MINSPEED Minimum speed of the motor(s)" |
31 | print " -m MINSPEED Minimum speed of the motor(s)" |
32 | print " -s NBSAMPLES Number of samples" |
32 | print " -s NBSAMPLES Number of samples" |
33 | print " -n NAME Name of the test" |
33 | print " -n NAME Name of the test" |
34 | print " -d FILENAME File to which the measured values will be logged in" |
34 | print " -d FILENAME File to which the measured values will be logged in" |
35 | print " -v Verbose" |
35 | print " -v Verbose" |
36 | print |
36 | print |
- | 37 | ||
- | 38 | def exit_usage(): |
|
- | 39 | usage() |
|
37 | 40 | sys.exit(2) |
|
38 | 41 | ||
39 | if __name__ == '__main__': |
42 | if __name__ == '__main__': |
40 | 43 | ||
41 | #print sys.argv |
44 | #print sys.argv |
42 | if len(sys.argv)<5: |
45 | if len(sys.argv)<5: |
43 | usage() |
46 | exit_usage() |
44 | sys.exit(2) |
- | |
45 | 47 | ||
46 | parComPort = sys.argv[1] |
48 | parComPort = sys.argv[1] |
47 | parMotors = sys.argv[2].split(',') |
49 | parMotors = sys.argv[2].split(',') |
48 | parSpeeds = sys.argv[3].split(',') |
- | |
49 | parChannels = sys.argv[4].split(',') |
50 | parChannels = sys.argv[4].split(',') |
- | 51 | ||
- | 52 | par = sys.argv[3] |
|
- | 53 | if par.count("-") == 1: |
|
- | 54 | # assume from-to:step format |
|
- | 55 | par = par.split("-") |
|
- | 56 | if len(par) != 2: |
|
- | 57 | exit_usage() |
|
- | 58 | ||
- | 59 | par[1] = par[1].split(":") |
|
- | 60 | if len(par[1]) != 2: |
|
- | 61 | exit_usage() |
|
- | 62 | ||
- | 63 | parSpeeds = range(int(par[0]),int(par[1][0])+int(par[1][1]),int(par[1][1])) |
|
- | 64 | ||
- | 65 | else: |
|
- | 66 | parSpeeds = par.split(',') |
|
50 | 67 | ||
51 | try: |
68 | try: |
52 | opts, args = getopt.getopt(sys.argv[5:], "s:n:d:m:v") |
69 | opts, args = getopt.getopt(sys.argv[5:], "s:n:d:m:v") |
53 | except Exception, err: |
70 | except Exception, err: |
54 | print str(err) # will print something like "option -a not recognized" |
71 | print str(err) # will print something like "option -a not recognized" |
55 | usage() |
72 | usage() |
56 | sys.exit(2) |
73 | sys.exit(2) |
57 | 74 | ||
58 | parVerbose = False |
75 | parVerbose = False |
59 | parFileName = None |
76 | parFileName = None |
60 | parNbSamples = 400 |
77 | parNbSamples = 400 |
61 | parMinSpeed = 25 |
78 | parMinSpeed = 25 |
62 | parTestName = "" |
79 | parTestName = "" |
63 | 80 | ||
64 | for o, a in opts: |
81 | for o, a in opts: |
65 | if o == "-v": |
82 | if o == "-v": |
66 | parVerbose = True |
83 | parVerbose = True |
67 | elif o == "-d": |
84 | elif o == "-d": |
68 | parFileName = a |
85 | parFileName = a |
69 | elif o == "-s": |
86 | elif o == "-s": |
70 | parNbSamples = int(a) |
87 | parNbSamples = int(a) |
71 | elif o == "-m": |
88 | elif o == "-m": |
72 | parMinSpeed = int(a) |
89 | parMinSpeed = int(a) |
73 | elif o == "-n": |
90 | elif o == "-n": |
74 | parTestName = a |
91 | parTestName = a |
75 | 92 | ||
76 | else: |
93 | else: |
77 | assert False, "unhandled option %s" % (o) |
94 | assert False, "unhandled option %s" % (o) |
78 | 95 | ||
79 | if parVerbose: |
96 | if parVerbose: |
80 | print "comPort =", parComPort |
97 | print "comPort =", parComPort |
81 | print "motors =", parMotors |
98 | print "motors =", parMotors |
82 | print "minSpeed =", parMinSpeed |
99 | print "minSpeed =", parMinSpeed |
83 | print "speeds =", parSpeeds |
100 | print "speeds =", parSpeeds |
84 | print "channels =", parChannels |
101 | print "channels =", parChannels |
85 | print "nbSamples=", parNbSamples |
102 | print "nbSamples=", parNbSamples |
86 | print "fileName =", parFileName |
103 | print "fileName =", parFileName |
87 | print "testName =", parTestName |
104 | print "testName =", parTestName |
88 | 105 | ||
89 | 106 | ||
90 | try: |
107 | try: |
91 | parMotors = map(int, parMotors) |
108 | parMotors = map(int, parMotors) |
92 | parSpeeds = map(int, parSpeeds) |
109 | parSpeeds = map(int, parSpeeds) |
93 | parChannels = map(int, parChannels) |
110 | parChannels = map(int, parChannels) |
94 | 111 | ||
95 | 112 | ||
96 | if parVerbose: |
113 | if parVerbose: |
97 | print "Opening comPort... " |
114 | print "Opening comPort... " |
98 | mk = mkProto.MkComm() |
115 | mk = mkProto.MkComm() |
99 | mk.open(comPort=parComPort) |
116 | mk.open(comPort=parComPort) |
100 | 117 | ||
101 | msg = mk.getVersionMsg() |
118 | msg = mk.getVersionMsg() |
102 | voltage = 0 |
119 | voltage = 0 |
103 | if parVerbose: |
120 | if parVerbose: |
104 | print "Version: %d.%d" % msg.getVersion() |
121 | print "Version: %d.%d" % msg.getVersion() |
105 | 122 | ||
106 | msg = mk.getDebugMsg() |
123 | msg = mk.getDebugMsg() |
107 | if (voltage > 4.2*3): |
124 | if (voltage > 4.2*3): |
108 | minVoltage = 4*3.5 |
125 | minVoltage = 4*3.5 |
109 | else: |
126 | else: |
110 | minVoltage = 3*3.5 |
127 | minVoltage = 3*3.5 |
111 | 128 | ||
112 | if parVerbose: |
129 | if parVerbose: |
113 | print "Voltage: %2.1fV" % msg.getVoltage() |
130 | print "Voltage: %2.1fV" % msg.getVoltage() |
114 | print "Minimum Voltage: %2.1fV" % minVoltage |
131 | print "Minimum Voltage: %2.1fV" % minVoltage |
115 | 132 | ||
116 | motorStartSpeeds = [0,0,0,0] |
133 | motorStartSpeeds = [0,0,0,0] |
117 | 134 | ||
118 | if parVerbose: |
135 | if parVerbose: |
119 | print "Starting motor(s) (speed=%d)... " % (parMinSpeed), |
136 | print "Starting motor(s) (speed=%d)... " % (parMinSpeed), |
120 | for i in range(0,parMinSpeed): |
137 | for i in range(0,parMinSpeed): |
121 | time.sleep(.2) |
138 | time.sleep(.2) |
122 | for motor in parMotors: |
139 | for motor in parMotors: |
123 | motorStartSpeeds[motor-1] = i |
140 | motorStartSpeeds[motor-1] = i |
124 | mk.setMotorTest(motorStartSpeeds) |
141 | mk.setMotorTest(motorStartSpeeds) |
125 | 142 | ||
126 | if parVerbose: |
143 | if parVerbose: |
127 | print "OK" |
144 | print "OK" |
128 | 145 | ||
129 | for speed in parSpeeds: |
146 | for speed in parSpeeds: |
130 | if len(parChannels)>1: |
147 | if len(parChannels)>1: |
131 | print |
148 | print |
132 | 149 | ||
133 | if parVerbose: |
150 | if parVerbose: |
134 | print "Setting speed to %3d ..." % speed |
151 | print "Setting speed to %3d ..." % speed |
135 | motorSpeeds = [0,0,0,0] |
152 | motorSpeeds = [0,0,0,0] |
136 | for motor in parMotors: |
153 | for motor in parMotors: |
137 | motorSpeeds[motor-1] = speed |
154 | motorSpeeds[motor-1] = speed |
138 | for i in range(0,10): |
155 | for i in range(0,10): |
139 | time.sleep(.1) |
156 | time.sleep(.1) |
140 | mk.setMotorTest(motorSpeeds) |
157 | mk.setMotorTest(motorSpeeds) |
141 | 158 | ||
142 | for channel in parChannels: |
159 | for channel in parChannels: |
143 | channelName = CHANNEL_NAMES[channel] |
160 | channelName = CHANNEL_NAMES[channel] |
144 | if parVerbose: |
161 | if parVerbose: |
145 | print "Getting data... " , |
162 | print "Getting data... " , |
146 | data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel) |
163 | data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel) |
147 | minval = min(data[1:]) |
164 | minval = min(data[1:]) |
148 | maxval = max(data[1:]) |
165 | maxval = max(data[1:]) |
149 | if (maxval-minval)>100: print data |
166 | if (maxval-minval)>100: print data |
150 | msg = mk.getDebugMsg() |
167 | msg = mk.getDebugMsg() |
151 | voltage = msg.getVoltage() |
168 | voltage = msg.getVoltage() |
152 | 169 | ||
153 | if voltage<minVoltage: |
170 | if voltage<minVoltage: |
154 | print "VOLTAGE TOO LOW, TEST ABORTED" |
171 | print "VOLTAGE TOO LOW, TEST ABORTED" |
155 | sys.exit(2) |
172 | sys.exit(2) |
156 | 173 | ||
157 | print "%s Speed=%3d U=%2.1fV Channel=%-10s Min=%3d Max=%3d pp=%3d" % (parTestName, speed, voltage, channelName, minval, maxval, maxval-minval) |
174 | print "%s Speed=%3d U=%2.1fV Channel=%-10s Min=%3d Max=%3d pp=%3d" % (parTestName, speed, voltage, channelName, minval, maxval, maxval-minval) |
158 | 175 | ||
159 | if parFileName != None: |
176 | if parFileName != None: |
160 | try: |
177 | try: |
161 | logfile = open(parFileName, "r") |
178 | logfile = open(parFileName, "r") |
162 | newFile = False |
179 | newFile = False |
163 | except: |
180 | except: |
164 | newFile = True |
181 | newFile = True |
165 | 182 | ||
166 | if newFile: |
183 | if newFile: |
167 | logfile = open(parFileName, "w") |
184 | logfile = open(parFileName, "w") |
168 | if parVerbose: |
185 | if parVerbose: |
169 | print "Writing result to %s ..." % parFileName, |
186 | print "Writing result to %s ..." % parFileName, |
170 | logfile.write("%s %d %s\n" % (parTestName, speed, channelName)) |
187 | logfile.write("%s %d %s\n" % (parTestName, speed, channelName)) |
171 | for value in data[1:]: |
188 | for value in data[1:]: |
172 | logfile.write("%d\n" % value) |
189 | logfile.write("%d\n" % value) |
173 | logfile.close() |
190 | logfile.close() |
174 | if parVerbose: |
191 | if parVerbose: |
175 | print "OK" |
192 | print "OK" |
176 | else: |
193 | else: |
177 | if parVerbose: |
194 | if parVerbose: |
178 | print "Appending result to %s ..." % parFileName, |
195 | print "Appending result to %s ..." % parFileName, |
179 | prevData = [] |
196 | prevData = [] |
180 | for line in logfile: |
197 | for line in logfile: |
181 | prevData.append(line[:-1]) |
198 | prevData.append(line[:-1]) |
182 | logfile.close() |
199 | logfile.close() |
183 | logfile = open(parFileName, "w") |
200 | logfile = open(parFileName, "w") |
184 | logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName)) |
201 | logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName)) |
185 | i = 1 |
202 | i = 1 |
186 | for value in data[1:]: |
203 | for value in data[1:]: |
187 | logfile.write("%s,%d\n" % (prevData[i], value)) |
204 | logfile.write("%s,%d\n" % (prevData[i], value)) |
188 | i += 1 |
205 | i += 1 |
189 | logfile.close() |
206 | logfile.close() |
190 | if parVerbose: |
207 | if parVerbose: |
191 | print "OK" |
208 | print "OK" |
192 | 209 | ||
193 | except Exception,e: |
210 | except Exception,e: |
194 | print |
211 | print |
195 | print "== ERROR ==: \"%s\"" % e |
212 | print "== ERROR ==: \"%s\"" % e |
196 | if parVerbose: |
213 | if parVerbose: |
197 | print |
214 | print |
198 | print "Traceback:" |
215 | print "Traceback:" |
199 | traceback.print_exc() |
216 | traceback.print_exc() |
200 | print |
217 | print |
201 | raw_input("Press ENTER, the application will close") |
218 | raw_input("Press ENTER, the application will close") |
202 | print |
219 | print |