You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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' → 十六进制:33445400000000000A
  • b'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:35:27