点云中点法向量,点拟合的直线,点拟合的平面

news/2024/11/29 12:49:40/

点云中点法向量

计算步骤:

找到点pi相邻点集合S所有点Vi,然后去中心化,并构造协方差矩阵,公式如下:

二维点云该点曲率计算方法:

三维点云该点曲率计算方法:

\frac{\lambda _{1}}{\lambda _{1}+\lambda_{2}+\lambda_{3} }

最小特征值对应的特征向量就是点的法向量

Eigen::Vector2d ComputeNormal(std::vector<Eigen::Vector2d> &nearPoints)
{Eigen::Vector2d normal;//计算激光点法向量,NICP计算法向量的方法Eigen::Vector2d average;//周围点的几何中心average.setZero();//置0for(auto v : nearPoints)//遍历每个点{average += v / nearPoints.size();//求其周围点的几何中心}Eigen::Matrix2d covariance;//协方差矩阵covariance.setZero();//置0for(auto v : nearPoints)//遍历每个点{covariance += (v - average) * (v - average).transpose() / nearPoints.size();//求协方差矩阵}Eigen::EigenSolver<Eigen::Matrix2d> eigen_solver(covariance);//转化为对角线矩阵Eigen::Vector2d eigenValues = eigen_solver.pseudoEigenvalueMatrix().diagonal();//特征值,协方差所有特征值构成向量Eigen::Matrix2d eigenVectors = eigen_solver.pseudoEigenvectors();//特征向量,协方差所有特征向量构成矩阵normal = eigenValues(0) < eigenValues(1) ? eigenVectors.col(0) : eigenVectors.col(1);//计算法向量return normal;
}

点拟合的直线

相邻点集合S拟合成一条直线。

计算步骤:

计算出点集合协方差矩阵M(也就是上面的计算公式),特征向量为E,特征值为V,那么中一个特征值就会明显比其他两个大,最大特征值所对应特征向量就是直线的方向。(特征值:两小一大,大方向)

Eigen::Vector3d ComputeLineNormal(std::vector<Eigen::Vector3d> &nearPoints)
{//计算激光点直线法向量Eigen::Vector3d center;//周围点的几何中心center.setZero();//置0for(auto v : nearPoints)//遍历每个点{center += v / nearPoints.size();//求其周围点的几何中心}Eigen::Matrix3d covMat;//协方差矩阵covMat.setZero();//置0for(auto v : nearPoints)//遍历每个点{Eigen::Matrix<double, 3, 1> tmpZeroMean = v - center;covariance += tmpZeroMean * tmpZeroMean.transpose();//求协方差矩阵}Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> saes(covMat);Eigen::Vector3d unit_direction = saes.eigenvectors().col(2); //最大特征值对应的特征向量->边缘线方向// 最大特征值大于次大特征值的3倍认为是线特征if (saes.eigenvalues()[2] > 3 * saes.eigenvalues()[1]){Eigen::Vector3d point_on_line = center;Eigen::Vector3d point_a, point_b;// 根据拟合出来的线特征方向,以平均点为中心构建两个虚拟点,代替一条直线point_a = 0.1 * unit_direction + point_on_line;point_b = -0.1 * unit_direction + point_on_line;}return unit_direction; //返回线的法向量
}

点拟合平面

如果点集合S在一块平面上,

计算步骤:

计算出点集合协方差矩阵M(也就是上面的计算公式),特征向量为E,特征值为V,那么其中一个特征值就会明显比其他两个小,最小特征值所对应特征向量就是平面法向量。(特征值:两大一小,小方向)

//假设传进来的nearPoints有五个点
void  ComputePlaneNormal(std::vector<Eigen::Vector3d> &nearPoints)
{//平面方程 Ax + By + Cz + 1 =0 平面法向量(A,B,C)[待求] 已知5个点求解3个未知数,构建超定方程AX = b求解平面法向量;Eigen::Matrix<double, 5, 3> matA0; //A = 5 * 3 系数矩阵方程Eigen::Matrix<double, 5, 1> matB0 = -1 * Eigen::Matrix<double, 5, 1>::Ones();for (int j = 0; j < 5; j++){matA0(j, 0) = nearPoints[j][0];matA0(j, 1) = nearPoints[j][1];matA0(j, 2) = nearPoints[j][2];}Eigen::Vector3d norm = matA0.colPivHouseholderQr().solve(matB0);//平面法向量求解double negative_OA_dot_norm = 1 / norm.norm();norm.normalize(); //法向量单位化 B.normalize() = B / B.norm() B 是个向量// Here n(pa, pb, pc) is unit norm of planebool planeValid = true;// 根据求出来的平面方程进行校验,看看是不是符合平面约束for (int j = 0; j < 5; j++){// if OX * n > 0.2, then plane is not fit well//点到平面的距离公式: Ax + By + Cz + D = 0 的距离公式 = fabs(Ax0 + By0 + Cz0 + D) / sqrt(A^2 + B^2 + C^2) //由于前面已经进行归一化,将系数除以分母,所以可以直接代点进去求距离if (fabs(norm(0) * nearPoints[j][0] +norm(1) * nearPoints[j][1] + norm(2) * nearPoints[j][2] + negative_OA_dot_norm) > 0.2){planeValid = false;break;}}
}

