参考链接
功能简介
激光雷达通常可以检测360°或270°范围内的物体距离,但是由于机械结构设计等原因,机器人本体可能会遮挡部分雷达扫描数据。如果将激光雷达的原始数据直接用于SLAM建图或者导航,则机器人本体的一部分会被当作“障碍物”导致建图或导航无法正常工作。
为了解决这个问题,就需要对激光雷达的原始数据做处理,屏蔽掉已知不需要的数据来获得“纯净”的雷达数据。
laser_filters功能包中一共支持9种屏蔽方式,本文我们介绍最常见的两种屏蔽方式,角度范围屏蔽和BOX范围屏蔽。
使用前准备
安装laser_filters
sudo apt install ros-$ROS_DISTRO-laser-filters
创建一个新功能包用于存放launch文件和配置文件,例如laser_filter_test
cd ~/catkin_ws/src/ && catkin_create_pkg laser_filter_test
在功能包中创建launch和config两个目录
角度范围屏蔽示例
在config目录中创建angle.yaml配置文件,写入以下内容。即屏蔽雷达坐标系下-2.5~2.5弧度之间的数据
scan_filter_chain:
- name: angle
type: laser_filters/LaserScanAngularBoundsFilter
params: {lower_angle: -2.5, upper_angle: 2.5} # filter -143 ~ 143deg
在launch目录中创建angle_filter.launch文件,写入以下内容
<launch>
<node pkg="laser_filters" type="scan_to_scan_filter_chain" output="screen" name="front_laser">
<rosparam command="load" file="$(find laser_filter_test)/config/angle.yaml" />
</node>
</launch>
启动激光雷达,根据你所实际使用的激光雷达信号启动对应的雷达驱动节点,使用冰达机器人可以通过下面命令启动。
roslaunch robot_navigation lidar.launch
然后启动雷达角度屏蔽
roslaunch laser_filter_test angle_filter.launch
打开rviz,配置显示页面。将原始数据配置为红色显示,过滤后的数据为绿色显示,可以看到雷达后方为空白,即没有有效数据,范围约为-143°~143°
BOX范围屏蔽示例
在config目录中创建box.yaml配置文件,写入以下内容。即以base_laser_link坐标系为基准,屏蔽距离
scan_filter_chain:
- name: box
type: laser_filters/LaserScanBoxFilter
params:
box_frame: base_laser_link
min_x: -0.2
max_x: 0.2
min_y: -0.2
max_y: 0.2
min_z: -0.2
max_z: 0.2
在launch目录中创建box_filter.launch文件,写入以下内容
<launch>
<node pkg="laser_filters" type="scan_to_scan_filter_chain" output="screen" name="front_laser">
<rosparam command="load" file="$(find laser_filter_test)/config/box.yaml" />
</node>
</launch>
启动激光雷达,根据你所实际使用的激光雷达信号启动对应的雷达驱动节点,使用冰达机器人可以通过下面命令启动。
roslaunch robot_navigation lidar.launch
然后启动雷达BOX屏蔽
roslaunch laser_filter_test box_filter.launch
打开并配置rviz后可以看到,在划定的方框内,雷达原始数据又检测到物体,而过滤后的数据则没有显示