相关代码如下:
#include <pcl/io/pcd_io.h>
//-------------------------- 自定义点云类型 --------------------------
struct PointXYZRGBGpsTime
{
PCL_ADD_POINT4D; //添加XYZ,此时相当于 PointXYZ
PCL_ADD_RGB; //添加RGB,此时相当于 PointXYZRGB
double GpsTime; //添加新的字段
EIGEN_MAKE_ALIGNED_OPERATOR_NEW //确保new操作符对齐操作
}EIGEN_ALIGN16;//强制SSE内存对齐
//注册点类型宏(要包含所有添加的字段,否则无法正常使用未注册的字段)
POINT_CLOUD_REGISTER_POINT_STRUCT(PointXYZRGBGpsTime,
(float, x, x)
(float, y, y)
(float, z, z)
(uint8_t, b, b)
(uint8_t, g, g)
(uint8_t, r, r)
(float, rgb, rgb)
(double, GpsTime, GpsTime)
)
//========================== 自定义点云类型 ==========================
using namespace std;
typedef PointXYZRGBGpsTime PointT;
//测试函数
void test_XYZRGBGpsTime()
{
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
cloud->width = 1000;
cloud->height = 1;
cloud->is_dense = true;
cloud->points.resize(cloud->width*cloud->height);
for (size_t i = 0; i < cloud->points.size(); i++)
{
///XYZ
cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
///RGB
cloud->points[i].r = (uint8_t)(i * 255 / cloud->points.size());
cloud->points[i].g = (uint8_t)((cloud->points.size() - i) * 255 / cloud->points.size());
cloud->points[i].b = (uint8_t)(i * 255 / cloud->points.size());
///GpsTime
cloud->points[i].GpsTime = i * 1.0;
}
pcl::io::savePCDFileBinary("PointXYZRGBGpsTime.pcd", *cloud);
}
int main()
{
test_XYZRGBGpsTime();
return 0;
}