前言
不得不说pcl性能的确很弱小,弱小到能够通过调用函数实现样点的操作,然而对于独立的小性能而言,很多时候并不一定须要调用pcl库,而是能够通过简略的数学运算搞定。本文章次要记录一些简略性能的原理与Eigen的实现。
矩阵转换
在点云处理过程中,须要经常性的对点云进行空间姿势的转换,在pcl
中,通过调用pcl::transformPointCloudWithNormals()
与pcl::transformPointCloud()
可实现对点云的坐标转换,然而,此函数须要特定的数据类型作为输出,在应用中,如果只是对个别样点进行坐标转换,采纳调函数的形式就略显臃肿了,所以,现将该函数重形成Eigen
库的实现。
旋转矩阵与样点及其属性的转换次要有两个:其一为空间坐标的转换,其二为空间方向的转换。
根本步骤:
- 将3维坐标扩大为齐次坐标:旋转矩阵示意空间坐标的组合变换,即蕴含旋转变换,又蕴含平移变换,从变换关系剖析,须要先进行旋转静止,而后再进行平移静止,旋转的计算用
*
实现,平移的计算用+
实现;从计算模式上剖析,是一个4*4
的矩阵,所以要放弃行列统一能力进行计算,具体齐次坐标转化为:
空间坐标:(100, 200, 300) -> (100, 200, 300, 1)空间方向:(1.0, 0.0, 0.0) -> (1.0, 0.0, 0.0, 0)
- 应用齐次坐标示意矩阵相乘:
- 测试代码如下:
pcl::PointNormal tmp; tmp.x = 100; tmp.y = 200; tmp.z = 300; tmp.normal_x = 1.0; tmp.normal_y = 0.0; tmp.normal_z = 0.0; Eigen::Vector4f point(tmp.x, tmp.y, tmp.z, 1); Eigen::Vector4f normal(tmp.normal_x, tmp.normal_y, tmp.normal_z, 0); cout << "point = " << (mat * point).transpose() << endl; cout << "normal = " << (mat * normal).transpose() << endl;