如何在本地运行多传感器融合定位模块

本文档提供了如何在本地运行多传感器融合定位模块的方法。

1. 事先准备

  • GitHub网站下载Apollo源代码

  • 按照教程设置Docker环境

  • Apollo数据平台下载多传感器融合定位demo数据包(仅限美国地区),使用其中apollo3.5文件夹下的数据。

此定位数据为实验性质的demo数据,用于验证定位模块的可用性。数据主要包含定位地图(local_map/), 车辆参数(params/), 传感器数据(records/)。具体属性如下: 时长:5分钟 里程:3km 场景:Sunnyvale 城市道路 天气:晴天

2. 编译apollo工程

2.1 构建docker容器

我们提供了一个叫做dev-latest的docker镜像,docker容器会将你本地的apollo工程挂载到 /apollo

bash docker/scripts/dev_start.sh

2.2 进入docker容器

bash docker/scripts/dev_into.sh

2.3 编译工程

# To make sure you start clean
bash apollo.sh clean
# Build the full system
bash apollo.sh build_opt

3. 配置定位模块

为了使定位模块正确运行,需要对地图路径和传感器外参进行配置。假设下载的定位数据的所在路径为DATA_PATH。

在进行以下步骤前,首先确定你在docker容器中。

3.1 配置传感器外参

将定位数据中的传感器外参拷贝至指定文件夹下。

  cp -r DATA_PATH/params/* /apollo/modules/localization/msf/params/

文件夹中各个外参的意义

  • ant_imu_leverarm.yaml: 杆臂值参数,GNSS天线相对Imu的距离

  • velodyne128_novatel_extrinsics.yaml: Lidar相对Imu的外参

  • velodyne128_height.yaml: Lidar相对地面的高度

3.2 配置地图和参数路径

在/apollo/modules/localization/conf/localization.conf中配置地图和参数的路径

# Redefine the map_dir in global_flagfile.txt
--map_dir=DATA_PATH

# The pointcloud topic name.
--lidar_topic=/apollo/sensor/lidar128/compensator/PointCloud2

# The lidar extrinsics file
--lidar_extrinsics_file=/apollo/modules/localization/msf/params/velodyne_params/velodyne128_novatel_extrinsics.yaml

这将会覆盖global_flagfile.txt中的默认值。

4. 运行多传感器融合定位模块

cyber_launch start /apollo/modules/localization/launch/msf_localization.launch

在/apollo/data/log目录下,可以看到定位模块输出的相关log文件。

  • localization.INFO : INFO级别的log信息

  • localization.WARNING : WARNING级别的log信息

  • localization.ERROR : ERROR级别的log信息

  • localization.out : 标准输出重定向文件

  • localizaiton.flags : 启动localization模块使用的配置

5. 播放演示record文件

cd DATA_PATH/records
cyber_recorder play -f record.*

从播放数据到定位模块开始输出定位消息,大约需要50s左右时间。

6. 记录并可视化定位结果(可选)

记录定位结果

python /apollo/scripts/record_bag.py --start

该脚本会在后台运行录包程序,并将存放路径输出到终端上。

可视化定位结果

运行可视化工具

cyber_launch start /apollo/modules/localization/launch/msf_visualizer.launch

该可视化工具首先根据定位地图生成用于可视化的缓存文件,存放在/apollo/cyber/data/map_visual目录下。

然后接收以下topic并进行可视化绘制。

  • /apollo/sensor/lidar128/compensator/PointCloud2

  • /apollo/localization/msf_lidar

  • /apollo/localization/msf_gnss

  • /apollo/localization/pose

可视化效果如下 1

注意: 在定位模块正常工作之后(/apollo/localization/pose开始输出消息),可视化模块才会弹出显示窗口。可以用*/cyber_monitor*命令查看topic情况。

7. 结束运行定位模块

退出定位程序和播包程序,如果有运行步骤6的录包脚本,需执行以下命令关闭后台录包程序。

python /apollo/scripts/record_bag.py --stop

8. 验证定位结果(可选)

假设步骤6中录取的数据存放路径为OUTPUT_PATH,杆臂值外参的路径为ANT_IMU_PATH

运行脚本

/apollo/scripts/msf_local_evaluation.sh OUTPUT_PATH

该脚本会以RTK模式的定位结果为基准,与多传感器融合模式的定位结果进行对比。

注意: (注意只有在GNSS信号良好,RTK定位模式运行良好的区域,这样的对比才是有意义的。)

获得如下统计结果:

2

可以看到两组统计结果,第一组是组合导航(输出频率200hz)的统计结果,第二组是点云定位(输出频率5hz)的统计结果。

表格中各项的意义,

  • error: 平面误差,单位为米

  • error lon: 车前进方向的误差,单位为米

  • error lat: 车横向方向的误差,单位为米

  • error roll: 翻滚角误差,单位为度

  • error pit: 俯仰角误差,单位为度

  • error yaw: 偏航角误差,单位为度

  • mean: 误差的平均值

  • std: 误差的标准差

  • max: 误差的最大值

  • <30cm: 距离误差少于30cm的帧所占的百分比

  • <1.0d: 角度误差小于1.0d的帧所占的百分比

  • con_frame(): 满足括号内条件的最大连续帧数