pcl 포인트 클라우드 데이터를 Eigen::Map으로 변환

pcl 포인트 클라우드 데이터를 Eigen::Map으로 변환

요구 사항 : 포인트 클라우드 프로그램이 CUDA 전송을 수행할 때 사용할 수 있는 getMatrixXfMap() 함수 매개 변수 및 관련 사용법을 이해합니다.

참조 :
pcl 포인트 클라우드 및 Eigen::Map 변환


1. 기능 설명:

1.1 장점 설명

포인트 클라우드 데이터 포인트 형식은 계산을 위해 매트릭스 형식으로 변환됩니다.값을 직접 할당하면 메모리 공간이 다시 열리므로 큰 데이터 포인트 클라우드에는 현실적이지 않습니다.
따라서 메모리 매핑을 위해 Eigen::Map을 사용하십시오 节省内存空间,加快处理速度.

1.2 함수 프로토타입

// pcl/point_cloud.h文件中
inline Eigen::Map<Eigen::MatrixXf, Eigen::Aligned, Eigen::OuterStride<> > 
      getMatrixXfMap (int dim, int stride, int offset)

참고 :
pcl1.4.0부터 Eigen 행렬은 PCL에서 알고리즘의 효율성을 향상시키기 위해 행 주요(Row Major)로 강제됩니다.
원본 텍스트에서: 1:1 방식으로 PointCloud 구조를 Eigen::Map에 올바르게 매핑합니다 点云中的点数 = 矩阵中的行数,点维度 = 矩阵中的列数.

이 논문에서 얻은 결론은 원본 텍스트와 반대입니다., 点云中的点数 = 矩阵中的列,点维度 = 矩阵中的行数, getMatrixXfMap(4,4,0)과 같은 xyzi 포인트 클라우드 데이터를 4*size의 포인트 클라우드 매트릭스로 변환할 수 있습니다.


1.3 파라미터 설명

  • 매개변수 1: dim, 각 점이 고려해야 하는 차원
  • 매개변수 2: stride, 각 포인트에 포함된 값의 개수
  • 매개변수 3: offset, 각 포인트의 시작 위치에서 건너뛰기 횟수

1.4 구체적인 예

  1. 새로운 포인트 클라우드를 생성하고 인덱스 값에 따라 포인트 클라우드의 x, y, z, i를 할당하여 인쇄 및 보기에 편리합니다.
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_test(new pcl::PointCloud<pcl::PointXYZI>);
for (int i = 0; i < 10; i++) {
    pcl::PointXYZI p;
    p.x = i;
    p.y = i;
    p.z = i;
    p.intensity = i;
    cloud_test->points.push_back(p);
}

2) 변환 기능을 사용하여 xyz 좌표 값 추출

auto pc_matrix = cloud_test->getMatrixXfMap(3,8,0);

설명: 왜 (3,8,0)입니까?
각 점은 xyz의 3차원을 취하기 때문에 첫 번째 dim은 3을 취합니다. 세 번째 오프셋 값은 첫 번째 x부터 시작하므로 세 번째 매개변수 오프셋은 0입니다.

두 번째 값이 8인 이유는 무엇입니까?
처음에는 각 포인트가 4개의 부동 소수점 숫자를 포함하는 xyzi이므로 의구심이 들 수 있습니다. 그러나 pcl::PointXYZI 구조의 조직 형태를 보면 다음과 같습니다. [3]은 intensity 값이 아니라 1.0f가 할당됩니다.
또한 EIGEN_ALIGN16을 보면 16바이트 정렬이 사용되고 부동 소수점 숫자 float가 4바이트를 차지함을 알 수 있습니다. 즉, 이 8개의 부동 소수점 숫자는 각각 x,y,z,data[3]=1.0f, data[4]=intensity,data[5] ,data[6] ,data[7]. (여기서 data[5], data[6], data[7]은 할당되지 않음)

// PointXYZI结构体
  struct PointXYZI : public _PointXYZI
  {
    inline PointXYZI (const _PointXYZI &p)
    {
      x = p.x; y = p.y; z = p.z; data[3] = 1.0f;
      intensity = p.intensity;
    }
  }
  
// EIGEN_ALIGN16 16字节对齐
  struct EIGEN_ALIGN16 _PointXYZI
  {
    PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
    union
    {
      struct
      {
        float intensity;
      };
      float data_c[4];
    };
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  };
  1. 변환 함수를 사용하여 강도 행렬 추출
auto trans_cloudi = cloud_test->getMatrixXfMap(1,8,4);

4) pc_matrix 및 trans_cloudi의 값을 인쇄하여 4*10의 행렬을 얻습니다.
결과 다이어그램:
여기에 이미지 설명 삽입
다음과 같이 속성을 통해 행렬 차원을 볼 수도 있습니다.

auto col = pc_matrix.row(0).size(); // 10
auto row = pc_matrix.col(0).size(); // 3 
auto intensity_col = trans_cloudi.row(0).size(); // 10

추천

출처blog.csdn.net/weixin_36354875/article/details/126134952