目标:
本篇文章记录我使用autoware进行rosbag的录制并且利用录制的rosbag进行点云重建。如果只是知道了怎么在autoware界面上跟着文档点来点去完成建图,那么这篇文章就失去了意思,所以这篇文章将适当深入到每一个步骤中的细节,争取更加深刻的掌握相关的技术。
内容:
- 录制ROSBAG
- Autoware下的坐标系
- 加载点云数据.bag 文件
- 回放点云数据
- 坐标系的转换
- 点云回放并建图
- 实时可视化点云重建过程(有意思但不是必做)
- 点云输出并且打开观察
正文来了:
本次进行建图的场所是实验室外侧,笔者花了一个小时左右的时间对室内这个场所进行了简单建图,下图是建图场所的实际图片:
录制rosbag
这部分的详细介绍以及原理请参考上一小节的文章
链接:Autoware.ai开源自动驾驶系统学习日记(一):使用Autoware录制激光雷达的rosbag数据包
开启autoware和机器人的相关功能
roslaunch turn_on_wheeltec_robot open_autoware.launch
使用键盘控制车辆进行录制
roslaunch wheeltec_robot_rc keyboard_teleop.launch
录制完保存随便一个路径下(能找到就ok)
Autoware下的坐标系
Autoware 主要采用了离线的建图方式进行建图。这里,首先介绍一下 Autoware 建图用的坐标系之间的关系,Autoware 用的坐标系有四类:世界坐标系 world,地图坐标系 map,小车坐标系base_link,传感器坐标系 velodyne,它们之间的关系如图所示:
在Autoware中,TF(Transform)关系是用来表示不同坐标系之间的位置和方向关系的重要概念。通过TF关系,可以实现这些坐标系之间的转换,这对于实现自动驾驶车辆的定位、导航和感知等功能至关重要。下面是一些解释:
世界坐标系(world)到地图坐标系(map)的转换:
Broadcaster:/world_to_map是发布TF关系的节点或主题。
Average rate:97.712表示平均更新频率为97.712次/秒,这是一个相对较高的频率,说明系统频繁更新这一坐标系转换。
Buffer length:4.912秒,这表示系统保留了大约5秒内的转换历史记录,以便于回溯或延迟处理。
Most recent transform 和 Oldest transform 显示了最新和最旧的转换时间戳,表明这个转换在不断更新。
地图坐标系(map)到小车坐标系(base_link)的转换:
Broadcaster:/ndt_mapping,这通常表示用于地图到车辆基本坐标系转换的节点,涉及导航定位技术NDT(Normal Distributions Transform)。
Average rate:21.328,更新频率较低,可能因为这种类型的转换不需要那么频繁的更新。
Buffer length:0.75秒,较短的缓冲区长度意味着系统更依赖于实时数据。
基本连接(base_link)到传感器坐标系(velodyne)的转换:
Broadcaster:/base_link_to_localizer,这是base_link到velodyne激光雷达的转换。
Average rate:97.969,与世界到地图的转换相似,非常高的频率说明这个转换也在频繁更新。
Buffer length:9.993秒,这是三者中最长的缓冲区,可能是因为传感器数据处理需要更多的历史数据来进行精确的定位和感知。
在自动驾驶系统中,这些坐标系之间的精确转换是实现高精度导航和环境感知的关键。每种转换都反映了不同组件间的相对位置和姿态,对于整车的定位、规划和控制至关重要。
从 world 到 map 的坐标系转换与从 base_link 到 velodyne 的坐标系转换是固定的,用 ROS 的 TF 即可。从 map 到 base_link 的映射就需要正态分布变换(NDT)算法,autoware 在建图采用的是 ndt_mapping
这里world到map和base link 到velodyne是当系统开启时就确定下来了,但是map到base link这一部分由于车辆一直在动,所以需要利用算法进行计算。autoware使用的是ndt_mapping。
加载点云数据.bag 文件
这个步骤需要单独打开 autoware,不能同时运行打开雷达等其他传感器,雷达等其他传感器信息由 ROSBAG 提供。运行:
roslaunch runtime_manager runtime_manager.launch
注意这一步和上一步的区别
打开Autoware之后,点击进 [Simulaton]页面,点击界面右上方[Ref] 按钮,加载之前录制的 bag 文件。
回放点云数据
点击[Play]按钮开始播放数据,然后点击[Pause]暂停播放。此时你会发现右边进度条有数值出现,如下所示:
当点云数据开始回放时点击Pause
暂停。
坐标系的转换
加载从 base_link 到 velodyne 雷达坐标系的 TF,加载车辆模型
点击进入[Setup]页面,确保[Localizer]下选项为[Velodyne],在[Baselink to Localizer]中设置好各个参数之后点击 TF 按钮,其中 x、y、z、yaw、pitch、roll表示真车雷达中心点与车身后轴中心点的 TF 位置关系。
选择合适的 urdf 小车模型然后点击[Vehicle Model]加载模型,如果[Vehicle Model]为空,那么会加载一个默认模型(在 rviz 显示时,如果有激光雷达数据,车辆会显示为黑色)。
设置从 world 到 map 转换
按照文档的说明点击[Map]页面,先点击[TF]的[ref],选择~/wheeltec_robot/src/turn_on_wheeltec_robot/launch/lgsvl-tf.launch 文件后,再点击[TF]加载该文件。我们进去这个文件看看是个啥东西。
将代码复制给GPT看看这个是什么东西:
也就是说,如果按照文档的说明,世界坐标系和地图坐标系是重合的,在此我不知道这么设计的缘由是什么,因此先行跳过,顺便去问一下厂家的技术支持,如果那边的回答有作用的话我再po到这下面。
设置 map到base link的转换
这一部分依靠NDT算法来完成,在[Compulting]菜单栏中找到[lidar_localizer]下的[Ndt_Mapping]选项,需要先设置[app]的一些参数后,才能勾选[Ndt_Mapping]。
Ndt_Mapping [app]的参数设置:
Resolution:ndt 分辨率,最大建图精度越低,默认为 1 即可
Step size:步长,默认为 0.1
Transformation epsilon:两次正态变换允许的最大值,默认为 0.01 米
Maximum iterations:最大迭代次数,默认为 30 次
Leaf size:点云降采样用的体素叶大小,室内可设置小点,室外可设置大点
Minimum scan range:设置雷达最小范围,过滤较近处雷达点云,推荐设置小点:0.15
Maximum scan range:设置雷达最大范围,过滤较远处雷达点云,默认 200米
在[method type]栏中,勾选[pcl_anh]选项(无 GPU 加速的选[pcl_generic],有 GPU 加速的选[pcl_anh_gpu]。我们录制ROSBAG的时候用到了里程计和 imu辅助定位,因此把[use odometry]和[use imu]选项勾选上。
经过一番探索,我找到了ndt_mapping所在的launch节点,目录是
/home/wheeltec/autoware.ai/src/autoware/core_perception/lidar_localizer/launch/ndt_mapping.launch
内容如下:
关于ndt_mapping算法,我们如果细细探索下去那就不是这篇文章的任务的,后续我会抽出时间来对这部分的代码进行一个小深入,代码的位置是在:
autoware.ai/src/autoware/core_prediction/lidar_localizer/nodes/ndt_mapping/ndt_mapping.cpp
这里再给出一些别人的代码解析链接吧。
链接:autoware下ndt_mapping节点解读
链接:【Autoware1.14建图与定位】NDT-Mapping与NDT-Matching
点云回放并建图
设置完[app]里面的参数后退出
去到[Simulation]里面继续回放点云数据
勾选[ndt_mapping],此时终端开始显示进度:
这个代表了你正在进行重建的进度,他是在你回放的点云数据的基础下进行重建的,当你停止回访数据的时候,后面的数字会暂停增加,当回放数据结束并且ndt_mapping也结束的时候就是点云已经重建完毕了。
提示:如果两个数字之间相差太大的话电脑可能会卡死,因此会把这个差值控制到500以内,避免数据过大卡死,方法也很简单,就是去到[Simulation]里面pause去暂停回放,ndt_mapping赶上来的时候再继续。
实时可视化点云重建过程(有意思)
当我们的地图非常大的时候,这个过程会十分的漫长,我们其实可以去rviz里面实时看到点云重建的过程。
打开RVIZ
在autoware右下角点击[RVIZ]打开rviz
Fixed Frame 修改为: map
Add -> By topic -> /ndt_map下的PointCloud2
然后继续回放点云数据,你就会发现rviz里面显示出来了正在匹配的过程了。
点云输出并且打开观察
在rviz里面其实我们已经可以看到建图的效果了
回到ndt_mapping的[app]下选择保存点云的路径,并且点击[PCD OUTPUT]进行输出,这时候,点云就保存到本地了【320.pcd】
最后是打开我们的点云地图,进入终端
pcl_viewer 320.pcd