【Apollo】【driver】【gnss】适配新的gps设备的方式与经验总结

接上一篇文章《【Apollo】【driver】【gnss】模块调试与分析》,这篇主要讲如何在gnss中适配新的gps设备与遇到的问题总结。

一般的步骤要以文件docs/howto/how_to_add_a_gps_receiver.md ,这里多介绍踩过的坑和相关经验

修改代码

新的设备需要有新的xxxx_stream.cppxxxx_parser.cpp
raw_stream机制:每次read 一条完整的信息然后将此信息publish给data_parser。
这里就会出现问题:以司南为例,使用的是usb转com通信,虽然stream中提供了serial通信方式serial_stream.cpp ,但由于serial通信中有可能出现一次读取多条或半条数据的情况,需要在基于serial通信方式上在再做一定的处理,使其符合一次size_t length = _data_stream->read(_buffer, BUFFER_SIZE);操作返回一条完整的数据.

data_parser机制:每次sub收到的一条信息后,进行解析,解析后publish出去
由于apollo适配的novatel设备,因此data_parser模块中的自用到的proto数据类型和发布出去topic数据类型,和novatel反馈回来的数据强相关。这就需要适配新的设备的数据到原始的xxxx.proto上面。
以司南为例,返回的都是NMEA-0183格式的数据:
- GPGGA : 经纬度信息,经纬度格式为ddmm.mmmmmm(度分格式)
- GPTRA :姿态信息,也是方位角信息,方向角(0~360度),俯仰角(-90~90度),横滚角(-90~90度)
- PTNL,PJK:平面坐标系坐标,以设备所在utc时区和赤道为x,y轴。计算出到设备点的距离(单位米)
- GPVTG:速度信息,水平速度和运动朝向(0~360度)。
- 等等
而apollo里面的proto数据类型和NMEA-0183 格式一点关系都没有。
这里写图片描述
comnav_parser.cpp 文件就需要解析一条NMEA-0183格式的数据,然后将数据赋值到对应的proto类型上。
当然也可以创建成新的proto类型符合NMEA-0183格式。但publish的topic数据类型是固定的,如果需要更改的话,也要修改localization 模块代码,估计会很麻烦。

NMEA-0183格式参考链接

经纬度的显示

最后在dreamview地图上显示的地点由topic/apollo/localization/pose 中的position数据决定,而在localization的RTK模式下,position数据来源于/apollo/sensor/gnss/odometry 中的 position数据。
position数据:平面坐标系坐标

message PointENU {
  optional double x = 1 [default = nan];  // East from the origin, in meters.
  optional double y = 2 [default = nan];  // North from the origin, in meters.
  optional double z = 3 [default = 0.0];  // Up from the WGS-84 ellipsoid, in
                                          // meters.
}

有不明白的可以参考链接UTC
这里就需要手动设置设备的utc时区,需要有三处修改:
- dreamview:参考docs/howto/how_to_use_apollo_2.5_navigation_mode_cn.md 中的4.3节,修改modules/common/data/global_flagfile.txt 文件;
- gnss:参考docs/quickstart/apollo_software_installation_guide_cn.mdgnss_driver.launch 的修改;
- localization:
参考docs/howto/how_to_use_apollo_2.5_navigation_mode_cn.md中的1.3节,修改modules/localization/conf/localization.conf

需要修改好多处地方啊,能不能总结下写一个单独的文档,就是将utc时区变化导致的修改。

特别注意: 百度地图,google地图等等一系列网上的获取的坐标都是不准确的。 坑了我好久好久,特此截图证明:
作者所在地,深圳-华强北-华强电子世界楼上:
这里写图片描述

使用司南设备和手机app(AndroidTS GPS),获取的经纬度信息为:114.080956,22.544109
看下这个gps信息在百度地图上的定位:
这里写图片描述

再看下在google地图上的定位:
这里写图片描述

坑的我是欲哭无泪啊~

最后将信息114.080956,22.544109 放到apollo gnss的stream中模拟将该数据读入,打开GPS和Navi Localization模块显示正确的定位:
这里写图片描述

频率分析

以demo_2.5.bag作为分析样本.novatel设备上传

数据 频率 topices 备注
原始数据 300 /apollo/sensor/gnss/raw_data
GPS 100 /apollo/sensor/gnss/odometry
imu 100 /apollo/sensor/gnss/imu
corrected imu 100 /apollo/sensor/gnss/corrected_imu demo里面数据为空
localization 100 /apollo/localization/pose 与GPS数据晚0.02秒
展开阅读全文

没有更多推荐了,返回首页