2.2.3 雷达融合简介
激光雷达是机器人的最重要组成部分之一,一般情况下我们可以在机器人上“置顶”安装一个激光雷达,以实现平面内360°无死角扫描。但是在一些特殊场景下,这种安装方式不能满足我们的的需求,比如:
1.装载货物的自动导向车(AGV),提供了开放的载货平台,由于载货的需要一般不会“置顶”安装雷达,更多的是在车体前后分别安装一个激光雷达;
2.多机器人编队时,为了能够让不同机器人可以发现彼此,也不会采用“置顶”的安装方式,与AGV车类似的,也会在车体周边安装多个激光雷达;
3.对于“较高”的机器人而言,如果只安装一个单线激光雷达,由于单线激光雷达只能扫描一个平面,那么显然的在运行过程中是有安全隐患的。一种的解决方案是使用多线激光雷达进行替换,但是这样会导致成本飙升。另一种更简单的方式是可以在纵向上排列多个单线雷达,以提升整体的安全性。
......
在上述场景中,同一机器人上都是安装了多个激光雷达,可以尽量避免盲区。但随之而来也遇到另一个问题,每一个雷达都对应一个扫描源,而在ROS中某些软件模块实现,比如部分建图、定位等只支持单扫描源,那么应该如何解决这个问题呢?这种情况下,就需要使用到雷达融合了。所谓雷达融合是指将多个激光雷达的数据进行整合,以获得更全面、准确和鲁棒的环境感知信息的过程。
1.功能包简介
在ROS2中,提供了ira_laser_tools功能包,这个功能包下提供了两个节点:
- laserscan_multi_merger
- laserscan_virtualizer
这两个节点是处理激光雷达数据的工具,通过这两个工具,调用者可以订阅多个激光扫描源并将它们合并到同一个扫描中,或者也可以从点云中生成虚拟的激光扫描。
二者都使用了ROS中的pointcloud_to_laserscan的部分代码。laserscan_multi_merger可以轻松地、动态地将多个相同时间、单一扫描面的激光数据扫描合并成一个。这对于在具有多个单线激光雷达的车辆上使用只需要一个激光扫描作为输入的应用程序是十分有用的。Laserscan_virtualizer则可以轻松地、动态地从一个点云中生成虚拟激光扫描,例如将多线激光雷达生成的点云数据转换成单线激光雷达数据。
ira_laser_tools功能包依赖于pcl点云库,需要调用如下指令安装:
sudo apt install ros-${ROS_DISTRO}-pcl-ros
支持ROS2的ira_laser_tools功能包,可以从github下载,指令如下:
git clone https://github.com/nakai-omer/ira_laser_tools.git -b ${ROS_DISTRO}
然后构建功能包。
2.节点说明
本节主要介绍laserscan_multi_merger节点的使用。接下来我们简单了解一下该节点订阅的话题、发布的话题以及所需参数。
(1).订阅的话题
多扫描源发布扫描数据( sensor_msgs/msg/LaserScan)的话题(有多个,可以通过参数设置)。
(2).发布的话题
merged_cloud( sensor_msgs/msg/PointCloud2)
- 发布的点云数据(可通过参数设置话题名称)
scan_multi(sensor_msgs/msg/LaserScan)
- 合并后的扫描数据(可通过参数设置话题名称)
(3).所需参数
destination_frame
- 雷达融合后参考的坐标系(默认"cart_frame")
cloud_destination_topic
- 发布点云数据的话题(默认"/merged_cloud")
scan_destination_topic
- 发布扫描数据的话题(默认"/scan_multi")
laserscan_topics
- 订阅的扫描数据话题列表
angle_min
- 扫描起始角度[以弧度为单位](默认 -3.14)
angle_max
- 扫描结束角度[以弧度为单位](默认 3.14)
angle_increment
- 相邻两条射线之间的角距离[以弧度为单位](默认 0.0058)
scan_time
- 扫描(以激光发射时间为依据)间隔时间[以秒为单位](默认 0.0)
range_min
- 最小测量距离[以米为单位](默认 0.0)
range_max
- 最大测量距离[以米为单位](默认 25.0)