ROS 八叉树地图构建 - 给 octomap_server 增加半径滤波器!
为了在每帧点云中滤除噪声点,选择了半径滤波器,也用高斯滤波器测试过,但是没有半径效果好,这里记录下在 octomap_server 中增加半径滤波器的步骤,并在 launch 中配置滤波器参数。
一、半径滤波器基本原理
放一张汇报用的 PPT 截图:
原理很简单就是判断一个点云周围(半径 R)有没有足够多(K)的邻居点,如果没有就删除这个点,否则就保留。
二、基本用法
我一般学习技术喜欢到官网看最原始的教程:Removing outliers using a Conditional or RadiusOutlier removal,这个教程介绍了半径滤波器(我不清楚中文名到底叫什么滤波器)的基本用法:
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>
// 输入待滤波的原始点云指针
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
// 保存滤波后的点云指针
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
// 创建滤波器对象
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
// 设置要滤波的点云
outrem.setInputCloud(cloud);
// 设置滤波半径
outrem.setRadiusSearch(0.8);
// 设置滤波最少近邻数
outrem.setMinNeighborsInRadius (2);
// 执行半径滤波
outrem.filter (*cloud_filtered);
如果第一次使用 PCL 的滤波器,可以把这个教程自己运行一遍,我之前运行过了,这次就不贴代码了,下面分享下我在实际项目中如果使用这个半径滤波器对我的 octomap_server 构建的八叉树地图进行滤波。
三、给我的地图滤波
3.1 定义半径滤波器参数
半径滤波器有 2 个参数:滤波半径和半径内部邻居数,注意数据类型
// 滤波半径
double m_outrem_radius;
// 半径内的邻居数
int m_outrem_neighbors;
在构造函数初始化列表中初始化:
OctomapServer::OctomapServer(const ros::NodeHandle private_nh_, const ros::NodeHandle &nh_)
: ...,
m_outrem_radius(-std::numeric_limits<double>::max()),
m_outrem_neighbors(-std::numeric_limits<int>::max()),
...
从 launch 中读取启动参数:
// add outrem filter
m_nh_private.param("outrem_radius", m_outrem_radius, m_outrem_radius);
m_nh_private.param("outrem_neighbors", m_outrem_neighbors, m_outrem_neighbors);
3.2 执行半径滤波
在 InsertPointCloudCallBack 函数的 PassThough 前执行半径滤波,即对每一帧点云在构建八叉树地图前进行滤波,主要是为了去掉单独的离群点:
// 对一帧 pc 点云进行半径滤波
pcl::RadiusOutlierRemoval<pcl::PointXYZRGB> outrem;
// 这里需要传递指针,因为我的 pc 不是指针,所以这里做了 makeShared
outrem.setInputCloud(pc.makeShared());
// 设置滤波半径,这里设置为 1m
outrem.setRadiusSearch(m_outrem_radius);
// 设置滤波近邻数,这里设置为 10 个
outrem.setMinNeighborsInRadius (m_outrem_neighbors);
// 执行滤波
outrem.filter(pc);
3.3 在 launch 中配置半径滤波器参数
<param name = "outrem_radius" type = "double" value = "1.0">
<param name = "outrem_neighbors" type = "int" value = "10">
这样以后就可以从 launch 中直接配置滤波器的参数了,不用每次修改再重新编译,这样调试起来非常方便。
3.4 滤波结果
这是原始地图,15cm 分辨率,红框内部有很多单个的点:
这是滤波后的效果,滤波半径 1m,近邻点 10 个:
效果还是可以的,希望能对你有帮助,如果使用其他的滤波器,按照官方的教程来就行了,掌握学习方法才是最重要的:)
ROS 八叉树地图构建 - 给 octomap_server 增加半径滤波器!的更多相关文章
- ROS 八叉树地图构建 - 使用 octomap_server 建图过程总结!
构建语义地图时,最开始用的是 octomap_server,后面换成了 semantic_slam: octomap_generator,不过还是整理下之前的学习笔记. 一.增量构建八叉树地图步骤 为 ...
- ROS 八叉树地图构建 - 安装 octomap 和 octomap_server 建图包!
项目要用到八叉树库 Octomap 来构建地图,这里记录下安装.可视化,并启用带颜色的 Octomap 的过程. 一.Apt 安装 Octomap 库 如果你不需要修改源码,可以直接安装编译好的 oc ...
- ROS中利用V-rep进行地图构建仿真
V-rep中显示激光扫描点 在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...
- Slam(即时定位与地图构建) 知识篇
Slam即时定位与地图构建 技术解释 同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过 ...
- 即时定位与地图构建SLAM(Simultaneous Localization and Mapping)
SLAM 即时定位与地图构建SLAM(Simultaneous Localization and Mapping) 参考链接: 视觉SLAM漫谈,http://www.cnblogs.com/gaox ...
- ORB-SLAM2初步--局部地图构建
一.局部地图构建简介 为什么叫“局部”地图构建,我的理解是这个线程的主要任务是像地图中插入关键帧(包括地图点等信息),以及需要进行LocalBA优化一个局部地图,这是相对于回环检测时进行的全局优化来说 ...
- ROS笔记2 构建一个package
构建package catkin_make 可以理解为一个集成了CMake和make的命令行工具 通常的cmake构建如下 # In a CMake project $ mkdir build $ c ...
- 软件篇-03-基于ORB_SLAM2手写SLAM稠密地图构建实现
本文使用的方法不是从内部修改ORBSLAM2源码以获取稠密点云,而是先从ZED2 sdk获取以摄像头坐标系为描述的三维点云/作为点云地图的一个子集,然后融合IMU与ORB_SLAM2进行实时定位,通过 ...
- 【高德地图开发4】---增加覆盖物setMapTextZIndex
高德地图 Android SDK 允许用户将添加的线.面等覆盖物设置在地图底图文字的上方或下方. 具体实现是使 用 AMap 类的 setMapTextZIndex() 方法来设置地图底图文字的z轴指 ...
随机推荐
- T133305 57级返校测试重测-T1-数字配对
大致题意: 给定偶数个的数字,操作使得两两配对后的最大值最小. 基本思路: 先排序,然后设i=1,j=n(序列以下标1开始), 每次配对为a[i]+a[j],然后++i,--j. 最后找到最大的配对结 ...
- 资深CIO介绍如何选型OA系统的?
OA办公系统成为企业管理的标配软件,在于可有效加强组织管理能力,提高员工协同效率,助力企业科学决策,合理分配企业资源,提升企业综合实力与市场竞争力.企业OA选型的经验总结来说也就是品牌.技术.产品.服 ...
- 学会Markdown不仅可以用来编写文档,还可以制作自己的简历,真香!
程序员的简历要简洁明了,不要太多花哨的修饰,突出重点即可,使用markdown就可以很好的满足写一份简历的需求 Markdown 简历模板 这里我贡献一下我自己的markdown简历模板,简历效果如下 ...
- 题解 洛谷 P4112 【[HEOI2015]最短不公共子串】
给定两个字符串\(A\)和\(B\),我们需要找出一个串,其在\(A\)中出现且不在\(B\)中出现,这个串为子串或者子序列,求在每种情况下,该串的最短长度. 考虑到后缀自动机可以识别一个字符串的所有 ...
- SUCTF2019-web Easyweb
<?php function get_the_flag(){ // webadmin will remove your upload file every 20 min!!!! $userdir ...
- Azure Load Balancer(一) 为我们的Web项目提供负载均衡
一,引言 上节,我们讲到使用 Azure Traffic Manager 为我们的 Demo 项目提供负载均衡,以及流量转发的功能.但是Azure 提供类似的功能的服务远远不止这一个,今天我们就来讲一 ...
- python(xlsxwriter模块使用)
XlsxWriter简介XlsxWriter是一个Python模块,可用于在Excel 2007+ XLSX文件中写入多个工作表的文本,数字,公式和超链接.它支持格式化等功能.可到官网了解更多详情,官 ...
- django表单使用
一.表单常用字段类型及参数 表单可以自动生成html代码,每一个字段默认有一个html显示样式,大多数默认为输入框. 字段相当于正则表达式的集合,能够对表单传入的数据进行校验,并且某一部分校验失败时会 ...
- 让内层浮动的Div将外层Div撑开 -----清浮动
清浮动的好处写多了都能体会到,解决高度塌陷, 一般情况下是要清除浮动的,不然会影响下面标签的排版. <div class="parent" style="width ...
- ionic 侧边栏实例
侧边栏的使用范例: <body > <ion-side-menus> <!-- 中间内容 --> <ion-side-menu-content ng-cont ...