From 2383e3f1bf1d11ba5e8f69266cd5522ba18ad819 Mon Sep 17 00:00:00 2001 From: NataliaP721 Date: Fri, 31 Jan 2020 21:16:57 -0700 Subject: [PATCH 1/4] Parsed GPS data and fixed bug in code --- parseData.py | 62 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/parseData.py b/parseData.py index 9bab6d4..9a87eee 100644 --- a/parseData.py +++ b/parseData.py @@ -8,7 +8,7 @@ class AvionicsData: def __init__(self): self.imu = [0] * 9 self.bar = [0] * 2 - self.gps = [0] * 4 + self.gps = [0] * 8 self.oxi = -1 self.cmb = -1 self.phs = -1 @@ -25,6 +25,10 @@ def __str__(self): string+="IMU - GYRO:\t\t"+ str(self.imu[3:6])+" mdps"+"\n" string+="BAR - PRESS:\t\t"+ str(self.bar[0]/100) +" mbar"+"\n" string+="BAR - TEMP:\t\t"+ str(self.bar[1]/100)+" degrees C"+"\n" + string+="GPS - TIME:\t\t"+ str(self.gps[0]) + "\n" + string+="GPS - LAT:\t\t"+ str(self.gps[1] + self.gps[2]/100000/60) + " " + str(self.gps[3]) + "\n" + string+="GPS - LONG:\t\t"+ str(self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]) + "\n" + string+="GPS - ALT:\t\t" + str(self.gps[7]) + " m" + "\n" string+="OXI - P:\t\t"+ str(self.oxi/1000)+" psi"+"\n" string+="CMB - P:\t\t"+ str(self.cmb/1000)+" psi"+"\n" string+="PHS - PHASE:\t\t"+ str(phases[self.phs+1])+"\n" @@ -32,8 +36,8 @@ def __str__(self): string+="Lower Vent:\t\t" + str(valveStatus[self.lowerVnt+1])+"\n" with open('fligthData.csv', 'a') as csvfile: - spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) - spamwriter.writerow([str(self.imu[0]), str(self.imu[1]), str(self.imu[2]), str(self.imu[3]), str(self.imu[4]), str(self.imu[5]), str(self.bar[0]), str(self.bar[1])]) + spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) + spamwriter.writerow([str(self.imu[0]), str(self.imu[1]), str(self.imu[2]), str(self.imu[3]), str(self.imu[4]), str(self.imu[5]), str(self.bar[0]), str(self.bar[1])]) return string @@ -77,16 +81,28 @@ def readSerial(ser,data): i+=1 #GPS Data - elif((line[i:i+8]=='33333333') and (len(line)-i>=41)): - if(line[i+40:i+42]=='00'): - print(line[i:i+42]) - data.gps[0] = twos_complement(line[i+8:i+16], 32) - data.gps[1] = twos_complement(line[i+16:i+24], 32) - data.gps[2] = twos_complement(line[i+24:i+32], 32) - data.gps[3] = twos_complement(line[i+32:i+40], 32) - i+=41 - else: - i+=1 + elif((line[i:i+8]=='33333333') and (len(line)-i>=57)): + if(line[i+56:i+58]=='00'): + data.gps[0] = (twos_complement(line[i+8:i+16], 32))/100 + data.gps[1] = (twos_complement(line[i+16:i+24], 32)) + data.gps[2] = (twos_complement(line[i+24:i+32], 32)) + if data.gps[1] < 0: + data.gps[3] = "S" + data.gps[1] *= -1 + data.gps[2] *= -1 + else: + data.gps[3] = "N" + data.gps[4] = (twos_complement(line[i+32:i+40], 32)) + data.gps[5] = (twos_complement(line[i+40:i+48], 32)) + if data.gps[4] < 0: + data.gps[6] = "W" + data.gps[4] *= -1 + data.gps[5] *= -1 + else: + data.gps[6] = "E" + data.gps[7] = (twos_complement(line[i+48:i+56], 32))/10 + i+=57 + else: i+=1 #Oxidizer Tank Pressure elif((line[i:i+8]=='34343434') and (len(line)-i>=17)): @@ -103,29 +119,31 @@ def readSerial(ser,data): else: i+=1 #Flight Phase - elif((line[i:i+8]=='36363636') and (len(line)-i>=13)): + elif((line[i:i+8]=='36363636') and (len(line)-i>=11)): if(line[i+10:i+12]=='00'): data.phs = int(line[i+8:i+10], 16) - i+=12 + i+=11 else: i+=1 #Injection Valve Status - elif((line[i:i+8]=='38383838') and (len(line)-i>=13)): + elif((line[i:i+8]=='38383838') and (len(line)-i>=11)): if(line[i+10:i+12]=='00'): data.injValve = int(line[i+8:i+10], 16) - i+=12 + i+=11 else: i+=1 #Lower Vent Valve - elif((line[i:i+8]=='39393939') and (len(line)-i>=13)): + elif((line[i:i+8]=='39393939') and (len(line)-i>=11)): if(line[i+10:i+12]=='00'): data.lowerVnt = int(line[i+8:i+10], 16) - i+=12 + i+=11 else: i+=1 #No packet detected else: i+=1 + print(data) + ser.flushInput() if __name__ == "__main__": @@ -134,7 +152,9 @@ def readSerial(ser,data): while(True): port = input('Enter a Serial Port to connect to:') #Linux: /dev/ttyUSBx, Windows: COMx ser = serial.Serial(port, 9600, timeout=0) + + ser.flushInput() while(ser!=None): - time.sleep(1) - readSerial(ser, data) + time.sleep(0.5) + readSerial(ser, data) \ No newline at end of file From 191bdf51c748325e781b436b0e8eded5cbceba93 Mon Sep 17 00:00:00 2001 From: NataliaP721 Date: Fri, 31 Jan 2020 21:22:29 -0700 Subject: [PATCH 2/4] Added comment about latitude/longitude calculation --- parseData.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/parseData.py b/parseData.py index 9a87eee..c12c5f0 100644 --- a/parseData.py +++ b/parseData.py @@ -26,6 +26,7 @@ def __str__(self): string+="BAR - PRESS:\t\t"+ str(self.bar[0]/100) +" mbar"+"\n" string+="BAR - TEMP:\t\t"+ str(self.bar[1]/100)+" degrees C"+"\n" string+="GPS - TIME:\t\t"+ str(self.gps[0]) + "\n" + #Convert GPS coordinates to latitude/longitude that Google Maps accepts string+="GPS - LAT:\t\t"+ str(self.gps[1] + self.gps[2]/100000/60) + " " + str(self.gps[3]) + "\n" string+="GPS - LONG:\t\t"+ str(self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]) + "\n" string+="GPS - ALT:\t\t" + str(self.gps[7]) + " m" + "\n" @@ -57,7 +58,7 @@ def readSerial(ser,data): i = 0 print(line) while(i=81)): if(line[i+80:i+82]=='00'): print(line[i:i+82]) @@ -70,7 +71,7 @@ def readSerial(ser,data): i+=81 else: i+=1 - # Barometer Data + #Barometer Data elif((line[i:i+8])=='32323232' and len(line)-i>=25): if(line[i+24:i+26]=='00'): print(line[i:i+26]) From 266c4043241b030304d7a4d0e978cd875fe18626 Mon Sep 17 00:00:00 2001 From: NataliaP721 Date: Fri, 31 Jan 2020 21:58:42 -0700 Subject: [PATCH 3/4] Fixed print formats for GPS data --- parseData.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parseData.py b/parseData.py index c12c5f0..acd18df 100644 --- a/parseData.py +++ b/parseData.py @@ -25,10 +25,10 @@ def __str__(self): string+="IMU - GYRO:\t\t"+ str(self.imu[3:6])+" mdps"+"\n" string+="BAR - PRESS:\t\t"+ str(self.bar[0]/100) +" mbar"+"\n" string+="BAR - TEMP:\t\t"+ str(self.bar[1]/100)+" degrees C"+"\n" - string+="GPS - TIME:\t\t"+ str(self.gps[0]) + "\n" + string+="GPS - TIME:\t\t%06d UTC" % self.gps[0] + "\n" #Convert GPS coordinates to latitude/longitude that Google Maps accepts - string+="GPS - LAT:\t\t"+ str(self.gps[1] + self.gps[2]/100000/60) + " " + str(self.gps[3]) + "\n" - string+="GPS - LONG:\t\t"+ str(self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]) + "\n" + string+="GPS - LAT:\t\t%.5f" % (self.gps[1] + self.gps[2]/100000/60) + " " + str(self.gps[3]) + "\n" + string+="GPS - LONG:\t\t%.5f" % (self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]) + "\n" string+="GPS - ALT:\t\t" + str(self.gps[7]) + " m" + "\n" string+="OXI - P:\t\t"+ str(self.oxi/1000)+" psi"+"\n" string+="CMB - P:\t\t"+ str(self.cmb/1000)+" psi"+"\n" From 86cd77e3d9876289f8fbe076648f04aa94e7b258 Mon Sep 17 00:00:00 2001 From: NataliaP721 Date: Sat, 7 Mar 2020 11:28:49 -0700 Subject: [PATCH 4/4] Re-added excel formatting changes --- parseData.py | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/parseData.py b/parseData.py index acd18df..1f15a34 100644 --- a/parseData.py +++ b/parseData.py @@ -3,6 +3,9 @@ import binascii import csv +phases = ["NA", "PRELAUNCH", "ARM", "BURN", "COAST", "DROGUE_DESCENT", "MAIN_DESCENT", "POSTLAUNCH", + "ABORT_COMMAND_RECEIVED", "ABORT_COMMUNICATION_ERROR", "ABORT_OXIDIZER_PRESSURE", "ABORT_UNSPECIFIED_REASON"] +valveStatus = ["NA","Closed", "Open"] order = 'big' class AvionicsData: def __init__(self): @@ -17,9 +20,6 @@ def __init__(self): self.lowerVnt = -1 def __str__(self): - phases = ["NA", "PRELAUNCH", "ARM", "BURN", "COAST", "DROGUE_DESCENT", "MAIN_DESCENT", "POSTLAUNCH", - "ABORT_COMMAND_RECEIVED", "ABORT_COMMUNICATION_ERROR", "ABORT_OXIDIZER_PRESSURE", "ABORT_UNSPECIFIED_REASON"] - valveStatus = ["NA","Closed", "Open"] string="IMU - ACCEL:\t\t"+ str(self.imu[0:3])+" mg"+"\n" string+="IMU - GYRO:\t\t"+ str(self.imu[3:6])+" mdps"+"\n" @@ -36,11 +36,15 @@ def __str__(self): string+="Inj Valve:\t\t" + str(valveStatus[self.injValve+1])+"\n" string+="Lower Vent:\t\t" + str(valveStatus[self.lowerVnt+1])+"\n" + return string + def writeToCSV(self): with open('fligthData.csv', 'a') as csvfile: - spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) - spamwriter.writerow([str(self.imu[0]), str(self.imu[1]), str(self.imu[2]), str(self.imu[3]), str(self.imu[4]), str(self.imu[5]), str(self.bar[0]), str(self.bar[1])]) + spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) + spamwriter.writerow([str(self.imu[0:3]), str(self.imu[3:6]), str(self.bar[0]/100), str(self.bar[1]/100), str(self.gps[0]), \ + str(self.gps[1]+(self.gps[2]/100000/60)) + " " + str(self.gps[3]), str(self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]), \ + str(self.gps[7]), str(self.oxi/1000), str(self.cmb/1000), \ + str(phases[self.phs+1]), str(valveStatus[self.injValve+1]), str(valveStatus[self.lowerVnt+1])]) - return string def twos_complement(hexstr,bits): value = int(hexstr,16) @@ -62,12 +66,12 @@ def readSerial(ser,data): if((line[i:i+8]=='31313131') and (len(line)-i>=81)): if(line[i+80:i+82]=='00'): print(line[i:i+82]) - data.imu[0] = twos_complement(line[i+8:i+16], 32) - data.imu[1] = twos_complement(line[i+16:i+24], 32) - data.imu[2] = twos_complement(line[i+24:i+32], 32) - data.imu[3] = twos_complement(line[i+32:i+40], 32) - data.imu[4] = twos_complement(line[i+40:i+48], 32) - data.imu[5] = twos_complement(line[i+48:i+56], 32) + data.imu[0] = twos_complement(line[i+8:i+16], 32) #accel x + data.imu[1] = twos_complement(line[i+16:i+24], 32) #accel y + data.imu[2] = twos_complement(line[i+24:i+32], 32) #accel z + data.imu[3] = twos_complement(line[i+32:i+40], 32) #gyro x + data.imu[4] = twos_complement(line[i+40:i+48], 32) #gyro y + data.imu[5] = twos_complement(line[i+48:i+56], 32) #gyro z i+=81 else: i+=1 @@ -75,8 +79,8 @@ def readSerial(ser,data): elif((line[i:i+8])=='32323232' and len(line)-i>=25): if(line[i+24:i+26]=='00'): print(line[i:i+26]) - data.bar[0] = twos_complement(line[i+8:i+16], 32) - data.bar[1] = twos_complement(line[i+16:i+24], 32) + data.bar[0] = twos_complement(line[i+8:i+16], 32) #pressure + data.bar[1] = twos_complement(line[i+16:i+24], 32) #temp i+=25 else: i+=1 @@ -84,7 +88,7 @@ def readSerial(ser,data): #GPS Data elif((line[i:i+8]=='33333333') and (len(line)-i>=57)): if(line[i+56:i+58]=='00'): - data.gps[0] = (twos_complement(line[i+8:i+16], 32))/100 + data.gps[0] = (twos_complement(line[i+8:i+16], 32))/100 # data.gps[1] = (twos_complement(line[i+16:i+24], 32)) data.gps[2] = (twos_complement(line[i+24:i+32], 32)) if data.gps[1] < 0: @@ -144,12 +148,17 @@ def readSerial(ser,data): else: i+=1 print(data) + data.writeToCSV() ser.flushInput() if __name__ == "__main__": ser = None data = AvionicsData() + with open('fligthData.csv', 'a') as csvheader: + spamwriter = csv.writer(csvheader, delimiter=',', quoting=csv.QUOTE_MINIMAL) + spamwriter.writerow(["Acceleration(mg)", "Gyro(mdps)", "Pressure(mbar)","Temp(C)", "GPS Time(UTC)", "Latitude","Longitude", \ + "Altitude(m)", "Oxi Pressure(psi)", "Combu Pressure(psi)","Phase", "Inj Valve", "Lower Vent"]) while(True): port = input('Enter a Serial Port to connect to:') #Linux: /dev/ttyUSBx, Windows: COMx ser = serial.Serial(port, 9600, timeout=0) @@ -158,4 +167,4 @@ def readSerial(ser,data): while(ser!=None): time.sleep(0.5) - readSerial(ser, data) \ No newline at end of file + readSerial(ser, data)