I have a friend who is finishing up his masters degree in aerospace engineering. For his final project, he is on a small team tasked with writing a program for tracking weather balloons, rockets and satellites. The program receives input from a GPS device, does calculations with the data, and uses the results of those calculations to control a series of motors designed to orientate a directional communication antenna, so the balloon, rocket or satellite always stays in focus.
Though somewhat of a (eternal) beginner myself, I have more programming experience than my friend. So when he asked me for advice, I convinced him to write the program in Python, my language of choice.
At this point in the project, we are working on the code that parses the input from the GPS device. Here is some example input, with the data we need to extract in bold:
$GPRMC,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,M,,,0000*1F $GPRMC,093345.679,4234.7899,N,11344.2567,W,3,02,24.5,1000.23,M,,,0000*1F $GPRMC,044584.936,1276.5539,N,88734.1543,E,2,04,33.5,600.323,M,,,*00 $GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06,02.2,25722.5,M,,,*00 $GPRMC,066487.954,4572.0089,S,45572.3345,W,3,09,15.0,35000.00,M,,,*1F
Here is some further explanation of the data:
"I looks like I'll need five things out of every line. And bear in mind that any one of these area's may be empty. Meaning there will be just two commas right next to each other. Such as ',,,' There are two fields that may be full at any time. Some of them only have two or three options that they may be but I don't think I should be counting on that."
Two days ago my friend was able to acquire the full log from the GPS receiver used to track a recent weather balloon launch. The data is quite long, so I put it all in this pastebin.
I am still rather new with regular expressions myself, so I am looking for some assistance.
This is a GPRMC string. After splitting the string, you need to parse latitude and longitude values.
line = "$GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06,02.2,25722.5,M,,,*00"
line = line.split(",")
In latitude and longitude part ([..., '3248.7780', 'N', '11355.7832, 'W', ...]
):
3248.7780
refers 32
degree, 48.7780
minutes (latitude)11355.7832
) refers 113
degree, 55.7832
minutes (longitude)They cannot be used in a formula as it is. They have to be converted to decimal degree.
def toDD(s):
d = float(s[:-7])
m = float(s[-7:]) / 60
return d + m
lat_lon = (toDD(line[2]), line[3], toDD(line[4]), line[5])
print(lat_lon)
# (32.81296666666667, 'N', 113.92972, 'W')
You could use a library like pynmea2 for parsing the NMEA log.
>>> import pynmea2
>>> msg = pynmea2.parse('$GPGGA,142927.829,2831.4705,N,08041.0067,W,1,07,1.0,7.9,M,-31.2,M,0.0,0000*4F')
>>> msg.timestamp, msg.latitude, msg.longitude, msg.altitude
(datetime.time(14, 29, 27), 28.524508333333333, -80.683445, 7.9)
Disclaimer: I am the author of pynmea2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With