laser_filters 也用了挺久,感觉还是蛮好用的,最近看了下源码( laser_filters包为kinetic-devel, filters包为hydro-devel),在这里写个流水账。

laser_filters

总的来说 laser_filters包 调用了 filters包,下面来详细阅读下代码。

<launch>
<node pkg="laser_filters" type="scan_to_scan_filter_chain" output="screen" name="laser_filter"><rosparam command="load" file="$(find laser_filters)/examples/speckle_filter_example.yaml" />
</node>
</launch>
scan_filter_chain:
- name: speckle_filtertype: laser_filters/LaserScanSpeckleFilterparams:# Select which filter type to use.# 0: Range based filtering (distance between consecutive points)# 1: Euclidean filtering based on radius outlier searchfilter_type: 0# Only ranges smaller than this range are taken into accountmax_range: 2.0# filter_type[0] (Distance): max distance between consecutive points# filter_type[1] (RadiusOutlier): max distance between pointsmax_range_difference: 0.1# filter_type[0] (Distance): Number of consecutive ranges that will be tested for max_distance# filter_type[1] (RadiusOutlier): Minimum number of neighborsfilter_window: 2

先看launch文件,启动了 scan_to_scan_filter_chain 并导入了 yaml文件。 scan_to_scan_filter_chain 可执行文件是由 scan_to_scan_filter_chain.cpp 生成的,scan_to_scan_filter_chain.cpp 中使用了 class scan_to_scan_filter_chain , class scan_to_scan_filter_chain 中又使用了 filters::FilterChain<sensor_msgs::LaserScan> filter_chain_; 。在类初始化时使用了 filter_chain_.configure("scan_filter_chain", private_nh_); 配置 filter_chain_ ,在激光数据到来时会使用 filter_chain_.update(*msg_in, msg_) 滤波。
下面再继续看 filters包 中的 filter_chain

filters

filters包 使用了ROS的插件机制,这个插件机制实现还是挺神奇的,以后有空可以详细了解下,开始阅读代码filter_chain.h。

bool configure(std::string param_name, ros::NodeHandle node = ros::NodeHandle())
{XmlRpc::XmlRpcValue config;if(node.getParam(param_name + "/filter_chain", config)){std::string resolved_name = node.resolveName(param_name).c_str();ROS_WARN("Filter chains no longer check implicit nested 'filter_chain' parameter.  This node is configured to look directly at '%s'.  Please move your chain description from '%s/filter_chain' to '%s'", resolved_name.c_str(), resolved_name.c_str(), resolved_name.c_str());}else if(!node.getParam(param_name, config)){ROS_DEBUG("Could not load the filter chain configuration from parameter %s, are you sure it was pushed to the parameter server? Assuming that you meant to leave it empty.", param_name.c_str());configured_ = true;return true;}return this->configure(config, node.getNamespace());
}

filter_chain_.configure("scan_filter_chain", private_nh_); 传参为"scan_filter_chain",再根据上文中的yaml文件,所以在 else if(!node.getParam(param_name, config)) 这里可以获取到参数服务器上的数据,最后又执行了这个 this->configure(config, node.getNamespace())

bool configure(XmlRpc::XmlRpcValue& config, const std::string& filter_ns)
{......//省略了检查数据的部分,前面检查数据结构,后面检查name不能重复,然后把type存起来bool result = true;for (int i = 0; i < config.size(); ++i){boost::shared_ptr<filters::FilterBase<T> > p(loader_.createInstance(config[i]["type"]));if (p.get() == NULL)return false;result = result &&  p.get()->configure(config[i]);    reference_pointers_.push_back(p);std::string type = config[i]["type"];std::string name = config[i]["name"];ROS_DEBUG("%s: Configured %s:%s filter at %p\n", filter_ns.c_str(), type.c_str(),name.c_str(),  p.get());}if (result == true){configured_ = true;}return result;
};

这里就是将所有的type(滤波插件)实例化后,再配置一遍,params也都用上了。
还用到一个 XmlRpc::XmlRpcValue ,这个是跟ros的底层通信有关,参考中列了一些链接。
最后 bool update(const T& data_in, T& data_out) 就是根据配置依次滤波。
还有个需要注意下,只用到了 类FilterBase(所有的滤波插件都继承了该类),类MultiChannelFilterBase 和 类MultiChannelFilterChain 都没用到,不要看错了。(不要问为什么会有这个提醒o(╥﹏╥)o)


