深度相机辅助导航避障(三):地面点云滤除

在这里插入图片描述

前面的章节介绍了坐标变换,以及如何设置深度相机的坐标变换。那就可以很直观从机器人的坐标系对深度相机扫描到的障碍物点云进行处理。


在实际应用中,机器人正确估计周围地形,对于道路的可通过性、路径规划和障碍物检测等方面都很重要。那么在获取深度相机点云数据后就得准确分割出地面点云,去除地面对机器人导航的干扰。


对地面点云进行分割去除,通常是使用深度相机辅助导航避障等应用前的第一个步骤。地面点云的准确去除能够显著提升机器人导航的流畅性及避障能力。本文将介绍使用PCL点云处理库对地面点云分割滤除的实现方法。

在这里插入图片描述

PCL介绍

PCL(英语:Point Cloud Library)是一个开源的算法库,用于处理点云和计算机视觉中的三维几何过程。

PCL包含点云滤波、特征估计、三维重建、点云配准、模型拟合、目标识别和分割等算法。

对PCL库使用的入门,可以到官方网站https://pointclouds.org/ 进行详细的学习。

PCL库本身已经包含了与ROS点云数据类型进行互相转换的功能,所以在ROS中使用起来非常方便。


地面点云滤除流程

地面点云滤除的主要目的是从原始点云数据中分离出地面部分,保留非地面点云数据。本文将介绍地平面拟合方法以及基于高程差的滤除方法,实现简单、效果稳定。

以下为地面点云滤除的整体运行流程。

在这里插入图片描述

1.深度相机ros点云数据转换至机器人坐标系

在前面的章节《设置坐标变换》中已经介绍了如何发布深度相机安装位置的静态TF,如果不熟悉的可以再去翻看一下。

这里我们将获取该tf,并执行坐标变换。

// 转换成机器人坐标系
sensor_msgs::msg::PointCloud2 pointCloudBase;

geometry_msgs::msg::TransformStamped tfStamped;
try {
    tfStamped =
        tfBuffer_->lookupTransform(
        "base_link", msg.header.frame_id,
        tf2_ros::fromMsg(msg.header.stamp));
} catch (tf2::LookupException & ex) {
    RCLCPP_ERROR(
        this->get_logger(),
        "No Transform available Error looking up target frame: %s\n", ex.what());
    return;
}
tf2::doTransform(msg, pointCloudBase, tfStamped);

在获取到tf后,直接通过tf2::doTransform方法,将深度相机点云话题数据转换成基于机器人“base_link”坐标系的pointCloudBase

2.ros数据类型转成pcl数据类型

ros2点云的数据类型为sensor_msgs::msg::PointCloud2。要使其能够使用pcl库处理,需要将其转为pcl::PointCloud<pcl::PointXYZ>

使用pcl::fromROSMsg方法就可以很方便转换。

pcl::PointCloud<pcl::PointXYZ>::Ptr pclcloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::fromROSMsg(pointCloudBase, *pclcloud);

至此,得到了能使用pcl库处理的原始点云数据。

3.数据预处理

对原始的点云数据需要进行一些预处理操作,如滤波、去噪、降采样等,以提高后续处理的准确性以及处理效率。

在pcl库中。使用PassThrough filter,可以截掉范围外的点云,只保留想要的范围内的点云。

使用StatisticalOutlierRemoval filter,可以去除一些稀疏的噪声异常点云。

使用VoxelGrid filter,使用体素化网格方法对点云数据进行降采样(即减少点的数量)。

在这里插入图片描述

上图是一张深度相机斜向下打的点云图。

可以看到两侧的点云有点畸变,较远的点云比较稀疏不清晰,整体点云密度比较高,没有什么异常点。 因此对它的预处理只需要做直通滤波加体素滤波即可。

滤波器的用法教程可以看官方pcl文档的这几篇:

https://pcl.readthedocs.io/projects/tutorials/en/master/passthrough.html#passthrough

https://pcl.readthedocs.io/projects/tutorials/en/master/statistical_outlier.html#statistical-outlier-removal

https://pcl.readthedocs.io/projects/tutorials/en/master/voxel_grid.html#voxelgrid

我们对上面的点云数据进行预处理后,如下图所示

在这里插入图片描述


4.进行平面分割

