laser_filters源码整体分析
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源码整体分析相关推荐
- Spring源码整体分析
spring 架构原理图 核心注解 常用注解 @Bean 使用 @Bean + @Configuration 的形式可以替代 xml 配置文件的形式 @Import @Import:指示要导入的一个或 ...
- 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析
上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer4(后面简称Ids4)的认证相关知识,在具体介绍ids4实现 ...
- FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)
> ffmpeg源码分析 ffmpeg源码简析(一)结构总览- https://blog.csdn.net/Louis_815/article/details/79621056 FFmpeg的库 ...
- NJ4X源码阅读分析笔记系列(一)——项目整体分析
NJ4X源码阅读分析笔记系列(一)--项目整体分析 NJ4X是什么 参见NJ4X的官网:http://www.nj4x.com/ Java and .Net interfaces to support ...
- vs2008编译QT开源项目--太阳神三国杀源码分析(一) 项目编译及整体分析
请参看 http://tieba.baidu.com/f?kz=1508964881 按照上面的网址教程,下载三国杀源码,swig工具,并下载最新的QT4.8.2 for vs2008.我本机已经安装 ...
- vue-cli 3.0 源码分析
写在前面 其实最开始不是特意来研究 vue-cli 的源码,只是想了解下 node 的命令,如果想要了解 node 命令的话,那么绕不开 tj 写的 commander.js.在学习 commande ...
- Weex Android SDK源码分析
前言 最近开始试水Weex开发,使用这么长一段时间,感觉写Weex还是非常方便的.作为一个Android开发,免不了要追查一下weex的sdk源码.今天,就以Weex SDK for Android为 ...
- 博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译
声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 博通 ...
- 【java毕业设计】基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码)——酒水销售系统
基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+SSH+jsp的酒水销售系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...
- 详细讲解go web框架之gin框架源码解析记录及思路流程和理解
开篇 首先gin 框架是在 官方提供的net/http标准包进行的相应封装. 那么要想理解gin框架, 就要先懂一些 net/http标准包 的相关知识. 可以参考中文的 文档: https://st ...
最新文章
- Java(三):序列化
- 2.1 CPU 上下文切换(上)
- 联想拯救者y7000加内存条_关于2020款联想拯救者Y7000、R7000和Y7000P,r7000p选哪个好?看这里就对了...
- Android Studio 1.1.0汉化初步出炉!
- android 时间函数 性能,Android 性能优化——启动时间优化
- CTO@全体成员,未经允许和评审不让用反射,Java反射到底慢在哪?
- 【生信进阶练习1000days】day13-GEOquery
- 零极点图定性绘制系统的幅频特性
- STATA:面板数据滞后需要注意(同一家企业滞后出现空缺数据的原因)
- Win系统 - 重装系统(微PE、MSDN镜像)【绝对纯净】
- 使用 processon 画 UML 图
- 南邮CTF逆向题第三道Py交易解题思路
- 论文笔记:PPT: Pre-trained Prompt Tuning for Few-shot Learning
- An error occurred while automatically activating bundle com.android.ide.ecli
- 最好的60个国外壁纸网站
- 文字,字体,图像,列表
- Failed resolution of: Landroid/webkit/TracingController;
- 如何保护您的域名系统免遭劫持
- js实现touch移动触屏滑动事件
- 室外无人驾驶挑战赛小结-2019‘恩智浦’杯全国大学生智能车竞赛
热门文章
- 最长上升子序列 CSU - 1047 ( LIS LCS )
- VDI(Virtual Desktop Infrastructure)云桌面使用笔记
- 【六】ubuntu发行版本构建工具
- 出租屋宽带网络解决方案
- 【一日一logo|day_8】坦格利安家族?修改什么的不存在的
- 生产制造追溯系统-再说条码打印
- 单片机数码管动态显示时钟C语言,如何利用单片机数码管程序模拟是时钟显示时间?...
- linux ipsec racoon工具移动客户端模式详细配置
- OpenGL学习例程精析(3d纹理)
- PDF添加页码(itext)