前言
不得不说 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;