pcl常用的平面分割方法为使用sac_segmentation模块,基于平面模型使用RANSAC算法进行平面分割。不过该方法一次只能拟合一个平面,可能没法一次就找出地面所在的平面。且由于现实的地面总是不会那么平滑,可能有起伏,可能有小坡度连接,也有可能深度相机本身给出的平面点云就是波动的。所以使用sac_segmentation就没有那么符合地面点云滤除的应用。

这里将介绍使用pcl 的Region growing segmentation(区域生长分割)方法,就能比较好的解决地面点云分割的问题。

pcl在pcl::RegionGrowing类中实现了区域生长算法。

该算法的目的是将在平滑度约束方面足够接近的点集合起来构成区域。输出一组点云簇。

基本思想从点云数据中选取一个或多个点作为种子点(通常选择曲率最小的点作为初始种子点),根据某种相似性准则(如法向量、曲率等),将种子点周围与种子点性质相似(或相同)的邻近点归并到种子点所在的区域中。重复上述过程,将新归并的点作为新的种子点,继续向周围生长,直到没有满足条件的点可以包括进来。

因此它能够解决不太平滑的地面也能分割到同一平面点云簇中。

具体算法理论和示例程序以及如何调参均可以看pcl这一篇文档:https://pcl.readthedocs.io/projects/tutorials/en/master/region_growing_segmentation.html#region-growing-segmentation 进行自行尝试,这里不再重复说明。

对前面预处理过的点云进行区域生长算法处理,分割后的结果,如下图所示。

在这里插入图片描述

5.选出地面点云并去除

通过上一个步骤,我们获得了一组分割出各个平面的点云簇。这一步,将选出地面部分的点云簇并去除!

这里将基于比较各个点云簇的高差的方法来滤除地面点云。处理简单且稳定。

方法可以简单描述为

  • 计算每个平面点云簇的的平均高度。
  • 去掉太低的平面。比较点云簇高度与预设的地面高度,若高度低于地面高度阈值,可以直接去除该点云簇。
  • 选出剩余点云簇中高度最低的,就是地面点云簇,将其去除,则处理完成。

pcl点云去除的教程可以看这篇文档:https://pcl.readthedocs.io/projects/tutorials/en/master/extract_indices.html#extract-indices

最终处理完的结果如下图所示:

在这里插入图片描述

6.转换回ros点云输出结果数据

使用pcl::toROSMsg方法就可以将pcl数据类型转回ros点云。

然后再进行一次tf变换将其还原回深度相机坐标系,即可输出去掉地面点云的结果数据。

