Subversion Repositories Projects

Rev

Rev 569 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 569 Rev 609
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
CHECK_VERSION = False
16
CHECK_VERSION = False
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. "
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"
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"
27
    print "                   Format 2:  e.g. 100-200:50            Tests at speeds 100, 150 and 200"
28
    print " CHANNELS        Channels to monitor. e.g. 5,6,7"
28
    print " CHANNELS        Channels to monitor. e.g. 5,6,7"
29
    for i,channelName in enumerate(CHANNEL_NAMES):
29
    for i,channelName in enumerate(CHANNEL_NAMES):
30
      print "                   Channel %d = %s" % (i, channelName)
30
      print "                   Channel %d = %s" % (i, channelName)
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
   
37
   
38
def exit_usage():
38
def exit_usage():
39
    usage()
39
    usage()
40
    sys.exit(2)
40
    sys.exit(2)
41
 
41
 
42
if __name__ == '__main__':
42
if __name__ == '__main__':
43
 
43
 
44
    #print sys.argv
44
    #print sys.argv
45
    if len(sys.argv)<5:
45
    if len(sys.argv)<5:
46
        exit_usage()
46
        exit_usage()
47
 
47
 
48
    parComPort = sys.argv[1]
48
    parComPort = sys.argv[1]
49
    parMotors = sys.argv[2].split(',')
49
    parMotors = sys.argv[2].split(',')
50
    parChannels = sys.argv[4].split(',')
50
    parChannels = sys.argv[4].split(',')
51
 
51
 
52
    par = sys.argv[3]
52
    par = sys.argv[3]
53
    if par.count("-") == 1:
53
    if par.count("-") == 1:
54
        # assume from-to:step format
54
        # assume from-to:step format
55
        par = par.split("-")
55
        par = par.split("-")
56
        if len(par) != 2:
56
        if len(par) != 2:
57
            exit_usage()
57
            exit_usage()
58
           
58
           
59
        par[1] = par[1].split(":")
59
        par[1] = par[1].split(":")
60
        if len(par[1]) != 2:
60
        if len(par[1]) != 2:
61
            exit_usage()
61
            exit_usage()
62
   
62
   
63
        parSpeeds = range(int(par[0]),int(par[1][0])+int(par[1][1]),int(par[1][1]))
63
        parSpeeds = range(int(par[0]),int(par[1][0])+int(par[1][1]),int(par[1][1]))
64
       
64
       
65
    else:
65
    else:
66
        parSpeeds = par.split(',')
66
        parSpeeds = par.split(',')
67
   
67
   
68
    try:
68
    try:
69
        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")
70
    except Exception, err:
70
    except Exception, err:
71
        print str(err) # will print something like "option -a not recognized"
71
        print str(err) # will print something like "option -a not recognized"
72
        usage()
72
        usage()
73
        sys.exit(2)
73
        sys.exit(2)
74
 
74
 
75
    parVerbose = False
75
    parVerbose = False
76
    parFileName = None
76
    parFileName = None
77
    parNbSamples = 400
77
    parNbSamples = 400
78
    parMinSpeed = 25
78
    parMinSpeed = 25
79
    parTestName = ""
79
    parTestName = ""
80
 
80
 
81
    for o, a in opts:
81
    for o, a in opts:
82
        if o == "-v":
82
        if o == "-v":
83
            parVerbose = True
83
            parVerbose = True
84
        elif o == "-d":
84
        elif o == "-d":
85
            parFileName = a
85
            parFileName = a
86
        elif o == "-s":
86
        elif o == "-s":
87
            parNbSamples = int(a)
87
            parNbSamples = int(a)
88
        elif o == "-m":
88
        elif o == "-m":
89
            parMinSpeed = int(a)
89
            parMinSpeed = int(a)
90
        elif o == "-n":
90
        elif o == "-n":
91
            parTestName = a
91
            parTestName = a
92
           
92
           
93
        else:
93
        else:
94
            assert False, "unhandled option %s" % (o)
94
            assert False, "unhandled option %s" % (o)
95
 
95
 
96
    if parVerbose:
96
    if parVerbose:
97
        print "comPort  =", parComPort
97
        print "comPort  =", parComPort
98
        print "motors   =", parMotors
98
        print "motors   =", parMotors
99
        print "minSpeed =", parMinSpeed
99
        print "minSpeed =", parMinSpeed
100
        print "speeds   =", parSpeeds
100
        print "speeds   =", parSpeeds
101
        print "channels =", parChannels
101
        print "channels =", parChannels
102
        print "nbSamples=", parNbSamples
