为了在每帧点云中滤除噪声点,选择了半径滤波器,也用高斯滤波器测试过,但是没有半径效果好,这里记录下在 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 增加半径滤波器!的更多相关文章

  1. ROS 八叉树地图构建 - 使用 octomap_server 建图过程总结!

    构建语义地图时,最开始用的是 octomap_server,后面换成了 semantic_slam: octomap_generator,不过还是整理下之前的学习笔记. 一.增量构建八叉树地图步骤 为 ...

  2. ROS 八叉树地图构建 - 安装 octomap 和 octomap_server 建图包!

    项目要用到八叉树库 Octomap 来构建地图,这里记录下安装.可视化,并启用带颜色的 Octomap 的过程. 一.Apt 安装 Octomap 库 如果你不需要修改源码,可以直接安装编译好的 oc ...

  3. ROS中利用V-rep进行地图构建仿真

    V-rep中显示激光扫描点  在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...

  4. Slam(即时定位与地图构建) 知识篇

    Slam即时定位与地图构建 技术解释 同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过 ...

  5. 即时定位与地图构建SLAM(Simultaneous Localization and Mapping)

    SLAM 即时定位与地图构建SLAM(Simultaneous Localization and Mapping) 参考链接: 视觉SLAM漫谈,http://www.cnblogs.com/gaox ...

  6. ORB-SLAM2初步--局部地图构建

    一.局部地图构建简介 为什么叫“局部”地图构建,我的理解是这个线程的主要任务是像地图中插入关键帧(包括地图点等信息),以及需要进行LocalBA优化一个局部地图,这是相对于回环检测时进行的全局优化来说 ...

  7. ROS笔记2 构建一个package

    构建package catkin_make 可以理解为一个集成了CMake和make的命令行工具 通常的cmake构建如下 # In a CMake project $ mkdir build $ c ...

  8. 软件篇-03-基于ORB_SLAM2手写SLAM稠密地图构建实现

    本文使用的方法不是从内部修改ORBSLAM2源码以获取稠密点云,而是先从ZED2 sdk获取以摄像头坐标系为描述的三维点云/作为点云地图的一个子集,然后融合IMU与ORB_SLAM2进行实时定位,通过 ...

  9. 【高德地图开发4】---增加覆盖物setMapTextZIndex

    高德地图 Android SDK 允许用户将添加的线.面等覆盖物设置在地图底图文字的上方或下方. 具体实现是使 用 AMap 类的 setMapTextZIndex() 方法来设置地图底图文字的z轴指 ...

随机推荐

  1. react实战 : react 与 svg

    有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...

  2. vuex : 模块化改造

    我们知道,vuex是vue技术栈中很重要的一部分,是一个很好用的状态管理库. 如果你的项目没有那么复杂,或者对vuex的使用没有那么重度,那么,是用不着modules功能的. 但如果你写着写着就发现你 ...

  3. Java历史[史上最详细的阐述了Java发展的历史过程]

    Java历史 学习Java语言之前,我觉得大家应该是从头开始,对吧?不管你之前是学过还是没学过,都和学习某一个知识一样,从头开始去了解它,然后到这个深入的掌握,到最后你可能理解并且灵活的运用.所以它肯 ...

  4. WinForm微信扫码登录

    源码还需优化,不喜勿喷. 微信官方文档 : https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat ...

  5. 将音频文件转二进制分包存储到Redis(奇淫技巧操作)

    功能需求: 一.获取本地音频文件,进行解析成二进制数据音频流 二.将音频流转化成byte[]数组,按指定大小字节数进行分包 三.将音频流分成若干个包,以List列表形式缓存到redis数据库中 四.从 ...

  6. Python2.7 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 问题解决

    # 报错信息 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.insta ...

  7. mongoose子文档生成不了_id,查询困难的解决办法

    以下是我的数据库表 本来是想设置一个自增属性,比如listId,来定义我的子list,sliderlist这些,这样能确保他的唯一性,结果尝试了很久都无法成功,原生,插件都无法成功, 这两个网址是讲的 ...

  8. Python字符串内建函数_上

    Python字符串内建函数: 注:汉字属于字符(既是大写又是小写).数字可以是: Unicode 数字,全角数字(双字节),罗马数字,汉字数字. 1.capitalize( ): 将字符串第一个字母大 ...

  9. Jmeter 中 CSV 如何参数化测试数据并实现自动断言

    当我们使用Jmeter工具进行接口测试,可利用CSV Data Set Config配置元件,对测试数据进行参数化,循环读取csv文档中每一行测试用例数据,来实现接口自动化.此种情况下,很多测试工程师 ...

  10. Python os.rename() 方法

    概述 os.rename() 方法用于命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError.高佣联盟 www.cgewang.com 语法 rename()方法语 ...