【PCL】(一)PCL基本数据结构PointCloud与原生文件格式PCD
PCL基本数据结构
PCL 1.x 的基本数据结构是PointCloud
。PointCloud
是一个C++类,它主要包含以下数据字段:
width (int)
指定点云数据集的宽度(以点数为单位)。宽度有两个含义:
-
它可以为无组织的点云指定其总点数;
-
它可以指定一个有组织的点云的宽度(一行的点数)。
有组织的点云类似于有组织的图像(或矩阵,其中的数据被分成行和列。对于这种点云,可以利用其相邻点之间的关系(类似于图像像素之间的关系)进行高效率的最近邻操作,从而加快了计算速度,降低了PCL中某些算法的成本。
例子:每行有640个点的点云
cloud.width = 640;
height (int)
指定点云数据集的高度(以点数为单位)。高度有两层含义:
- 它可以指定组织点云数据集的高度(总行数);
例子:有组织的480行640列的点云,总共640*480=307200个点
cloud.width = 640;
cloud.height = 480;
- 对于无组织的数据集,它被设置为1(因此
height
也可用于检查点云是否是有组织的)。
例子:307200 个点的无组织的点云
cloud.width = 307200;
cloud.height = 1;
points (std::vector)
包含存储PointT
类型的所有点的数据数组。例如,对于用XYZ值表示点的点云,points
为包含多个pcl::PointXYZ
元素的向量:
// 定义一个点云
pcl::PointCloud<pcl::PointXYZ> cloud;
// 将其points 赋予数组data
std::vector<pcl::PointXYZ> data = cloud.points;
PointT
类型是主要的点数据类型,它描述了点的每个单独元素所包含的内容。PCL提供了多种不同的点类型,还允许我们自定义PointT
类型:
https://pcl.readthedocs.io/projects/tutorials/en/master/adding_custom_ptype.html#adding-custom-ptype
is_dense (bool)
points
中的所有数据是否是有限的(true),或者某些点的XYZ值是否可能包含Inf/NaN值(false)。
sensor_origin_ (Eigen::Vector4f)
传感器采集姿态(原点/平移)。这个成员通常是可选的,PCL中的大多数算法都不使用它。
sensor_orientation_ (Eigen::Quaternionf)
说明传感器采集姿态(方向)。这个成员通常是可选的,PCL中的大多数算法y也都不使用它。
为了简化开发,PointCloud类包含许多助手成员函数。例如,用户不必在代码中检查height
是否等于1,以查看数据集是否是有组织的,而是使用isOrganized
:
if (!cloud.isOrganized ())
...
PCD文件
计算机图形学和计算几何社区已经创建了许多格式来描述任意多边形和点云(例如,PLY,STL,OBJ,X3D),但某些原因导致这些文件格式不支持PCL为n维点云处理带来的一些扩展。PCD文件格式是现有格式的补充,其优势包括:
-
存储和处理有组织的点云数据集的能力——这对实时应用和增强现实、机器人等研究领域至关重要;
-
二进制数据类型
mmap/munmap
是将数据加载和保存到磁盘的最快方法。 -
存储不同的数据类型(
char、short、int、float、double
)允许点云数据在存储和处理方面灵活高效。无效的点尺寸通常存储为NAN
类型。 -
特征描述符的n维直方图——对于3D感知/计算机视觉应用非常重要
-
通过控制文件格式,我们可以将其最佳地适应PCL,从而获得PCL应用的最高性能。
尽管PCD(点云数据)是PCL中的原生文件格式,但PCL_io
库也允许对其他文件格式的数据进行保存和加载。
PCD版本
在点云库(PCL)1.0版发布之前,PCD文件格式具有不同的版本(例如,PCD_V5、PCD_V6、PCD_V7等)。PCL中常用的PCD文件格式为0.7版本PCD_V7。
文件格式标头
每个PCD文件都包含一个标头(header),该标头标识并声明存储在文件中的点云数据的某些特性。PCD的标头必须以ASCII编码。
PCD文件中指定的每个标头条目以及ascii点数据(见下文)都使用新行(\n)分隔。
自版本0.7起,PCD标头包含以下条目:
VERSION
FIELDS
SIZE
TYPE
COUNT
WIDTH
HEIGHT
VIEWPOINT
POINTS
DATA
注意,标头的各个条目必须按照上述顺序精确指定。直接在标头的最后一行(DATA)之后的下一个字节被认为是点云数据的一部分,并且将被解释为点云数据。
VERSION-指定PCD文件版本
FIELDS -指定点可以具有的每个维度/字段的名称。例如:
FIELDS x y z # XYZ
FIELDS x y z rgb # XYZ + rgb颜色
FIELDS x y z normal_x normal_y normal_z # XYZ + 表面法向量
...
SIZE-以字节为单位指定每个维度的大小。例如:
unsigned char/char
有1个字节
unsigned short/short
有2个字节
unsigned int/int/float
有4个字节
double
有8个字节
TYPE-将每个维度的类型指定为一个字符。当前接受的类型包括:
I
-表示有符号类型int8(char)、int16(short)和int32(int)
U
-表示无符号类型uint8(无符号字符)、uint16(无符号短字符)和uint32(无符号整数)
F
-表示浮点类型
COUNT-指定每个维度有多少个元素。例如,点云数据通常各个维度具有1个元素,但是像视点特征直方图(VFH)这样的特征描述符具有308个。默认情况下,如果不存在COUNT,则所有维度的计数都设置为1。
WIDTH-以点数为单位指定点云数据集的宽度。对应PointCloud
类的width
。
Examples:每行有640个点的点云
WIDTH 640 # 每行640个点
HEIGHT-以点数为单位指定点云数据集的高度。对应PointCloud
类的height
。
示例:有组织的480行640列的点云,总共640*480=307200个点
WIDTH 640
HEIGHT 480
Example: 307200 个点的无组织的点云
WIDTH 307200
HEIGHT 1 # unorganized point cloud dataset with 307200 points
VIEWPOINT-指定点云的采集视点。视点信息被指定为平移(tx-ty-tz)+四元数(qw-qx-qy-qz)。默认值为:
VIEWPOINT 0 0 0 1 0 0 0
POINTS-指定云中的点总数。从0.7版本开始,它的用途有点多余,所以我们希望在未来的版本中删除它。例如:总点数为307200
POINTS 307200
DATA-指定存储点云数据的数据类型。从0.7版本起,支持三种数据类型:ascii、binary
和binary_compressed
。
数据存储类型
从版本0.7起,.PCD文件格式使用三种不同的模式来存储数据:
ASCII
格式,每一点都在不同行上:
p_1
p_2
p_3
p_4
...
p_n
从PCL1.0.1版本开始,NaN的字符串表示为“NaN”。
binary
格式,其中数据是pcl::PointCloud.points
数组/向量的完整内存副本。在Linux系统上,我们使用mmap/munmap
操作对数据进行最快的读/写访问。
binary_compressed
格式。正文(标头之后的所有内容)以一个32位无符号二进制数字开头,该数字指定压缩形式的数据的字节大小。接下来是另一个32比特无符号二进制数,该数字以未压缩形式的数据的字节大小为单位。然后是压缩的数据。压缩和解压缩是使用Marc Lehmann的LZF算法完成的。它在缩小尺寸方面表现平平,但速度非常快。对于典型的点云,压缩数据的大小为原始大小的30%到60%。在压缩之前,对数据进行重新排序以改进压缩,从标准的结构阵列布局到阵列结构布局。例如,具有三个点和字段x、y、z
的点云将从xyzxyzxyz
重新排序为xxxyyyzzz
。
我们能根据底层应用程序选择简单的ascii或快速存取的二进制格式。ascii格式允许用户打开点云文件,并使用gnuplot等标准软件工具绘制它们,或者使用sed、awk等工具操作它们。
PCD文件示例
# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 213
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 213
DATA ascii
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06
0.97192 0.278 0 4.2108e+06
0.944 0.29474 0 4.2108e+06
0.98111 0.24247 0 4.2108e+06
0.93655 0.26143 0 4.2108e+06
0.91631 0.27442 0 4.2108e+06
0.81921 0.29315 0 4.2108e+06
0.90701 0.24109 0 4.2108e+06
0.83239 0.23398 0 4.2108e+06
0.99185 0.2116 0 4.2108e+06
0.89264 0.21174 0 4.2108e+06
0.85082 0.21212 0 4.2108e+06
0.81044 0.32222 0 4.2108e+06
0.74459 0.32192 0 4.2108e+06
0.69927 0.32278 0 4.2108e+06
0.8102 0.29315 0 4.2108e+06
0.75504 0.29765 0 4.2108e+06
0.8102 0.24399 0 4.2108e+06
0.74995 0.24723 0 4.2108e+06
0.68049 0.29768 0 4.2108e+06
0.66509 0.29002 0 4.2108e+06
0.69441 0.2526 0 4.2108e+06
0.62807 0.22187 0 4.2108e+06
0.58706 0.32199 0 4.2108e+06
0.52125 0.31955 0 4.2108e+06
0.49351 0.32282 0 4.2108e+06
0.44313 0.32169 0 4.2108e+06
0.58678 0.2929 0 4.2108e+06
0.53436 0.29164 0 4.2108e+06
0.59308 0.24134 0 4.2108e+06
0.5357 0.2444 0 4.2108e+06
0.50043 0.31235 0 4.2108e+06
0.44107 0.29711 0 4.2108e+06
0.50727 0.22193 0 4.2108e+06
0.43957 0.23976 0 4.2108e+06
0.8105 0.21112 0 4.2108e+06
0.73555 0.2114 0 4.2108e+06
0.69907 0.21082 0 4.2108e+06
0.63327 0.21154 0 4.2108e+06
0.59165 0.21201 0 4.2108e+06
0.52477 0.21491 0 4.2108e+06
0.49375 0.21006 0 4.2108e+06
0.4384 0.19632 0 4.2108e+06
0.43425 0.16052 0 4.2108e+06
0.3787 0.32173 0 4.2108e+06
0.33444 0.3216 0 4.2108e+06
0.23815 0.32199 0 4.808e+06
0.3788 0.29315 0 4.2108e+06
0.33058 0.31073 0 4.2108e+06
0.3788 0.24399 0 4.2108e+06
0.30249 0.29189 0 4.2108e+06
0.23492 0.29446 0 4.808e+06
0.29465 0.24399 0 4.2108e+06
0.23514 0.24172 0 4.808e+06
0.18836 0.32277 0 4.808e+06
0.15992 0.32176 0 4.808e+06
0.08642 0.32181 0 4.808e+06
0.039994 0.32283 0 4.808e+06
0.20039 0.31211 0 4.808e+06
0.1417 0.29506 0 4.808e+06
0.20921 0.22332 0 4.808e+06
0.13884 0.24227 0 4.808e+06
0.085123 0.29441 0 4.808e+06
0.048446 0.31279 0 4.808e+06
0.086957 0.24399 0 4.808e+06
0.3788 0.21189 0 4.2108e+06
0.29465 0.19323 0 4.2108e+06
0.23755 0.19348 0 4.808e+06
0.29463 0.16054 0 4.2108e+06
0.23776 0.16054 0 4.808e+06
0.19016 0.21038 0 4.808e+06
0.15704 0.21245 0 4.808e+06
0.08678 0.21169 0 4.808e+06
0.012746 0.32168 0 4.808e+06
-0.075715 0.32095 0 4.808e+06
-0.10622 0.32304 0 4.808e+06
-0.16391 0.32118 0 4.808e+06
0.00088411 0.29487 0 4.808e+06
-0.057568 0.29457 0 4.808e+06
-0.0034333 0.24399 0 4.808e+06
-0.055185 0.24185 0 4.808e+06
-0.10983 0.31352 0 4.808e+06
-0.15082 0.29453 0 4.808e+06
-0.11534 0.22049 0 4.808e+06
-0.15155 0.24381 0 4.808e+06
-0.1912 0.32173 0 4.808e+06
-0.281 0.3185 0 4.808e+06
-0.30791 0.32307 0 4.808e+06
-0.33854 0.32148 0 4.808e+06
-0.21248 0.29805 0 4.808e+06
-0.26372 0.29905 0 4.808e+06
-0.22562 0.24399 0 4.808e+06
-0.25035 0.2371 0 4.808e+06
-0.29941 0.31191 0 4.808e+06
-0.35845 0.2954 0 4.808e+06
-0.29231 0.22236 0 4.808e+06
-0.36101 0.24172 0 4.808e+06
-0.0034393 0.21129 0 4.808e+06
-0.07306 0.21304 0 4.808e+06
-0.10579 0.2099 0 4.808e+06
-0.13642 0.21411 0 4.808e+06
-0.22562 0.19323 0 4.808e+06
-0.24439 0.19799 0 4.808e+06
-0.22591 0.16041 0 4.808e+06
-0.23466 0.16082 0 4.808e+06
-0.3077 0.20998 0 4.808e+06
-0.3413 0.21239 0 4.808e+06
-0.40551 0.32178 0 4.2108e+06
-0.50568 0.3218 0 4.2108e+06
-0.41732 0.30844 0 4.2108e+06
-0.44237 0.28859 0 4.2108e+06
-0.41591 0.22004 0 4.2108e+06
-0.44803 0.24236 0 4.2108e+06
-0.50623 0.29315 0 4.2108e+06
-0.50916 0.24296 0 4.2108e+06
-0.57019 0.22334 0 4.2108e+06
-0.59611 0.32199 0 4.2108e+06
-0.65104 0.32199 0 4.2108e+06
-0.72566 0.32129 0 4.2108e+06
-0.75538 0.32301 0 4.2108e+06
-0.59653 0.29315 0 4.2108e+06
-0.65063 0.29315 0 4.2108e+06
-0.59478 0.24245 0 4.2108e+06
-0.65063 0.24399 0 4.2108e+06
-0.70618 0.29525 0 4.2108e+06
-0.76203 0.31284 0 4.2108e+06
-0.70302 0.24183 0 4.2108e+06
-0.77062 0.22133 0 4.2108e+06
-0.41545 0.21099 0 4.2108e+06
-0.45004 0.19812 0 4.2108e+06
-0.4475 0.1673 0 4.2108e+06
-0.52031 0.21236 0 4.2108e+06
-0.55182 0.21045 0 4.2108e+06
-0.5965 0.21131 0 4.2108e+06
-0.65064 0.2113 0 4.2108e+06
-0.72216 0.21286 0 4.2108e+06
-0.7556 0.20987 0 4.2108e+06
-0.78343 0.31973 0 4.2108e+06
-0.87572 0.32111 0 4.2108e+06
-0.90519 0.32263 0 4.2108e+06
-0.95526 0.34127 0 4.2108e+06
-0.79774 0.29271 0 4.2108e+06
-0.85618 0.29497 0 4.2108e+06
-0.79975 0.24326 0 4.2108e+06
-0.8521 0.24246 0 4.2108e+06
-0.91157 0.31224 0 4.2108e+06
-0.95031 0.29572 0 4.2108e+06
-0.92223 0.2213 0 4.2108e+06
-0.94979 0.24354 0 4.2108e+06
-0.78641 0.21505 0 4.2108e+06
-0.87094 0.21237 0 4.2108e+06
-0.90637 0.20934 0 4.2108e+06
-0.93777 0.21481 0 4.2108e+06
0.22244 -0.0296 0 4.808e+06
0.2704 -0.078167 0 4.808e+06
0.24416 -0.056883 0 4.808e+06
0.27311 -0.10653 0 4.808e+06
0.26172 -0.10653 0 4.808e+06
0.2704 -0.1349 0 4.808e+06
0.24428 -0.15599 0 4.808e+06
0.19017 -0.025297 0 4.808e+06
0.14248 -0.02428 0 4.808e+06
0.19815 -0.037432 0 4.808e+06
0.14248 -0.03515 0 4.808e+06
0.093313 -0.02428 0 4.808e+06
0.044144 -0.02428 0 4.808e+06
0.093313 -0.03515 0 4.808e+06
0.044144 -0.03515 0 4.808e+06
0.21156 -0.17357 0 4.808e+06
0.029114 -0.12594 0 4.2108e+06
0.036583 -0.15619 0 4.2108e+06
0.22446 -0.20514 0 4.808e+06
0.2208 -0.2369 0 4.808e+06
0.2129 -0.208 0 4.808e+06
0.19316 -0.25672 0 4.808e+06
0.14497 -0.27484 0 4.808e+06
0.030167 -0.18748 0 4.2108e+06
0.1021 -0.27453 0 4.808e+06
0.1689 -0.2831 0 4.808e+06
0.13875 -0.28647 0 4.808e+06
0.086993 -0.29568 0 4.808e+06
0.044924 -0.3154 0 4.808e+06
-0.0066125 -0.02428 0 4.808e+06
-0.057362 -0.02428 0 4.808e+06
-0.0066125 -0.03515 0 4.808e+06
-0.057362 -0.03515 0 4.808e+06
-0.10653 -0.02428 0 4.808e+06
-0.15266 -0.025282 0 4.808e+06
-0.10653 -0.03515 0 4.808e+06
-0.16036 -0.037257 0 4.808e+06
0.0083286 -0.1259 0 4.2108e+06
0.0007442 -0.15603 0 4.2108e+06
-0.1741 -0.17381 0 4.808e+06
-0.18502 -0.02954 0 4.808e+06
-0.20707 -0.056403 0 4.808e+06
-0.23348 -0.07764 0 4.808e+06
-0.2244 -0.10653 0 4.808e+06
-0.23604 -0.10652 0 4.808e+06
-0.20734 -0.15641 0 4.808e+06
-0.23348 -0.13542 0 4.808e+06
0.0061083 -0.18729 0 4.2108e+06
-0.066235 -0.27472 0 4.808e+06
-0.17577 -0.20789 0 4.808e+06
-0.10861 -0.27494 0 4.808e+06
-0.15584 -0.25716 0 4.808e+06
-0.0075775 -0.31546 0 4.808e+06
-0.050817 -0.29595 0 4.808e+06
-0.10306 -0.28653 0 4.808e+06
-0.1319 -0.2831 0 4.808e+06
-0.18716 -0.20571 0 4.808e+06
-0.18369 -0.23729 0 4.808e+06
参考:
https://pcl.readthedocs.io/projects/tutorials/en/master/basic_structures.html#basic-structures
https://pcl.readthedocs.io/projects/tutorials/en/master/pcd_file_format.html#pcd-file-format