102
        print "nbSamples=", parNbSamples
103
        print "fileName =", parFileName
103
        print "fileName =", parFileName
104
        print "testName =", parTestName
104
        print "testName =", parTestName
105
 
105
 
106
 
106
 
107
    try:
107
    try:
108
        parMotors = map(int, parMotors)
108
        parMotors = map(int, parMotors)
109
        parSpeeds = map(int, parSpeeds)
109
        parSpeeds = map(int, parSpeeds)
110
        parChannels = map(int, parChannels)
110
        parChannels = map(int, parChannels)
111
       
111
       
112
       
112
       
113
        if parVerbose:
113
        if parVerbose:
114
          print "Opening comPort... "
114
          print "Opening comPort... "
115
        mk = mkProto.MkComm()
115
        mk = mkProto.MkComm()
116
        mk.open(comPort=parComPort)
116
        mk.open(comPort=parComPort)
117
       
117
       
118
        time.sleep(.1)
118
        time.sleep(.1)
119
        msg = mk.getVersionMsg()
119
        msg = mk.getVersionMsg()
120
        version = msg.getVersion()
120
        version = msg.getVersion()
121
        if parVerbose:
121
        if parVerbose:
122
          print "Version: %d.%d" % version
122
          print "Version: %d.%d" % version
123
        if CHECK_VERSION and version != (0,74):
123
        if CHECK_VERSION and version != (0,74):
124
          print "INVALID VERSION", version
124
          print "INVALID VERSION", version
125
          sys.exit(2)
125
          sys.exit(2)
126
         
126
         
127
         
127
         
128
        msg = mk.getDebugMsg()
128
        msg = mk.getDebugMsg()
129
        voltage = msg.getVoltage()
129
        voltage = msg.getVoltage()
130
        if (voltage == 0):
130
        if (voltage == 0):
131
          minVoltage = 0
131
          minVoltage = 0
132
        else:
132
        else:
133
          if (voltage > 4.2*3):
133
          if (voltage > 4.2*3):
134
            minVoltage = 4*3.5
134
            minVoltage = 4*3.5
135
          else:
135
          else:
136
            minVoltage = 3*3.5
136
            minVoltage = 3*3.5
137
 
137
 
138
        if parVerbose:
138
        if parVerbose:
139
          print "Voltage: %2.1fV" % msg.getVoltage()
139
          print "Voltage: %2.1fV" % msg.getVoltage()
140
          print "Minimum Voltage: %2.1fV" % minVoltage
140
          print "Minimum Voltage: %2.1fV" % minVoltage
141
       
141
       
142
        motorStartSpeeds = [0,0,0,0]
142
        motorStartSpeeds = [0,0,0,0]
143
       
143
       
144
        if parVerbose:
144
        if parVerbose:
145
          print "Starting motor(s) (speed=%d)... " % (parMinSpeed),
145
          print "Starting motor(s) (speed=%d)... " % (parMinSpeed),
146
         
146
         
147
        for motor in parMotors:
147
        for motor in parMotors:
148
            motorStartSpeeds[motor-1] = parMinSpeed
148
            motorStartSpeeds[motor-1] = parMinSpeed
149
        for i in range(10):
149
        for i in range(10):
150
          mk.setMotorTest(motorStartSpeeds)
150
          mk.setMotorTest(motorStartSpeeds)
151
          time.sleep(.1)
151
          time.sleep(.1)
152
         
152
         
153
        if parVerbose:
153
        if parVerbose:
154
          print "OK"
154
          print "OK"
155
   
155
   
156
        for speed in parSpeeds:
156
        for speed in parSpeeds:
157
          if len(parChannels)>1:
157
          if len(parChannels)>1:
158
            print
158
            print
159
           
159
           
160
          if parVerbose:
160
          if parVerbose:
161
            print "Setting speed to %3d ..." % speed
161
            print "Setting speed to %3d ..." % speed
162
          motorSpeeds = [0,0,0,0]  
162
          motorSpeeds = [0,0,0,0]  
163
          for motor in parMotors:
163
          for motor in parMotors:
164
            motorSpeeds[motor-1] = speed
164
            motorSpeeds[motor-1] = speed
165
          for i in range(0,10):
165
          for i in range(0,10):
166
            time.sleep(.1)
166
            time.sleep(.1)
167
            mk.setMotorTest(motorSpeeds)
167
            mk.setMotorTest(motorSpeeds)
168
           
168
           
169
          for channel in parChannels:
169
          for channel in parChannels:
-
 
170
            mk.setMotorTest(motorSpeeds)
-
 
171
           
