九、ROS小车闭环控制:使用laser_filters在ROS内对二维(2D)激光雷达数据进行基本滤波

在ROS内对二维(2D)激光雷达数据进行基本滤波

    • 基础知识
    • 实现方法
    • 总结

基础知识

首先我的平台是ROS Kinetic Ubuntu 16.04。
但是我认为其他平台也是大同小易。由于此方面的内容很多博客都做了wiki翻译,我就懒得再复读这些东西,直接讲怎么操作,因为,我没有搜到直接讲操作的博文……
详细英文内容请参考:http://wiki.ros.org/laser_filters
总结一下,此滤波器可以实现:

  1. LaserArrayFilter:将激光雷达数据放入一个数组中以便其他操作;
  2. ScanShadowsFilter:过滤掉可能因为遮挡效应而产生的数据(?)
  3. InterpolationFilter:向可信点间插入数据
  4. LaserScanIntensityFilter:过滤掉给定密度上下界范围之外的数据
  5. LaserScanRangeFilter:过滤掉指定扫描距离范围之外的雷达数据
  6. LaserScanAngularBoundsFilter:过滤掉指定扫描角度范围之外的雷达数据
  7. LaserScanAngularBoundsFilterInPlace:过滤掉指定扫描角度范围之内的雷达数据(与上面刚好相反)
  8. LaserScanBoxFilter:过滤掉指定的box范围内额数据

实现方法

这个滤波器是针对2D激光雷达的。常见的2D激光雷达有贵族之选:HOKUYO,屌丝之选:国产的,绝望之选:Kinect V1或者V2。具体使用方法都比较容易找到,不在此赘述。
总之,我们假定你的rostopic list里面,有了/scan,消息类型为:sensor_msgs/LaserScan

1 将https://github.com/ros-perception/laser_filters这个工程直接导入你的CATKIN工程空间的src文件夹,常规ROS操作,类似这样:

cd 到你的src目录
git clone https://github.com/ros-perception/laser_filters.git
如果使用的是roboware,直接于工程根目录:catkin_make 即可

编译之后,可以使用了。
2 想办法让你的/scan话题信息开始更新。
3 开新终端,切换到src/laser_filters/examples目录,这里以中值滤波器为例。运行:

rosparam load median_filter_5_example.yaml scan_to_scan_filter_chain
rosrun laser_filters scan_to_scan_filter_chain

可能出现如下画面:
九、ROS小车闭环控制:使用laser_filters在ROS内对二维(2D)激光雷达数据进行基本滤波_第1张图片
不用理会warn。
4 开新终端,运行:

source ~/你的工程目录/devel/setup.bash
roslaunch laser_filters median_filter_5_example.launch

此时会有:
九、ROS小车闭环控制:使用laser_filters在ROS内对二维(2D)激光雷达数据进行基本滤波_第2张图片
此时我们再去rostopic list查看,并echo:laserscan_filtered,就可以发现过滤数据的变化了。

如何显示 /scan 数据,本处暂不做讨论。使用rviz和ROS导航包是可以实现的,实际上就是建图问题,例如这个教程:https://blog.csdn.net/forrest_z/article/details/56665631

总结

这个滤波器的原理,是把滤波器编译成lib文件然后使用,并不是简单的ROS节点。因此,直接就去运行例子中的launch是不行的,需要如本文所述,先运行rosparam参数,然后rosrun 启动 scan_to_scan_filter_chain,目的是,让雷达扫描的每一帧数据先形成一个很大的多维数组,再干后续的滤波等等操作,也就是官方给出的example操作。
由于官方给的操作顺序说明有点语焉不详,特此简述与此。
只给了中值滤波的例子,其他的一样,只要先rosrun了scan_to_scan_filter_chain就好。

echo出来的效果差不多这样,怎样视觉化、怎么后续处理是另一个话题了。

你可能感兴趣的:(kinect2,ROS小车闭环实现)