NMEA sentence information summary

博客列举了所有$GPxxx语句代码及其简要描述,涵盖了如航点到达警报、GPS星历数据、自动驾驶格式等多种信息,包括位置、速度、距离、温度、风向等相关内容,为GPS系统相关应用提供参考。
 

All $GPxxx sentence codes and short descriptions

  • $GPAAM - Waypoint Arrival Alarm
  • $GPALM - GPS Almanac Data
  • $GPAPA - Autopilot format "A"
  • $GPAPB - Autopilot format "B"
  • $GPASD - Autopilot System Data
  • $GPBEC - Bearing & Distance to Waypoint, Dead Reckoning
  • $GPBOD - Bearing, Origin to Destination
  • $GPBWC - Bearing & Distance to Waypoint, Great Circle
  • $GPBWR - Bearing & Distance to Waypoint, Rhumb Line
  • $GPBWW - Bearing, Waypoint to Waypoint
  • $GPDBT - Depth Below Transducer
  • $GPDCN - Decca Position
  • $GPDPT - Depth
  • $GPFSI - Frequency Set Information
  • $GPGGA - Global Positioning System Fix Data
  • $GPGLC - Geographic Position, Loran-C
  • $GPGLL - Geographic Position, Latitude/Longitude
  • $GPGRS - GPS Range Residuals
  • $GPGSA - GPS DOP and Active Satellites
  • $GPGST - GPS Pseudorange Noise Statistics
  • $GPGSV - GPS Satellites in View
  • $GPGXA - TRANSIT Position
  • $GPHDG - Heading, Deviation & Variation
  • $GPHDT - Heading, True
  • $GPHSC - Heading Steering Command
  • $GPLCD - Loran-C Signal Data
  • $GPMSK - Control for a Beacon Receiver
  • $GPMSS - Beacon Receiver Status
  • $GPMTA - Air Temperature (to be phased out)
  • $GPMTW - Water Temperature
  • $GPMWD - Wind Direction
  • $GPMWV - Wind Speed and Angle
  • $GPOLN - Omega Lane Numbers
  • $GPOSD - Own Ship Data
  • $GPR00 - Waypoint active route (not standard)
  • $GPRMA - Recommended Minimum Specific Loran-C Data
  • $GPRMB - Recommended Minimum Navigation Information
  • $GPRMC - Recommended Minimum Specific GPS/TRANSIT Data
  • $GPROT - Rate of Turn
  • $GPRPM - Revolutions
  • $GPRSA - Rudder Sensor Angle
  • $GPRSD - RADAR System Data
  • $GPRTE - Routes
  • $GPSFI - Scanning Frequency Information
  • $GPSTN - Multiple Data ID
  • $GPTRF - Transit Fix Data
  • $GPTTM - Tracked Target Message
  • $GPVBW - Dual Ground/Water Speed
  • $GPVDR - Set and Drift
  • $GPVHW - Water Speed and Heading
  • $GPVLW - Distance Traveled through the Water
  • $GPVPW - Speed, Measured Parallel to Wind
  • $GPVTG - Track Made Good and Ground Speed
  • $GPWCV - Waypoint Closure Velocity
  • $GPWNC - Distance, Waypoint to Waypoint
  • $GPWPL - Waypoint Location
  • $GPXDR - Transducer Measurements
  • $GPXTE - Cross-Track Error, Measured
  • $GPXTR - Cross-Track Error, Dead Reckoning
  • $GPZDA - UTC Date / Time and Local Time Zone Offset
  • $GPZFO - UTC & Time from Origin Waypoint
  • $GPZTG - UTC & Time to Destination Waypoint

  

26 interpreted sentences transmitted by GPS unit

   $GPAAM - Waypoint Arrival Alarm
   $GPALM - GPS Almanac Data (Can also be received by GPS unit)
   $GPAPB - Autopilot format "B"
   $GPBOD - Bearing, origin to destination
   $GPBWC - Bearing and distance to waypoint, great circle
   $GPGGA - Global Positioning System Fix Data
   $GPGLL - Geographic position, latitude / longitude
   $GPGRS - GPS Range Residuals
   $GPGSA - GPS DOP and active satellites 
   $GPGST - GPS Pseudorange Noise Statistics
   $GPGSV - GPS Satellites in view
   $GPHDT - Heading, True
   $GPMSK - Control for a Beacon Receiver
   $GPMSS - Beacon Receiver Status
   $GPR00 - List of waypoints in currently active route
   $GPRMA - Recommended minimum specific Loran-C data
   $GPRMB - Recommended minimum navigation info
   $GPRMC - Recommended minimum specific GPS/Transit data
   $GPRTE - Routes
   $GPTRF - Transit Fix Data
   $GPSTN - Multiple Data ID
   $GPVBW - Dual Ground / Water Speed
   $GPVTG - Track made good and ground speed
   $GPWPL - Waypoint location
   $GPXTE - Cross-track error, Measured
   $GPZDA - UTC Date / Time and Local Time Zone Offset
