struct EIGEN_ALIGN32 MyPointType // 强制 SSE 填充以获得正确的内存对齐
{
PCL_ADD_POINT4D; // 添加 XYZ+padding
PCL_ADD_RGB; // 添加 RGBA
uint8_t intensity; // 自定义变量
uint8_t return_number;
PCL_MAKE_ALIGNED_OPERATOR_NEW // 确保我们的新分配器对齐
};
POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType, // 注册点类型宏 (type, name, tag) (类型(不符合不会载入), 变量名, 文件中的变量名(不符合会报错))
(float, x, x)
(float, y, y)
(float, z, z)
(float, rgb, rgb)
(uint8_t, intensity, scalar_Intensity)
(uint8_t, return_number, scalar_ReturnNumber))
上述代码定义了一个 xyzrgbi(intensity)r(return_number)
的点云.
其中PCL_ADD_POINT4D
定义了xyz, 其具体实现可参考如下代码:
#define PCL_ADD_UNION_POINT4D \
union EIGEN_ALIGN16 { \
float data[4]; \
struct { \
float x; \
float y; \
float z; \
}; \
};
同理PCL_ADD_RGB
定义了rgba
, a
我们用不到, 可参考:
#define PCL_ADD_UNION_RGB \
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; \
};
POINT_CLOUD_REGISTER_POINT_STRUCT
用于注册点类型, 参数中的 (type, name, tag) 分别填入某个变量的类型, 名称和标签. 这里的名称是指结构体中对应的变量名, 标签是指文件中写入的变量名.
上述代码对应的pcd文件结构如下:
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z rgb scalar_Intensity scalar_ReturnNumber
SIZE 4 4 4 4 1 1
TYPE F F F U U U
COUNT 1 1 1 1 1 1
WIDTH 174097
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 174097
DATA ascii
-1.174494e+29 -1.8729781 7.6664328e-25 4010034017 191 189
-1.174494e+29 -7.6053216e+28 1.0537315e-38 29212655 42 239
-1.8729781 -7.7143658e+28 225.7412 4022190063 191 189
...
读取pcd文件:
pcl::PointCloud<MyPointType> cloud;
pcl::io::loadPCDFile("./test.pcd", cloud);
读入pcd文件时可能会遇到如下错误
xxx
为你代码中注册了但是文件中没有的 tag, 有可能是因为文件中颜色相关的tag为rgb
, 但是注册却写了
(uint8_t, r, r)
(uint8_t, g, g)
(uint8_t, b, b)
可能是由于变量类型不匹配导致的, 如文件中对应的 intensity
类型为 U
, 但是代码中却注册了(float, intensity, scalar_Intensity)