【PCL】PCL中的包围盒计算原理及代码实现

本文介绍了PCL中包围盒的概念及其在点云处理中的应用,包括AABB、包围球、OBB和FDH四种类型。重点讲述了基于PCA的最小包围盒计算原理,并给出了代码实现,最后展示了AABB和OBB包围盒的测试结果。
摘要由CSDN通过智能技术生成


前言

在PCL(Point Cloud Library)中,包围盒是一种用于描述点云数据中物体边界的几何形状。它通常是一个立方体或圆柱体,可以用来包围点云数据中的物体,并且可以方便地计算点云数据中的物体位置、大小和形状等信息。

PCL中提供了多种不同类型的包围盒,包括立方体、球体、圆柱体、多边形等等。这些包围盒可以通过设置它们的参数来调整其大小和形状,以适应不同的点云数据和应用场景。

在使用包围盒进行点云数据分割、目标检测、姿态估计等任务时,通常需要先使用某种算法从点云数据中提取出物体的边界信息,然后将这些边界信息与包围盒进行匹配,从而确定每个物体的位置、大小和形状等信息。PCL中提供了多种用于点云数据分割、目标检测、姿态估计等任务的算法,并且这些算法通常都会使用包围盒来辅助处理点云数据。

一、包围盒算法介绍

包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。

常见的包围盒算法有AABB包围盒、包围球、方向包围盒OBB以及固定方向凸包FDH。碰撞检测问题在虚拟现实、计算机辅助设计与制造、游戏及机器人等领域有着广泛的应用,甚至成为关键技术。而包围盒算法是进行碰撞干涉初步检测的重要方法之一。
最常见的包围盒算法有AABB包围盒(Axis-aligned bounding box轴对齐包围盒),包围球(Sphere), 方向包围盒OBB(Oriented bounding box)以及固定方向凸包FDH(Fixed directions hulls或k-DOP)。
在这里插入图片描述

AABB是应用最早的包围盒。它被定义为包含该对象,且边平行于坐标轴的最小六面体(坐标轴平行不仅指盒体与世界坐标轴平行,同时也指盒体的每个面都和一条坐标轴垂直。同一物体的不同方向,AABB也可能不同。如果物体在场景中移动变换,它的AABB也需要随之移动,当物体发生旋转时,有两种选择,用变换后的物体来重新计算AABB,或者对AABB做和物体同样的变换)。故描述一个AABB,仅需六个标量。AABB构造比较简单,存储空间小,但紧密性差,尤其对不规则几何形体,冗余空间很大,当对象旋转时,无法对其进行相应的旋转。处理对象是刚性并且是凸的,不适合包含软体变形的复杂的虚拟环境情况。

AABB内的点需要满足xyz分别大于最小的坐标和小于最大的坐标点。因此需要知道两个顶点最小点,最大点;中心点是两个顶点的中点代表了包围盒的质心。

对象的包围球被定义为包含该对象的最小的球体。确定包围球,首先需分别计算组成对象的基本几何元素集合中所有元素的顶点的x,y,z坐标的均值以确定包围球的球心,再由球心与三个最大值坐标所确定的点间的距离确定半径r。包围球的碰撞检测主要是比较两球间半径和与球心距离的大小。(由于球体只有一个自由度,所以检测球对物体方向不敏感。)

OBB是较为常用的包围盒类型。它是包含该对象且相对于坐标轴方向任意的最小的长方体(OBB是根据物体本身的几何形状来决定盒子的大小和方向,盒子不需要和坐标轴垂直)。OBB最大特点是它的方向的任意性,这使得它可以根据被包围对象的形状特点尽可能紧密的包围对象,但同时也使得它的相交测试变得复杂。OBB包围盒比AABB包围盒和包围球更加紧密地逼近物体,能比较显著地减少包围体的个数,从而避免了大量包围体之间的相交检测。但OBB之间的相交检测比AABB或包围球体之间的相交检测更费时。

FDH(k-DOP)是一种特殊的凸包,继承了AABB简单性的特点,但其要具备良好的空间紧密度,必须使用足够多的固定方向。被定义为包含该对象且它的所有面的法向量都取自一个固定的方向(k个向量)集合的凸包。FDH比其他包围体更紧密地包围原物体,创建的层次树也就有更少的节点,求交检测时就会减少更多的冗余计算,但相互间的求交运算较为复杂。

优缺点:

AABB也是比较简单的一类包围盒。但对于沿斜对角方向放置的瘦长形对象,其紧密性较差。由于AABB相交测试的简单性及较好的紧密性,因此得到了广泛的应用,还可以用于软体对象的碰撞检测。

包围球是比较简单的包围盒,而且当对象发生旋转运动时,包围球不需做任何更新,当几何对象进行频繁的旋转运动时,使用包围球可能会得到很好的结果;当对象变形时,需要重新计算其包围球。但它的紧密性是比较差的,因此较少使用。

OBB的简单性要比上面两种包围盒差,但它的紧密性是比较好的,可以大大减少参与相交测试的包围盒的数目,因此总体性能要优于AABB和包围球。当几何对象发生旋转运动后,只要对OBB进行同样的旋转即可。因此,对于刚体间的碰撞检测,OBB不失为一种较好的选择,但迄今为止,还没有一种有效的方法能够较好地解决对象变形后OBB树的更新问题,而重新计算每个结点的OBB的代价又太大,所以OBB不适用于包含软体对象的复杂环境中。

FDH相对于上面三种包围盒其紧密性是最好的,同时其相交测试算法比OBB要简单的多。可以用于软体对象的碰撞检测。

二、基于PCA的包围盒实现原理

最小包围盒的计算过程大致如下:
1.利用PCA主元分析法获得点云的三个主方向,获取质心,计算协方差,获得协方差矩阵,求取协方差矩阵的特征值和特长向量,特征向量即为主方向。
2.利用1中获得的主方向和质心,将输入点云转换至原点,且主方向与坐标系方向重回,建立变换到原点的点云的包围盒。
3.给输入点云设置主方向和包围盒,通过输入点云到原点云变换的逆变换实现。

最小包围盒顶点计算的过程大致如下:
1.输入点云转换至远点后,求得变换后点云的最大最小x,y,z轴的坐标,此时(max.x,max.y,max.z),(max.x,min.y,max.z),(max.x,max.y,min.z),(min.x,max.y,max.z),(min.x,max.y,min.z),(min.x,min.y,max.z),(min.x,min.y,max.z),(min.x,min.y,min.z)
即为变换后点云的包围盒,也是原始输入点云包围盒顶点坐标经过变化后的坐标.
2.将上述求得的6个包围盒坐标逆变换回输入点云的坐标系,即得到原始输入点云的包围盒顶点坐标.

三、代码实现

计算AABB包围盒

void AABB(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
   
	
	pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
	feature_extractor.setInputCloud(cloud);
	feature_extractor.compute();

	std::vector <float> moment_of_inertia;
	std::vector <float> eccentricity;

	pcl::PointXYZ min_point_AABB;//AABB包围盒
	pcl::PointXYZ max_point_AABB;

	Eigen::Vector3f major_vector, middle_vector, minor_vector;
	Eigen::Vector3f mass_center;

	feature_extractor.getMomentOfInertia(moment_of_inertia);
	feature_extractor.getEccentricity(eccentricity);
	feature_extractor.getAABB(min_point_AABB, max_point_AABB);
	feature_extractor.getEigenVectors(major_vector, middle_vector, minor_vector);
	feature_extractor.getMassCenter(mass_center);

	//绘制AABB包围盒
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shanhedian2013

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

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

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

打赏作者

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

抵扣说明:

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

余额充值