参考:点云配准方法---ICP升级版本NICP(Normal ICP) - 古月居

 GitHub - HKUST-Aerial-Robotics/A-LOAM: Advanced implementation of LOAM


http://www.ppmy.cn/news/3982.html

相关文章

S3 Drive支持以及FIPS 140-2兼容性

S3 Drive支持以及FIPS 140-2兼容性 在Windows Arm64上运行-添加了在Microsoft Windows for Arm64上的功能。无需额外下载&#xff0c;安装程序将为您的系统选择正确的驱动程序和库。 现在符合FIPS 140-2。 现在&#xff0c;您可以使用新的CacheOnlyFiles设置阻止上载临时(或其他…

遇到华为防火墙双机热备故障,可以用这份笔记排查就行!

1、为什么原主用防火墙抢占后业务中断 如果主备切换后业务正常&#xff0c;原主用防火墙抢占后业务中断&#xff0c;通常是因为路由尚未收敛&#xff0c;或者会话表备份不完整。另外&#xff0c;某些交换机整机故障后&#xff0c;在重新启动的过程中&#xff0c;接口可能反复U…

面试怎么回答MySQL索引问题,看这里

前言 小A在宿舍里跟哥们开五黑打排位中&#xff0c;突然收到女神小美的消息&#xff1a;“小A&#xff0c;我今天面试碰到索引问题了&#xff0c;我没回答好”。小A顾不上游戏抓紧回复到&#xff1a;“到你宿舍某某咖啡店吧&#xff0c;我帮你一起看下”。 小A抓紧时间换了衣…

数字货币市场风暴肆虐,币圈人应该把握哪些新的赛道机遇

11月11日&#xff08;周五&#xff09;美股盘前&#xff0c;曾经为全球第二大加密货币交易所FTX在推特发布了申请破产保护的声明&#xff0c;创始人SBF已经辞去CEO职务。据声明&#xff0c;FTX已经任命John J. Ray III 担任CEO&#xff0c;SBF还将协助相关破产事宜。据FTX在推特…

按键控制LED

通过查询原理图 得到 #include "reg52.h" sbit key1 P2^1; sbit led1 P3^7; sbit key2 P2^0; void main() { //查询是否被按下 while(1){ if (key1 0){ led1 0;//灯亮 给P3.7一个低电平 } if(key2 0){ …

Launcher PAI无法自动下载某个应用

问题背景 配置launcher在线布局的时候&#xff0c;编译apk发给客户上传ADCP(Android Device Configuration Portal)。 按照要求配置布局之后&#xff0c;客户反馈有一个应用没有被自动下载。 问题分析 1、搜索该应用&#xff0c;发现story中无法搜索到。 2、在chrome中搜索改…

YOLOv5小目标切图检测

当我们在检测较大分辨率的图片时&#xff0c;对小目标的检测效果一直是较差的&#xff0c;所以就有了下面几种方法&#xff1a; 将图片压缩成大尺寸进行训练&#xff08; 想法&#xff1a;没显存&#xff0c;搞不来&#xff09;添加小检测头&#xff08;想法&#xff1a;P5模型…

计算机二级MS-Office真题及答案-历年汇总

计算机二级MS-Office真题及答案-历年汇总- 计算机二级MS- Office真题及答案- 历年汇总- 基 础 一、 选择题 1、 世界上首先实现存储程序的电子数字计算机是____。 A、ENIAC B、UNIVAC C、EDVAC D、EDSAC 2、计算机科学的奠基人是____。 A、查尔斯.巴贝奇 B、图灵 C、阿塔诺…