温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么给octomap_server增加半径滤波器

发布时间:2021-12-30 09:09:20 来源:亿速云 阅读:91 作者:iii 栏目:大数据

本篇内容介绍了“怎么给octomap_server增加半径滤波器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、半径滤波器基本原理

放一张汇报用的 PPT 截图:

怎么给octomap_server增加半径滤波器  

原理很简单就是判断一个点云周围(半径 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 分辨率,红框内部有很多单个的点:

怎么给octomap_server增加半径滤波器  

这是滤波后的效果,滤波半径 1m,近邻点 10 个:

怎么给octomap_server增加半径滤波器 


“怎么给octomap_server增加半径滤波器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI