PCL point的类型解析

PCL中常用的point有 pcl::PointXYZ,pcl::PointXYZI
这些point的定义在PCL库的 point_types.hpp中完成,下面是总结。

pcl::PointXYZ

定义

struct _PointXYZ
{
  PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
  PCL_MAKE_ALIGNED_OPERATOR_NEW
};
struct EIGEN_ALIGN16 PointXYZ : public _PointXYZ
{
  inline PointXYZ (const _PointXYZ &p): PointXYZ(p.x, p.y, p.z) {}

  inline PointXYZ (): PointXYZ(0.f, 0.f, 0.f) {}

  inline PointXYZ (float _x, float _y, float _z)
  {
    x = _x; y = _y; z = _z;
    data[3] = 1.0f;
  }

  friend std::ostream& operator << (std::ostream& os, const PointXYZ& p);
  PCL_MAKE_ALIGNED_OPERATOR_NEW
};

PointXYZ是_PointXYZ的公有继承, _PointXYZ结构体中,包含PCL_ADD_POINT4D,这是一个宏,定义如下:

#define PCL_ADD_POINT4D \
   PCL_ADD_UNION_POINT4D \
   PCL_ADD_EIGEN_MAPS_POINT4D

其中 PCL_ADD_UNION_POINT4D、PCL_ADD_EIGEN_MAPS_POINT4D 也同样为宏,如下

#define PCL_ADD_UNION_POINT4D 
   union EIGEN_ALIGN16 { 
     float data[4]; 
     struct { 
       float x; 
       float y; 
       float z; 
     }; 
   };
 #define PCL_ADD_EIGEN_MAPS_POINT4D 
   inline pcl::Vector3fMap getVector3fMap () { return (pcl::Vector3fMap (data)); } 
   inline pcl::Vector3fMapConst getVector3fMap () const { return (pcl::Vector3fMapConst (data)); } 
   inline pcl::Vector4fMap getVector4fMap () { return (pcl::Vector4fMap (data)); } 
   inline pcl::Vector4fMapConst getVector4fMap () const { return (pcl::Vector4fMapConst (data)); } 
   inline pcl::Array3fMap getArray3fMap () { return (pcl::Array3fMap (data)); } 
   inline pcl::Array3fMapConst getArray3fMap () const { return (pcl::Array3fMapConst (data)); } 
   inline pcl::Array4fMap getArray4fMap () { return (pcl::Array4fMap (data)); } 
   inline pcl::Array4fMapConst getArray4fMap () const { return (pcl::Array4fMapConst (data)); }

PCL_ADD_UNION_POINT4D表示一个union,PCL_ADD_EIGEN_MAPS_POINT4D则代表一堆内联函数。
可以看出,PointXYZ的储存主体就是 union EIGEN_ALIGN16 了,声明成union的好处是,数组data和struct共占用同一个储存空间,这样PointXYZ的值就即可以用data数组表示也可以用x,y,z表示,union的储存结构:
在这里插入图片描述
在PointXYZ的构造函数中,设置x,y,z的值,再把数组 data[3],这样data数组就表示一个齐次坐标了,可以方便变换矩阵T的运算。

inline PointXYZ (float _x, float _y, float _z)
  {
    x = _x; y = _y; z = _z;
    data[3] = 1.0f;
  }

同时也可以运用 getVector3fMap ()、getVector4fMap等获取data数组的值。

pcl::PointXYZI

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];
  };
  PCL_MAKE_ALIGNED_OPERATOR_NEW
};
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;
  }
  inline PointXYZI (float _intensity = 0.f): PointXYZI(0.f, 0.f, 0.f, _intensity) {}
  inline PointXYZI (float _x, float _y, float _z, float _intensity = 0.f)
  {
    x = _x; y = _y; z = _z;
    data[3] = 1.0f;
    intensity = _intensity;
  }
  friend std::ostream& operator << (std::ostream& os, const PointXYZI& p);
};

PointXYZI相比于PointXYZ多出了一个union:

  union
  {
    struct
    {
      float intensity;
    };
    float data_c[4];
  };

该union表示point的强度 intensity 。整个PointXYZI的储存结构为:
在这里插入图片描述

发布了8 篇原创文章 · 获赞 0 · 访问量 261

猜你喜欢

转载自blog.csdn.net/qq_42700518/article/details/104820161
pcl
今日推荐