文章目录
前言
这篇文章算是一种记录,也是这个系列的文章开头,后续会更新点云相关的文章
在ROS和PCL中的主要点云类型有下面这四种:
- sensor_msgs::PointCloud2
- sensor_msgs::PointCloud
- pcl::PointCloud
- pcl::PCLPointCloud2
下面进行每种类型的点云数据的具体介绍
1. sensor_msgs::PointCloud2
概述
sensor_msgs::PointCloud2
是 ROS 中用于表示点云数据的标准消息类型。它支持多种点字段,可以用于表示复杂的点云数据,包括 x
、y
、z
坐标以及其他自定义字段(如 intensity
、rgb
、normal_x
等)。
数据结构
-
字段定义: 使用
std::vector<sensor_msgs::PointField>
存储字段信息,每个字段描述点的数据类型、偏移量、名称等。 -
数据存储: 点数据以二进制形式存储在
std::vector<uint8_t> data
中,字段通过PointField
来定义数据格式。
灵活性
PointCloud2
提供了高度的灵活性,允许你根据需求自定义点云的结构。你可以添加任意数量和类型的字段,适应不同的应用场景。
应用场景
PointCloud2
适用于需要传输复杂点云数据的场景,如激光雷达、RGB-D 摄像头和雷达等传感器数据的传输和处理。
优缺点
-
优点:
-
灵活性高: 支持任意自定义字段。
-
兼容性好: 是 ROS 标准消息格式,广泛应用于机器人和传感器系统中。
-
-
缺点:
-
操作复杂: 由于数据以二进制形式存储,解析和处理字段数据相对复杂。
-
效率问题: 在某些情况下,数据转换和传输可能不如其他结构高效。
-
使用样例
sensor_msgs::PointCloud2 cloud_msg;
cloud_msg.height = 1;
cloud_msg.width = 100;
cloud_msg.fields = { /* 定义字段 */ };
cloud_msg.data = { /* 存储点数据 */ };
2. sensor_msgs::PointCloud
概述
sensor_msgs::PointCloud
是 ROS 中较早期使用的点云消息类型,相比 PointCloud2
更为简单。它主要用于表示基本的点云数据,包含点的坐标以及附加的通道信息。
数据结构
-
点信息:
points
是std::vector<geometry_msgs::Point32>
类型,存储点的x
、y
、z
坐标。 -
通道信息:
channels
是std::vector<sensor_msgs::ChannelFloat32>
类型,用于存储附加的通道数据(如intensity
、rgb
等)。
灵活性
sensor_msgs::PointCloud
结构简单,但灵活性较低,只能支持有限的字段类型(主要是坐标和一些附加通道)。
应用场景
PointCloud
常用于简单的点云处理任务,适合数据结构相对简单、字段少的点云数据。
优缺点
-
优点:
-
简单易用: 结构直观,容易操作。
-
处理效率高: 对于简单的点云数据,处理效率较高。
-
-
缺点:
-
灵活性低: 不能自定义额外的字段,适应范围有限。
-
已过时: 在需要处理复杂点云数据时,通常推荐使用
PointCloud2
。
-
使用样例
sensor_msgs::PointCloud cloud_msg;
cloud_msg.points.push_back(geometry_msgs::Point32{1.0, 2.0, 3.0});
cloud_msg.channels.push_back(sensor_msgs::ChannelFloat32{"intensity", {0.5}});
下面展示一些 内联代码片
。
3. pcl::PointCloud<T>
概述
pcl::PointCloud<T>
是 PCL(Point Cloud Library)中的模板化点云数据结构,其中 T
是点的类型(如 pcl::PointXYZ
、pcl::PointXYZRGB
、pcl::PointXYZI
等)。通过模板参数 T
,你可以定义点云数据的格式,包括哪些字段(如 x
、y
、z
、rgb
等)。
数据结构
-
点数组: 数据存储在
std::vector<T> points
中,T
类型决定了点云包含的字段和数据格式。 -
模板化设计: 通过模板参数,
pcl::PointCloud<T>
可以支持多种不同的数据格式,如仅有坐标的点云(pcl::PointXYZ
),或者包含颜色信息的点云(pcl::PointXYZRGB
)。
灵活性
pcl::PointCloud<T>
提供了很高的灵活性,你可以通过选择不同的点类型来定义点云数据结构。这使得它非常适合在不同应用中使用,例如在同一代码库中处理不同类型的点云。
应用场景
pcl::PointCloud<T>
适用于需要高效处理特定类型点云的场景,如点云滤波、配准、特征提取等算法。PCL 提供了丰富的算法库,可以与 pcl::PointCloud<T>
无缝集成。
优缺点
-
优点:
-
灵活性高: 支持模板化点类型,适应不同的点云数据结构。
-
与 PCL 集成良好: 直接与 PCL 提供的算法库兼容,处理效率高。
-
-
缺点:
-
固定性强: 一旦选择了特定的点类型,转换为其他类型的点云时需要额外处理。
-
模板复杂性: 对于复杂的点类型,模板使用可能增加代码的复杂性。
-
使用样例
pcl::PointCloud<pcl::PointXYZ> pcl_cloud;
pcl_cloud.points.push_back(pcl::PointXYZ{1.0, 2.0, 3.0});
pcl_cloud.width = 100;
pcl_cloud.height = 1;
pcl_cloud.is_dense = true;
4. pcl::PCLPointCloud2
概述
pcl::PCLPointCloud2
是 PCL 中的一种固定结构的点云数据类型,类似于 ROS 中的 sensor_msgs::PointCloud2
。它不使用模板参数,而是通过字段描述符(pcl::PCLPointField
)来定义点云的结构。
数据结构
-
字段定义: 使用
std::vector<pcl::PCLPointField>
来存储点云的字段信息,如x
、y
、z
、intensity
等。 -
数据存储: 数据以二进制形式存储在
std::vector<uint8_t> data
中,字段描述符定义了每个字段在数据中的位置和格式。
灵活性
pcl::PCLPointCloud2
具有高度灵活性,允许在运行时动态定义点云的字段。这使得它可以处理各种不同结构的点云数据,而不需要在编译时确定具体的点类型。
应用场景
pcl::PCLPointCloud2
通常用于需要与其他系统(如 ROS)的 PointCloud2
消息格式互操作的场景,或者在需要处理不确定点云结构的数据时使用。
优缺点
-
优点:
-
通用性强: 支持动态定义点云字段,适用于多种应用场景。
-
兼容性好: 容易与
sensor_msgs::PointCloud2
等非模板化结构互操作。
-
-
缺点:
-
操作复杂: 需要手动处理字段信息和数据,代码相对复杂。
-
效率问题: 在某些情况下,直接操作
pcl::PointCloud<T>
更为高效。
-
使用样例
pcl::PCLPointCloud2 pcl_cloud;
pcl_cloud.width = 100;
pcl_cloud.height = 1;
pcl_cloud.fields = { /* 定义字段 */ };
pcl_cloud.data = { /* 存储点数据 */ };
总结
这四种点云数据结构在不同场景下有不同的适用性:
-
sensor_msgs::PointCloud2
: 适用于 ROS 环境中需要灵活定义和传输复杂点云数据的场景。 -
sensor_msgs::PointCloud
: 适用于简单点云数据的传输和处理,结构简单但灵活性较低。 -
pcl::PointCloud<T>
: 适用于使用 PCL 进行高效点云处理的场景,提供模板化设计,灵活性高但固定性强。 -
pcl::PCLPointCloud2
: 适用于需要处理多种点云数据格式或与 ROS 的PointCloud2
互操作的场景,提供通用性但操作相对复杂。