参考

laser_filters wiki
filters wiki
ros_comm
一文搞懂XML、Json、Protobuf序列化协议
探索ROS中的XML

laser_filters源码整体分析相关推荐

  1. Spring源码整体分析

    spring 架构原理图 核心注解 常用注解 @Bean 使用 @Bean + @Configuration 的形式可以替代 xml 配置文件的形式 @Import @Import:指示要导入的一个或 ...

  2. 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

    上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer4(后面简称Ids4)的认证相关知识,在具体介绍ids4实现 ...

  3. FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)

    > ffmpeg源码分析 ffmpeg源码简析(一)结构总览- https://blog.csdn.net/Louis_815/article/details/79621056 FFmpeg的库 ...

  4. NJ4X源码阅读分析笔记系列(一)——项目整体分析

    NJ4X源码阅读分析笔记系列(一)--项目整体分析 NJ4X是什么 参见NJ4X的官网:http://www.nj4x.com/ Java and .Net interfaces to support ...

  5. vs2008编译QT开源项目--太阳神三国杀源码分析(一) 项目编译及整体分析

    请参看 http://tieba.baidu.com/f?kz=1508964881 按照上面的网址教程,下载三国杀源码,swig工具,并下载最新的QT4.8.2 for vs2008.我本机已经安装 ...

  6. vue-cli 3.0 源码分析

    写在前面 其实最开始不是特意来研究 vue-cli 的源码,只是想了解下 node 的命令,如果想要了解 node 命令的话,那么绕不开 tj 写的 commander.js.在学习 commande ...

  7. Weex Android SDK源码分析

    前言 最近开始试水Weex开发,使用这么长一段时间,感觉写Weex还是非常方便的.作为一个Android开发,免不了要追查一下weex的sdk源码.今天,就以Weex SDK for Android为 ...

  8. 博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 博通 ...

  9. 【java毕业设计】基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码)——酒水销售系统

    基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+SSH+jsp的酒水销售系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  10. 详细讲解go web框架之gin框架源码解析记录及思路流程和理解

    开篇 首先gin 框架是在 官方提供的net/http标准包进行的相应封装. 那么要想理解gin框架, 就要先懂一些 net/http标准包 的相关知识. 可以参考中文的 文档: https://st ...

最新文章

  1. Java(三):序列化
  2. 2.1 CPU 上下文切换(上)
  3. 联想拯救者y7000加内存条_关于2020款联想拯救者Y7000、R7000和Y7000P,r7000p选哪个好?看这里就对了...
  4. Android Studio 1.1.0汉化初步出炉!
  5. android 时间函数 性能,Android 性能优化——启动时间优化
  6. CTO@全体成员,未经允许和评审不让用反射,Java反射到底慢在哪?
  7. 【生信进阶练习1000days】day13-GEOquery
  8. 零极点图定性绘制系统的幅频特性
  9. STATA:面板数据滞后需要注意(同一家企业滞后出现空缺数据的原因)
  10. Win系统 - 重装系统(微PE、MSDN镜像)【绝对纯净】
  11. 使用 processon 画 UML 图
  12. 南邮CTF逆向题第三道Py交易解题思路
  13. 论文笔记:PPT: Pre-trained Prompt Tuning for Few-shot Learning
  14. An error occurred while automatically activating bundle com.android.ide.ecli
  15. 最好的60个国外壁纸网站
  16. 文字,字体,图像,列表
  17. Failed resolution of: Landroid/webkit/TracingController;
  18. 如何保护您的域名系统免遭劫持
  19. js实现touch移动触屏滑动事件
  20. 室外无人驾驶挑战赛小结-2019‘恩智浦’杯全国大学生智能车竞赛

热门文章

  1. 最长上升子序列 CSU - 1047 ( LIS LCS )
  2. VDI(Virtual Desktop Infrastructure)云桌面使用笔记
  3. 【六】ubuntu发行版本构建工具
  4. 出租屋宽带网络解决方案
  5. 【一日一logo|day_8】坦格利安家族?修改什么的不存在的
  6. 生产制造追溯系统-再说条码打印
  7. 单片机数码管动态显示时钟C语言,如何利用单片机数码管程序模拟是时钟显示时间?...
  8. linux ipsec racoon工具移动客户端模式详细配置
  9. OpenGL学习例程精析(3d纹理)
  10. PDF添加页码(itext)