一、PCL基础
1.1 Retrun 语句
return语句需要在圆括号中设定返回值,即规定return语句必须有返回值。return如果没有返回值也会编译,例如:
int main()
{
return (0);
}
二、 编写新的PCL类
2.1 建立文件结构
有两种不同的方法建立文件结构:
1.分别编写代码,最为独立的PCL类在PCL代码数之外;
2.直接把文件建立在PCL代码目录树中;
三、PCL点类型
点云是复杂的n维结构,他需要能表示不同类型的信息,而用户因该知道并理解需要传送什么样的信息。例如:下面是对XYZ数据的简单操作,
struct PointXYZ
{
float x;
float y;
float z;
float padding; //填补位数,以满足存储对齐要求。
}
然而,例如用户在嵌入是平台上寻找编译PCL的时候,增加额外的填补就是浪费存储空间,因此,可以用一个简单的不带最后浮点数的PointXYZ结构来替代。
3.1 PCL中可用的PointT类型
为了涵盖所有可能的情况,PCL定义了大量的point类型。在point_types.hpp中有完整的目录。
1. PointXYZ——成员变量:float x,y,z;
PointXYZ是最常见的一个点数据类型,因为它只包含三维XYZ坐标信息,这三个浮点数附加一个浮点数来满足存储对其,用户可以利用points[i].data[0]或者points[i].x访问点x的坐标值。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
2. PointXYZI——成员变量:float x,y,z,intensity;
**PointXYZI是一个简单的XYZ坐标加上intensity的point类型。**理想情况下,这4个变量将新建单独一个结构体,并且满足存储对齐,然而,由于point的大部分操作会把data[4]元素设置为0或1(用以转换),**不能让intensity和XYZ在同一个结构体中,如果这样的话,其内容将会被覆盖。**例如,两个点的点击会把他们第四个元素设置成0,否则点积没有意义,等等。因此,对于兼容存储对齐用三个额外的浮点数来填补intensity,这样在存储方面效率较低,但是符合存储对其要求,运行效率较高。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float intensity;
};
float data_c[4];
};
3. PointXYZRGBA——成员变量:float x,y,z; uint32_t rgba;
除了RGBA信息被包含在一个整型变量中,其他和PointXYZI类似。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
uint32_t rgba;
};
float data_c[4];
};
4. PointXYZRGB——成员变量:float x,y,z,rgb;
除了RGB信息被包含在一个浮点型变量中,其他和PointXYZRGBA类似。RGB数据被压缩到一个浮点数里的原因在于早期PCL是作为ROS项目的一部分来开发的,那里,RGB数据是用浮点数来传送的。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float rgb;
};
float data_c[4];
};
5. PointXY——成员变量:float x,y;
简单的二维x–y point结构代码:
struct
{
float x;
float y;
}
6. InterestPoint——float x,y,z,strength;
除了strength表示关键点的强度的测量值,其他的和PointXYZI类似。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float strength;
};
float data_c[4];
};
7.Normal——float normal[3], curvature;
另一个常用的数据类型,Normal结构体表示给定点所在样本曲面上的法线方向,以及对应曲率的测量值。由于在PCL中对曲面法线的操作很普遍,还是用第4个元素来占位,这样就兼容SSE和高效计算。例如,用户访问法向量的第一个坐标,可以通过points[i].data_n[0]或者points[i].normal[0]或者points[i].normal_x,在此处再一次强调,曲率不能被存储在同一个结构体中,因为他会被普通的数据操作覆盖掉。
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];
};
8.PointNormal——float x,y,z; float normal[3], curvature;
PointNormal是存储XYZ数据的Point结构体,并且包括采样点对应法线和曲率。
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];
};
9.PointXYZRGBNormal——float x,y,z,rgb,normal[3], curvature;
PointXYZRGBNormal存储XYZ数据和RGB颜色的point结构体,并且包括曲面法线和曲率。
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 rgb;
float curvature;
};
float data_c[4];
};