<think> 我们正在解决ROS中`rostopic echo /nmea_sentence`输出乱码的问题。根据之前的讨论,我们已经分析了可能的原因和解决方案。现在,我将重新整理解决方案,确保符合用户的指令要求,特别是关于数学公式的格式(行内公式用$...$,独立公式用$$...$$)和中文回答。 ### 解决ROS中`/nmea_sentence`消息乱码的步骤 #### 1. **检查硬件连接和串口原始数据** - 首先,确认GPS设备连接正确。使用以下命令直接读取串口数据(假设设备节点为`/dev/ttyUSB0`,请根据实际情况替换): ```bash sudo cat /dev/ttyUSB0 ``` - **正常情况**:应输出可读的NMEA语句,如`$GPGGA,004359.80,3514.1237953,N,...`。 - **乱码情况**:输出类似`��v�$�G�G�A,���.�0,,...`的乱码,则可能是波特率不匹配或硬件问题。 #### 2. **验证ROS驱动配置** - 检查驱动节点的启动文件(如`nmea_navsat_driver`),确保波特率(`baud`参数)与GPS设备匹配(常见波特率:4800、9600、115200)。例如: ```xml <param name="port" value="/dev/ttyACM0"/> <param name="baud" value="115200"/> <!-- 必须与设备匹配 --> ``` - 如果波特率不匹配,会导致数据传输错误。波特率$B$与数据传输速率的关系为: $$ B = \frac{1}{T} \quad \text{(波特)} $$ 其中$T$是每个符号的持续时间。 #### 3. **修复串口权限问题** - Linux系统可能因权限问题导致数据读取异常: ```bash sudo chmod a+rw /dev/ttyUSB0 # 临时解决方案 ``` - 永久解决方案:将用户加入`dialout`组并重启: ```bash sudo usermod -aG dialout $USER ``` #### 4. **启用校验和过滤** - 在驱动节点中启用NMEA语句的校验和验证,丢弃无效数据: ```xml <param name="check_checksum" value="true"/> ``` - NMEA校验和计算规则:从`$`后第一个字符到`*`前所有字符的异或值(XOR),用十六进制表示。例如: ``` $GPGGA,004359.80,3514.1237953,N,...*7A ``` 校验和$C$的计算公式为: $$ C = \text{XOR}(c_1, c_2, \dots, c_n) $$ 其中$c_i$为字符的ASCII值。 #### 5. **处理编码问题** - 如果乱码由字符编码引起(尤其在Python3中),在回调函数中显式指定ASCII解码: ```python def callback(msg): try: clean_str = msg.sentence.decode('ascii', 'ignore') # 丢弃非ASCII字符 except AttributeError: clean_str = msg.sentence # Python2无需解码 ``` #### 6. **抗干扰优化** - 电磁干扰(EMI)可能导致数据错误: - 使用带磁环的屏蔽USB线缆。 - 避免GPS线缆与电机或高压线并行。 - 外接高增益(≥26dB)有源天线。 #### 7. **更换专用驱动** - 若使用U-blox设备,推荐专用驱动`ublox_gps`: ```bash sudo apt install ros-$ROS_DISTRO-ublox roslaunch ublox_gps ublox_device.launch ``` ### 验证流程 ```mermaid graph TD A[原始串口数据检测] -->|正常| B[检查ROS驱动配置] A -->|乱码| C[更换线缆/端口/天线] B --> D[验证波特率匹配] D -->|成功| E[启用校验和过滤] E --> F[字符编码处理] F -->|仍乱码| G[更换驱动或硬件] ``` ### 相关问题 1. 如何将NMEA语句中的度分格式(如`3514.1237953`)转换为十进制度坐标? 2. ROS中`sensor_msgs/NavSatFix`消息的`status.status`字段有哪些取值?各自代表什么含义? 3. 在隧道等GPS信号弱的环境下,如何通过传感器融合实现连续定位? 4. GPS和IMU的时间同步有哪些常用方法?如何验证时间同步精度? [^1]: ROS串口配置指南: https://github.com/mavlink/mavros/blob/master/mavros/README.md#serial-port-permissions [^2]: NMEA校验和规范: https://gpsd.gitlab.io/gpsd/NMEA.html#_checksumming </think> ### 解决 ROS 中 `rostopic echo /nmea_sentence` 输出乱码问题 #### 一、核心排查步骤(按优先级排序) 1. **验证串口原始数据** ```bash sudo stty -F /dev/ttyUSB0 raw # 重置串口配置 sudo cat /dev/ttyUSB0 | hexdump -C # 十六进制查看原始数据 ``` - ✅ 正常输出:应包含 `24 47 50 47 47 41`(对应 ASCII "$GPGGA") - ❌ 乱码特征:出现连续 `00` 或非 ASCII 字符(如 `FF FE`) 2. **检查波特率匹配性** - GPS 常用波特率:$B = \{4800, 9600, 38400, 115200\}$ - 计算校验公式:实际传输速率 $R$ 与设定值 $B$ 需满足: $$ \left| \frac{R - B}{B} \right| \leq 0.03 $$ - 验证命令: ```bash sudo stty -F /dev/ttyUSB0 115200 # 尝试不同波特率 ``` 3. **修复 ROS 驱动配置** ```xml <!-- 在 launch 文件中添加 --> <node pkg="nmea_navsat_driver" type="nmea_serial_driver" name="gps_node"> <param name="port" value="/dev/ttyUSB0"/> <param name="baud" value="115200"/> <param name="frame_id" value="gps"/> <!-- 关键修复参数 --> <param name="use_checksum" value="true"/> <!-- 启用校验和验证 --> <param name="error_correction" value="1"/> <!-- 容错级别 --> </node> ``` #### 二、分场景解决方案 | **乱码类型** | **根本原因** | **解决方案** | |-------------------|----------------------|-------------| | **方块字符(▯▯)** | 波特率偏移 > 5% | 1. 使用 `stty` 校准波特率<br>2. 添加稳压电源 | | **十六进制代码** | 驱动解析协议错误 | 1. 升级驱动:`sudo apt upgrade ros-$ROS_DISTRO-nmea-navsat-driver`<br>2. 添加协议过滤[^1] | | **断续文本** | 电磁干扰(EMI) | 1. 使用磁环屏蔽线缆<br>2. 串口并联 $104 \mu F$ 电容滤波 | | **全乱码(��~�)** | 串口硬件故障 | 1. 更换 FT232 芯片的 USB 转 TTL 模块<br>2. 检查电平匹配(GPS 通常 3.3V) | #### 三、代码级修复方案 ```python # 在 ROS 驱动源码中添加字符过滤(文件位置:/opt/ros/$ROS_DISTRO/lib/python*/dist-packages/nmea_navsat_driver) def read_line(serial_port): line = serial_port.readline() # 过滤非 ASCII 字符(核心修复) clean_line = ''.join(char for char in line if 32 <= ord(char) <= 126) return clean_line ``` > **注意**:修改后需重新编译驱动 `catkin_make --pkg nmea_navsat_driver` #### 四、抗干扰优化措施 1. **硬件层** - 线缆长度 $L < 1.5m$(满足 $L \cdot f_{data} < 0.1c$) - 添加共模扼流圈(阻抗 $Z > 100\Omega@100MHz$) 2. **软件层** ```python # 增加数据校验重传机制 if not validate_nmea_checksum(raw_data): request_retransmission() # 自定义重传协议 ``` #### 五、验证流程图 ```mermaid graph LR A[断开ROS连接] --> B[直接读取串口] B -->|正常| C[检查驱动配置] B -->|乱码| D[更换硬件] C --> E[校验参数] E --> F[启用校验和] F -->|仍异常| G[修改驱动源码] G --> H[添加字符过滤] H --> I[重启节点验证] ``` #### 六、高级调试工具 ```bash # 1. 实时监控串口数据质量 sudo cat /dev/ttyUSB0 | pv -br > /dev/null # 显示实时速率 # 2. 使用Wireshark分析 sudo apt install socat socat -d -d PTY,raw,echo=0,link=/tmp/virtualcom PTY,raw,echo=0,link=/tmp/virtualcom2 & rosrun nmea_navsat_driver nmea_serial_driver _port:=/tmp/virtualcom wireshark -k -i lo -f 'port 1010' # 捕获虚拟端口数据 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值