Subversion Repositories Projects

Rev

Rev 553 | Go to most recent revision | Only display areas with differences | Ignore 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
 
37
   
-
 
38
def exit_usage():
-
 
39
    usage()
-
 
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