170
            channelName = CHANNEL_NAMES[channel]
172
            channelName = CHANNEL_NAMES[channel]
171
            if parVerbose:
173
            if parVerbose:
172
              print "Getting data... " ,
174
              print "Getting data... " ,
173
            data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel)
175
            data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel)
174
            #data = (0,1,2)
176
            #data = (0,1,2)
175
            minval = min(data[1:])
177
            minval = min(data[1:])
176
            maxval = max(data[1:])
178
            maxval = max(data[1:])
177
            #if (maxval-minval)>100: print data
179
            #if (maxval-minval)>100: print data
178
            time.sleep(.1)
180
            time.sleep(.1)
179
            msg = mk.getDebugMsg()
181
            msg = mk.getDebugMsg()
180
            voltage = msg.getVoltage()
182
            voltage = msg.getVoltage()
181
       
183
       
182
            if voltage<minVoltage:
184
            if voltage<minVoltage:
183
              print "VOLTAGE TOO LOW, TEST ABORTED"
185
              print "VOLTAGE TOO LOW, TEST ABORTED"
184
              sys.exit(2)
186
              sys.exit(2)
185
             
187
             
186
            pp = maxval-minval;  
188
            pp = maxval-minval;  
187
            print "%10s Speed=%3d U=%2.1fV Channel=%-10s Min=%3d Max=%3d pp=%3d" % (parTestName,  speed, voltage, channelName, minval, maxval, pp),
189
            print "%10s Speed=%3d U=%2.1fV Channel=%-10s Min=%3d Max=%3d pp=%3d" % (parTestName,  speed, voltage, channelName, minval, maxval, pp),
188
            print "*"*(min(pp,200)/5)
190
            print "*"*(min(pp,200)/5)
189
             
191
             
190
            if parFileName != None:
192
            if parFileName != None:
191
              try:
193
              try:
192
                logfile = open(parFileName, "r")
194
                logfile = open(parFileName, "r")
193
                newFile = False
195
                newFile = False
194
              except:
196
              except:
195
                newFile = True
197
                newFile = True
196
               
198
               
197
              if newFile:
199
              if newFile:
198
                logfile = open(parFileName, "w")
200
                logfile = open(parFileName, "w")
199
                if parVerbose:
201
                if parVerbose:
200
                  print "Writing result to %s ..." % parFileName,
202
                  print "Writing result to %s ..." % parFileName,
201
                logfile.write("%s %d %s\n" % (parTestName, speed, channelName))
203
                logfile.write("%s %d %s\n" % (parTestName, speed, channelName))
202
                for value in data[1:]:
204
                for value in data[1:]:
203
                  logfile.write("%d\n" % value)
205
                  logfile.write("%d\n" % value)
204
                logfile.close()
206
                logfile.close()
205
                if parVerbose:  
207
                if parVerbose:  
206
                  print "OK"
208
                  print "OK"
207
              else:
209
              else:
208
                if parVerbose:
210
                if parVerbose:
209
                  print "Appending result to %s ..." % parFileName,
211
                  print "Appending result to %s ..." % parFileName,
210
                prevData = []
212
                prevData = []
211
                for line in logfile:
213
                for line in logfile:
212
                  prevData.append(line[:-1])
214
                  prevData.append(line[:-1])
213
                logfile.close()
215
                logfile.close()
214
                logfile = open(parFileName, "w")
216
                logfile = open(parFileName, "w")
215
                logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName))
217
                logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName))
216
                i = 1
218
                i = 1
217
                for value in data[1:]:
219
                for value in data[1:]:
218
                  logfile.write("%s,%d\n" % (prevData[i], value))
220
                  logfile.write("%s,%d\n" % (prevData[i], value))
219
                  i += 1
221
                  i += 1
220
                logfile.close()
222
                logfile.close()
221
                if parVerbose:
223
                if parVerbose:
222
                  print "OK"
224
                  print "OK"
223
                 
225
                 
224
        mk.close()
226
        mk.close()
225
             
227
             
226
    except Exception,e:
228
    except Exception,e:
227
      print
229
      print
228
      print "== ERROR ==: \"%s\"" % e
230
      print "== ERROR ==: \"%s\"" % e
229
      if parVerbose:
231
      if parVerbose:
230
        print
232
        print
231
        print "Traceback:"
233
        print "Traceback:"
232
        traceback.print_exc()
234
        traceback.print_exc()
233
        print
235
        print
234
      raw_input("Press ENTER, the application will close")
236
      raw_input("Press ENTER, the application will close")
235
      print
237
      print
236
     
238