所以这节内容很重要,但是难度又不大
,即使用户想要自定义数据类型,pcl中的数据类型也是大有帮助的。
先来介绍一下pcl::PointCloud数据类型,单看它的名字PointCloud
(点云),就知道它由很多点云组成。
我们定义一个点云类型可能类似于以下形式:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr (new pcl::PointCloud<pcl::PointXYZ>);//点云指针类型
pcl::PointCloud<pcl::PointXYZ> cloud;//点云对象
pcl::PointXYZ point;//单个点云
cloud.points[0].x;//访问第一个点的x
cloudPtr->points[0].x;//访问第一个点的x
point.x;//访问单个点的x
属性 | 说明 |
---|---|
cloud.size() | 点云的个数 |
cloud.height | 有序列点云:点云行数(类似于图像);无序点云:height=1 |
cloud.width | 点云个数标识width*height,如果height=1,则size()=width |
cloud.points | PointT的点,它是vector形式,方便点云访问 |
cloud.is_dense | 如果为false,则表示点云中包含inf/NaN这样的点,使用的时候注意滤除这些点 |
cloud.isOrganized () | 判断点云是否有序 (一般不使用height=1判断) |
sensor_origin_ | 传感器的采集位姿(origin/translation),Eigen::Vector4f类型,可选的,不常用 |
sensor_orientaion_ | 传感器的采集位姿(方向),Eigen::Quaternionf类型,可选的,不常用 |
想要了解pointcloud的更多操作,可以访问官网API:https://pointclouds.org/documentation/classpcl_1_1_point_cloud.html
或者访问github:https://github.com/PointCloudLibrary/pcl/blob/master/common/include/pcl/PCLPointCloud2.h
成员变量 | 成员类型 | 访问形式 |
---|---|---|
xyz | xyz均为float | points[i].data[0]或points[i].x |
xyz三个浮点数附加一个浮点数来满足存储对齐
,具体类型如下:
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x、y、z和intensity | 均为float | 请查看以下数据结构 |
由于point的大部分操作会把data[4]元素设置成0或1
,所以需要将intensity与xyz放在两个结构体中,具体如下:
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float intensity;
};
float data_c[4];
};
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x、y、z、r、g、b和a等 | xyz为float;rgba为std::int32_t | 请查看以下数据结构 |
因为使用了union,所以可以很方便地单独访问每个颜色通道
。具体数据类型如下:
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
union
{
struct
{
std::uint8_t b;
std::uint8_t g;
std::uint8_t r;
std::uint8_t a;
};
float rgb;
};
std::uint32_t rgba;
};
与PointXYZRGBA类似,只是少一个a
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x,y | 都是float类型 | 请查看以下数据结构 |
struct
{
float x;
float y;
};
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x, y, z, strength | 都是float类型 | 请查看以下数据结构 |
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float strength;
};
float data_c[4];
};
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x, y, z,normal,curvature | 都是float类型 | 请查看以下数据结构 |
这里包含了3个独立的union,其中normal为曲面的法向量,curvature为曲率
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
float data_n[4];
float normal[3];
struct
{
float normal_x;
float normal_y;
float normal_z;
};
};
union
{
struct
{
float curvature;
};
float data_c[4];
};
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x, y, z,normal,curvature,rgb | rgba为无符号整型,其它为float | 请查看以下数据结构 |
包含:点云的x, y, z和rgba,另外还包括曲面的法向量和曲率
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
float data_n[4];
float normal[3];
struct
{
float normal_x;
float normal_y;
float normal_z;
};
} union
{
struct
{
union
{
union
{
struct
{
std::uint8_t b;
std::uint8_t g;
std::uint8_t r;
std::uint8_t a;
};
float rgb;
};
std::uint32_t rgba;
};
float curvature;
};
float data_c[4];
};
成员变量 | 成员类型 | 访问形式 |
---|---|---|
x, y, z,normal,curvature,intensity | 都是float | 请查看以下数据结构 |
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
float data_n[4];
float normal[3];
struct
{
float normal_x;
float normal_y;
float normal_z;
};
} union
{
struct
{
float intensity;
float curvature;
};
float data_c[4];
};
类似于PointXYZI,只不过range是用来表示视点到采样点之间的距离测量值
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float range;
};
float data_c[4];
};
还有一些不常用的数据类型,只对它们进行列举如下,后续如有使用,再继续更新。
数据类型 | 解释 |
---|---|
PointWithViewpoint | 包含视点信息 |
MomentInvariants | |
PrincipalRadiiRSD | |
Boundary | |
PrincipalCurvatures | |
PFHSignature125 | |
FPFHSignature33 | |
VFHSignature308 | |
Narf36 | |
BorderDescription | |
IntensityGradient | |
Histogram | 存储一般用途的n维直方图 |
PointWithScale | x,y,z,scale,它假设点云是由尺度的,比如球状则表示半径 |
PointSurfel | 坐标、法线、GRB、半径、可信度和曲率的复杂信息类型 |
参考:https://pcl.readthedocs.io/projects/tutorials/en/latest/adding_custom_ptype.html#how-to-add-a-new-pointt-type