Subversion Repositories Projects

Rev

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

Rev 554 Rev 556
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. "
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
        msg = mk.getVersionMsg()
118
        msg = mk.getVersionMsg()
119
        voltage = 0
119
        version = msg.getVersion()
120
        if parVerbose:
120
        if parVerbose:
121
          print "Version: %d.%d" % msg.getVersion()
121
          print "Version: %d.%d" % version
-
 
122
        if version != (0,74):
-
 
123
          print "INVALID VERSION", version
-
 
124
          sys.exit(2)
-
 
125
         
122
         
126
         
-
 
127
        msg = mk.getDebugMsg()
123
        msg = mk.getDebugMsg()
128
        voltage = msg.getVoltage()
124
        if (voltage > 4.2*3):
129
        if (voltage > 4.2*3):
125
          minVoltage = 4*3.5
130
          minVoltage = 4*3.5
126
        else:
131
        else:
127
          minVoltage = 3*3.5
132
          minVoltage = 3*3.5
128
 
133
 
129
        if parVerbose:
134
        if parVerbose:
130
          print "Voltage: %2.1fV" % msg.getVoltage()
135
          print "Voltage: %2.1fV" % msg.getVoltage()
131
          print "Minimum Voltage: %2.1fV" % minVoltage
136
          print "Minimum Voltage: %2.1fV" % minVoltage
132
       
137
       
133
        motorStartSpeeds = [0,0,0,0]
138
        motorStartSpeeds = [0,0,0,0]
134
       
139
       
135
        if parVerbose:
140
        if parVerbose:
136
          print "Starting motor(s) (speed=%d)... " % (parMinSpeed),
141
          print "Starting motor(s) (speed=%d)... " % (parMinSpeed),
137
        for i in range(0,parMinSpeed):
142
        for i in range(0,parMinSpeed):
138
          time.sleep(.2)
143
          time.sleep(.2)
139
          for motor in parMotors:
144
          for motor in parMotors:
140
            motorStartSpeeds[motor-1] = i
145
            motorStartSpeeds[motor-1] = i
141
          mk.setMotorTest(motorStartSpeeds)
146
          mk.setMotorTest(motorStartSpeeds)
142
         
147
         
143
        if parVerbose:
148
        if parVerbose:
144
          print "OK"
149
          print "OK"
145
   
150
   
146
        for speed in parSpeeds:
151
        for speed in parSpeeds:
147
          if len(parChannels)>1:
152
          if len(parChannels)>1:
148
            print
153
            print
149
           
154
           
150
          if parVerbose:
155
          if parVerbose:
151
            print "Setting speed to %3d ..." % speed
156
            print "Setting speed to %3d ..." % speed
152
          motorSpeeds = [0,0,0,0]  
157
          motorSpeeds = [0,0,0,0]  
153
          for motor in parMotors:
158
          for motor in parMotors:
154
            motorSpeeds[motor-1] = speed
159
            motorSpeeds[motor-1] = speed
155
          for i in range(0,10):
160
          for i in range(0,10):
156
            time.sleep(.1)
161
            time.sleep(.1)
157
            mk.setMotorTest(motorSpeeds)
162
            mk.setMotorTest(motorSpeeds)
158
         
163
         
159
          for channel in parChannels:
164
          for channel in parChannels:
160
            channelName = CHANNEL_NAMES[channel]
165
            channelName = CHANNEL_NAMES[channel]
161
            if parVerbose:
166
            if parVerbose:
162
              print "Getting data... " ,
167
              print "Getting data... " ,
163
            data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel)
168
            data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel)
-
 
169
            #data = (0,1,2)
164
            minval = min(data[1:])
170
            minval = min(data[1:])
165
            maxval = max(data[1:])
171
            maxval = max(data[1:])
166
            if (maxval-minval)>100: print data
172
            #if (maxval-minval)>100: print data
-
 
173
            time.sleep(.1)
167
            msg = mk.getDebugMsg()
174
            msg = mk.getDebugMsg()
168
            voltage = msg.getVoltage()
175
            voltage = msg.getVoltage()
169
       
176
       
170
            if voltage<minVoltage:
177
            if voltage<minVoltage:
171
              print "VOLTAGE TOO LOW, TEST ABORTED"
178
              print "VOLTAGE TOO LOW, TEST ABORTED"
172
              sys.exit(2)
179
              sys.exit(2)
173
             
180
           
-
 
181
            pp = 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)
182
            print "%10s Speed=%3d U=%2.1fV Channel=%-10s Min=%3d Max=%3d pp=%3d" % (parTestName,  speed, voltage, channelName, minval, maxval, pp),
-
 
183
            print "*"*(min(pp,200)/5)
175
             
184
             
176
            if parFileName != None:
185
            if parFileName != None:
177
              try:
186
              try:
178
                logfile = open(parFileName, "r")
187
                logfile = open(parFileName, "r")
179
                newFile = False
188
                newFile = False
180
              except:
189
              except:
181
                newFile = True
190
                newFile = True
182
               
191
               
183
              if newFile:
192
              if newFile:
184
                logfile = open(parFileName, "w")
193
                logfile = open(parFileName, "w")
185
                if parVerbose:
194
                if parVerbose:
186
                  print "Writing result to %s ..." % parFileName,
195
                  print "Writing result to %s ..." % parFileName,
187
                logfile.write("%s %d %s\n" % (parTestName, speed, channelName))
196
                logfile.write("%s %d %s\n" % (parTestName, speed, channelName))
188
                for value in data[1:]:
197
                for value in data[1:]:
189
                  logfile.write("%d\n" % value)
198
                  logfile.write("%d\n" % value)
190
                logfile.close()
199
                logfile.close()
191
                if parVerbose:  
200
                if parVerbose:  
192
                  print "OK"
201
                  print "OK"
193
              else:
202
              else:
194
                if parVerbose:
203
                if parVerbose:
195
                  print "Appending result to %s ..." % parFileName,
204
                  print "Appending result to %s ..." % parFileName,
196
                prevData = []
205
                prevData = []
197
                for line in logfile:
206
                for line in logfile:
198
                  prevData.append(line[:-1])
207
                  prevData.append(line[:-1])
199
                logfile.close()
208
                logfile.close()
200
                logfile = open(parFileName, "w")
209
                logfile = open(parFileName, "w")
201
                logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName))
210
                logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName))
202
                i = 1
211
                i = 1
203
                for value in data[1:]:
212
                for value in data[1:]:
204
                  logfile.write("%s,%d\n" % (prevData[i], value))
213
                  logfile.write("%s,%d\n" % (prevData[i], value))
205
                  i += 1
214
                  i += 1
206
                logfile.close()
215
                logfile.close()
207
                if parVerbose:
216
                if parVerbose:
208
                  print "OK"
217
                  print "OK"
209
         
218
         
210
    except Exception,e:
219
    except Exception,e:
211
      print
220
      print
212
      print "== ERROR ==: \"%s\"" % e
221
      print "== ERROR ==: \"%s\"" % e
213
      if parVerbose:
222
      if parVerbose:
214
        print
223
        print
215
        print "Traceback:"
224
        print "Traceback:"
216
        traceback.print_exc()
225
        traceback.print_exc()
217
        print
226
        print
218
      raw_input("Press ENTER, the application will close")
227
      raw_input("Press ENTER, the application will close")
219
      print
228
      print