我有一个朋友即将完成他的航空航天工程硕士学位。在他的最后一个项目中,他在一个小团队中,任务是编写一个跟踪气象气球、火箭和卫星的程序。该程序接收来自GPS设备的输入,对数据进行计算,并使用这些计算的结果来控制一系列电机,这些电机旨在确定定向通信天线的方向,因此气球,火箭或卫星总是保持在焦点上。
虽然我自己是个(永远的)初学者,但我比我的朋友有更多的编程经验,所以当他向我征求建议时,我说服他用Python(我选择的语言)编写程序。
在项目的这一点上,我们正在编写解析来自GPS设备的输入的代码。下面是一些示例输入,我们需要提取的数据用粗体显示:
美国通用PRMC公司,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,M,,,0000* 一法美国通用PRMC公司,093345.679,4234.7899,N,11344.2567,W,3,02,24.5,1000.23,M,,,0000* 一法美国通用PRMC公司,044584.936,1276.5539,北,88734.1543,英,2,04,33.5,600.323,中,,,*00通用无线电通信公司,199304.973,3248.7780,北,11355.7832,西,1,06,02.2,25722.5,中,,,00通用无线电通信公司,066487.954,4572.0089,中,45572.3345,西,3,09,15.0,35000.00,中,,,, 第1页,女
以下是对数据的进一步解释:
“我看起来需要每行有五个内容。请记住,这些区域中的任何一个都可能是空的。这意味着只有两个逗号紧挨着。例如”,,,“有两个字段随时可能是满的。其中一些字段只有两个或三个选项,但我认为我不应该指望这一点。”
两天前,我的朋友能够从GPS接收器中获得完整的日志,GPS接收器用于跟踪最近的一次气象气球发射。数据相当长,所以我把它们都放在this pastebin中。
我自己对正则表达式还是相当陌生的,所以我正在寻找一些帮助。
8条答案
按热度按时间ff29svar1#
拆分应该可以解决这个问题。这里还有一个提取数据的好方法:
6kkfgxo02#
您可以使用pynmea2这样的库来解析NMEA日志。
免责声明:我是pynmea2的作者
z18hc3ub3#
使用split比使用regex简单。
q0qdq0h24#
这些都是逗号分隔的值,所以使用csv库是最简单的解决方案。
我将您所拥有的示例数据放入/var/tmp/sampledata,然后执行以下操作:
然后你可以按照自己的意愿处理数据。有些值的开头和结尾带有“**”看起来有点奇怪,你可能想去掉这些东西,你可以这样做:
你必须将一些值转换为浮点数。例如,样本数据第一行的第三个值是:
yruzcnhs5#
你也应该首先检查数据的校验和。它是通过异或$和 * 之间的字符(不包括它们)并将其与末尾的十六进制值进行比较来计算的。
你的pastebin看起来有一些损坏的行。这里有一个简单的检查,它假设行以$开头,并且结尾没有CR/LF。要构建一个更健壮的解析器,你需要搜索'$',并遍历字符串,直到找到'*'。
lhcgjxsq6#
这是GPRMC字符串。拆分字符串后,需要解析纬度和经度值。
经纬度部分(
[..., '3248.7780', 'N', '11355.7832, 'W', ...]
):3248.7780
指32
度,48.7780
分(纬度)11355.7832
)表示113
度,55.7832
分(经度)它们不能照原样用在公式中,必须转换成十进制度数。
jobtbby37#
如果你需要对你的GPS数据流做一些更广泛的分析,这里有一个pyparse解决方案,它把你的数据分解成命名的数据字段。我把你的pastebin数据提取到一个文件gpssream.txt中,并用下面的代码解析它:
你的pastebin中的$GPRMC记录看起来和你的帖子中的不太匹配,但是你应该能够根据需要调整这个例子。
dohp0rv58#
我建议在代码中做一个小的修正,因为如果用来解析上个世纪的数据,日期看起来像是未来的某个时候(例如2094年而不是1994年)
我的解决方案并不完全准确,但我的立场是,在70年代之前没有GPS数据存在。
在RMC语句的def解析函数中,只需将格式行替换为:
这将查看年份的两个yy数字,并假设过去的年份70是上个世纪的句子。通过与今天的日期进行比较,并假设将来每次处理某些数据时,它们实际上都是上个世纪的,这样做可能会更好
感谢您提供的所有代码片段以上...我有一些乐趣与此。