如何将Here2 GPS输出的二进制数据解码为NMEA格式?
解析Here2 GPS + CubeOrange + RPi4输出的自定义GPS二进制帧
先修正你的基础错误
你当前把二进制帧和对应十六进制的对应关系完全错位了,正确匹配应该是:
b'3DA\x95F\xaa?p%b=,XIB\n'→ 十六进制:3344419546AA3F7025623D2C5849420A(每个字节转两位十六进制)b'3DT\x00\x00\x00\x00\x00\n'→ 十六进制:33445400000000000Ab'3DG\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x19\xc9?\n'→ 十六进制:3344470000000000000000CF19C93F0A
错位会导致后续分析完全偏离,先把对应关系理清楚。
数据格式本质
这种以3D开头的二进制帧是CubeOrange(PX4飞控)为外部设备(你的RPi4)定制的简化GPS数据帧,不是标准UBX或MAVLink协议,是PX4内部转发GPS数据时的自定义格式,头部第三个字符(A/T/G)是帧类型标识:
3DA:位置+速度数据帧3DT:时间同步数据帧3DG:GPS状态数据帧(卫星数、精度因子等)
解析步骤
1. 帧结构拆解(以3DA为例)
3DA帧总长度16字节(头部3字节+数据12字节+换行1字节),按大端字节序(PX4部分场景用小端,测试不对就换)存储数值,对应字段:
| 字节范围 | 字段 | 类型 | 单位 |
|---|---|---|---|
| 0-2 | 头部(3DA) | ASCII字符 | - |
| 3-6 | 纬度 | IEEE754单精度浮点数 | 度 |
| 7-10 | 经度 | IEEE754单精度浮点数 | 度 |
| 11-12 | 地面速度 | 无符号16位整数 | cm/s |
| 13-14 | 海拔 | 有符号16位整数 | dm(分米) |
| 15 | 换行符(\n) | ASCII字符 | - |
2. 代码解析示例(Python)
用struct模块直接解析二进制数据:
import struct # 取原始3DA帧,去掉头部和换行符 raw_frame = b'3DA\x95F\xaa?p%b=,XIB\n' data_segment = raw_frame[3:-1] # 截取中间12字节数据 # 按大端字节序解析,若数值异常则换成小端(把'>'改成'<') lat, lon, speed_cm, alt_dm = struct.unpack('>ffHh', data_segment) # 转换为常用单位 lat_deg = lat lon_deg = lon speed_kmh = speed_cm / 100 * 3.6 # cm/s转km/h alt_m = alt_dm / 10 # dm转m print(f"纬度: {lat_deg:.6f}° 经度: {lon_deg:.6f}°") print(f"速度: {speed_kmh:.2f}km/h 海拔: {alt_m:.1f}m")
3. 验证与调整
- 如果解析出的数值明显不合理(比如速度上万km/h),说明字节序错了,把
struct.unpack的格式符从>换成<。 - 若字段对应错误,可查看PX4固件源码中
gps.cpp或serial_driver.cpp的相关转发逻辑,确认帧结构细节。
内容的提问来源于stack exchange,提问作者user20207408
相关产品推荐
相关产品推荐

