学习记录:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int
main ()
{
/*pcl::PointCloud<pcl::PointXYZ>: 这是定义一个名为cloud的变量,
该变量是pcl::PointCloud类型的模板实例,其中pcl::PointXYZ是点的类型。
pcl::PointXYZ表示一个包含X、Y、Z坐标的3D点。
cloud;: 这是一个声明语句,创建了一个名为cloud的变量。
点PointXYZ类型对应的数据结构
Structure PointXYZ{
float x;
float y;
float z;
};*/
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data
/*这行代码将cloud对象的width属性设置为5。将cloud对象的height属性设置为1。
cloud对象的is_dense属性设置为false*/
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
/*不是稠密型,is_dense(布尔值)指定点中的所有数据是否都是有限的(true),
或者某些点的XYZ值是否可能包含Inf/NaN值(false)。表示点云是否是稠密的。
如果is_dense为true,则点云中的所有数据都是有限的;
如果为false,则表示点云中可能包含Inf/NaN值。*/
cloud.resize (cloud.width * cloud.height);/*点云总数大小,调用resize方法来调整cloud的大小。
它通过将width和height的乘积作为参数传递给resize方法,将点云的大小调整为在x轴和y轴上的点的总数。*/
for (auto& point: cloud)//这是一个基于范围的for循环,它遍历cloud对象中的每个点,并将每个点的引用赋值给point变量。
{
point.x = 1024 * rand () / (RAND_MAX + 1.0f);
point.y = 1024 * rand () / (RAND_MAX + 1.0f);
point.z = 1024 * rand () / (RAND_MAX + 1.0f);
/*point.x = 1024 * rand () / (RAND_MAX + 1.0f);
这行代码将一个随机值赋给point的x坐标。rand()函数返回一个随机整数,
范围是0到RAND_MAX(通常是一个相当大的整数,表示随机数生成器能生成的最大值)。
这个值被乘以1024并除以RAND_MAX + 1.0f,
以确保结果在0到1024之间,这样生成的随机数可以用来设置点的x坐标。同理设置y,z的坐标值。*/
}
/*用于将点云数据保存为PCD文件。
pcl::io::savePCDFileASCII是PCL库中的一个函数,
用于将点云数据保存为ASCII格式的PCD文件。
("test_pcd.pcd", cloud)是该函数的参数,
其中"test_pcd.pcd"是保存文件的名字,cloud是要保存的点云对象。*/
pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
/*std::cerr: 这是C++标准库中的一个对象,通常用于输出错误消息。
它是一个输出流,类似于std::cout,但通常用于错误消息。
cloud.size (): 这调用cloud对象的size方法,
以获取点云中的数据点数量。这个数值将用于后面的输出。*/
std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;
/*for (const auto& point: cloud): 这是一个基于范围的for循环,
它遍历cloud对象中的每个点,并将每个点的引用赋值给point变量。
这里的const auto&表示使用常量引用类型,意味着不能修改point所引用的值。
整体意思是在打印出每个点的x、y、z坐标,并在每个坐标后面添加一个换行符,
以便每个点的坐标都单独占据一行。*/
for (const auto& point: cloud)
std::cerr << " " << point.x << " " << point.y << " " << point.z << std::endl;
return (0);
}
运行结果: