乐趣区

关于人工智能:PCL小功能重构-Eigen小工具

前言

  不得不说 pcl 性能的确很弱小,弱小到能够通过调用函数实现样点的操作,然而对于独立的小性能而言,很多时候并不一定须要调用 pcl 库,而是能够通过简略的数学运算搞定。本文章次要记录一些简略性能的原理与 Eigen 的实现。

矩阵转换

  在点云处理过程中,须要经常性的对点云进行空间姿势的转换,在 pcl 中,通过调用 pcl::transformPointCloudWithNormals()pcl::transformPointCloud()可实现对点云的坐标转换,然而,此函数须要特定的数据类型作为输出,在应用中,如果只是对个别样点进行坐标转换,采纳调函数的形式就略显臃肿了,所以,现将该函数重形成 Eigen 库的实现。
  旋转矩阵与样点及其属性的转换次要有两个:其一为空间坐标的转换,其二为空间方向的转换。
  根本步骤:

  1. 将 3 维坐标扩大为齐次坐标:旋转矩阵示意空间坐标的组合变换,即蕴含旋转变换,又蕴含平移变换,从变换关系剖析,须要先进行旋转静止,而后再进行平移静止,旋转的计算用 * 实现,平移的计算用 + 实现;从计算模式上剖析,是一个 4*4 的矩阵,所以要放弃行列统一能力进行计算,具体齐次坐标转化为:
空间坐标:(100, 200, 300) -> (100, 200, 300, 1)
空间方向:(1.0, 0.0, 0.0) -> (1.0, 0.0, 0.0, 0)
  1. 应用齐次坐标示意矩阵相乘:

  1. 测试代码如下:
    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;
退出移动版