<think>嗯,用户问的是点云去除地面和天花板的方法。首先,我需要回忆一下点云处理的相关知识。点云数据通常来自激光雷达或者深度相机,比如在自动驾驶或者维重建中常见。去除地面和天花板是为了减少数据量,专注于感兴趣的物体,比如行人、车辆等。 首先,得确定地面和天花板在点云中的特征。地面通常是平面,且位置较低;天花板则是较高的平面,尤其是在室内场景中。常见的算法可能有RANSAC、平面拟合、基于高度阈值的方法,或者更复杂的像区域生长法、深度学习模型。 接下来,RANSAC(随机抽样一致)算法可能是个基础方法。它通过随机采样点来拟合模型,比如平面模型,然后计算内点数量。对于地面,可以迭代应用RANSAC找到最大的平面,然后移除这些点。不过需要注意,RANSAC可能会错误地将其他大平面(如墙面)识别为地面,特别是在复杂环境中。 然后是高度阈值法,简单但依赖场景。比如设置z坐标低于某个值的点为地面,高于另一个值的为天花板。不过这在有坡度的地面或者不平整的天花板时效果不好,可能需要动态调整阈值。 另外,可能需要考虑法向量分析。地面的法向量通常垂直于重力方向,即竖直方向的向量,可以通过计算点的法向量来判断是否属于地面。不过计算法向量需要一定的计算量,特别是对大规模点云来说。 还有基于栅格的方法,将点云投影到二维栅格,分析每个栅格的高度分布,找出地面区域。例如,每个栅格中最低的点可能属于地面,而较高且集中的点可能是天花板。这种方法在自动驾驶中比较常用,比如Velodyne的HDL-64E数据。 近年来,深度学习的方法也开始应用,比如使用PointNet等网络结构进行语义分割,直接分类每个点是否为地面或天花板。但这种方法需要大量标注数据,且计算资源要求较高,可能不适合实时应用。 用户可能需要根据具体场景选择合适的方法。比如在自动驾驶中,RANSAC结合高度阈值可能更实用,而室内机器人导航可能需要结合栅格和法向量分析。此外,处理后的点云可能需要后处理步骤,比如去除孤立点,平滑处理等。 还需要考虑点云的密度和噪声。例如,稀疏点云地面点可能不够密集,导致RANSAC效果差;噪声点可能被误判为天花板。这时候可能需要预处理,比如降噪或者插值。 另外,多帧融合或者时序分析可能有助于动态场景,比如连续帧中地面位置的变化较小,可以利用这一特性提高去除的准确性。 总结起来,步骤大致是:预处理(去噪、降采样)→ 地面检测(RANSAC、高度阈值、栅格)→ 天花板检测(类似方法,但关注高处点)→ 后处理(优化结果)。需要根据实际数据调整参数,比如RANSAC的迭代次数、距离阈值等。</think>### 点云去除地面与天花板的方法介绍 点云去除地面和天花板是维数据处理中的关键步骤,常用于自动驾驶机器人导航、室内建模等领域。以下为常用方法及步骤解析: --- #### **1. 地面去除方法** ##### **a. RANSAC平面拟合** - **原理**:利用随机采样一致性算法(RANSAC)拟合地面平面模型。 - **步骤**: 1. 随机采样3个点生成候选平面方程 $$ax + by + cz + d = 0$$。 2. 计算所有点到该平面的距离,统计满足阈值的内点数量。 3. 迭代优化,保留内点最多的平面作为地面。 4. 移除属于该平面的点。 - **优点**:对噪声鲁棒,适合复杂地形。 - **缺点**:计算量较大,需手动设置距离阈值(如$d_{\text{max}} = 0.1\text{m}$)。 ##### **b. 高度阈值法** - **原理**:假设地面高度集中在一定范围内(如$z < z_{\text{ground}}$)。 - **步骤**: 1. 统计点云高度直方图,确定地面高度区间。 2. 过滤掉$z < z_{\text{ground}}$的点。 - **优点**:计算速度快。 - **缺点**:不适用于斜坡或不平整地面。 ##### **c. 栅格化分层法** - **原理**:将点云投影到二维栅格,按栅格内最低点或高度差过滤地面。 - **步骤**: 1. 将点云划分为$0.2\text{m} \times 0.2\text{m}$的栅格。 2. 提取每个栅格中最低的$N$个点作为地面。 3. 移除对应区域内的点。 - **优点**:适合大规模点云。 - **缺点**:对天花板等高平面无效。 --- #### **2. 天花板去除方法** ##### **a. 顶部高度截断** - **原理**:假设天花板位于固定高度(如$z > z_{\text{ceil}}$)。 - **步骤**: 1. 统计点云高度分布,确定天花板高度。 2. 过滤掉$z > z_{\text{ceil}}$的点。 - **适用场景**:室内结构化环境(如房间、走廊)。 ##### **b. 法向量约束** - **原理**:天花板法向量通常垂直于地面(如$n_z \approx 1$)。 - **步骤**: 1. 计算点云法向量。 2. 过滤法向量接近垂直向上的点。 - **优点**:可区分倾斜天花板。 - **缺点**:需额外计算法向量。 --- #### **3. 深度学习辅助方法** - **原理**:使用语义分割网络(如PointNet++、RandLA-Net)直接分类地面和天花板点。 - **步骤**: 1. 标注训练数据,定义地面/天花板标签。 2. 训练模型预测每个点的类别。 3. 过滤预测结果中的地面和天花板点。 - **优点**:适应复杂场景。 - **缺点**:依赖标注数据,计算资源需求高。 --- #### **4. 处理流程示例** 1. **预处理**:降采样、去噪。 2. **地面去除**:RANSAC拟合平面 → 移除内点。 3. **天花板去除**:顶部高度截断 → 移除高点。 4. **后处理**:连通域分析 → 去除孤立点。 --- #### **注意事项** - **参数调优**:RANSAC距离阈值、高度区间需根据场景调整。 - **动态场景**:自动驾驶中需结合时序信息更新地面模型。 - **性能权衡**:实时应用优先选择栅格化或高度阈值法;高精度场景选RANSAC或深度学习。 通过合理组合上述方法,可有效去除地面与天花板,提升后续目标检测或建模的准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kal-Lai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值