译者按:本文源自PCL官网对文件格式PCD的官方介绍,系博主优快云博客处女作,由于译者水平有限,错误之处请不吝指教。转载请注明出处。附原文链接:http://pointclouds.org/documentation/tutorials/pcd_file_format.php
The PCD (Point Cloud Data) file format
这份文档描述了PCD(点云数据)文件格式,以及它应用于PCL的具体方式。

为什么要提出一种新的文件格式?
PCD文件格式的提出并不是无意义的重复性劳动,而是为了完善已经存在的文件格式,解决既有文件格式因为这个或那个原因而不能支持PCL在处理n-D点云时带来的一些扩展问题。
PCD并不是第一种支持3D点云数据的文件类型。特别是在计算机图形学和计算几何圈子里,已经设计出很多种类型的文件格式,用以描述从激光扫描器获得的任意多边形和点云数据。其中的一些文件格式描述如下:
- PLY -一个多边形文件格式,由Stanford的Turk等人设计开发
- STL - 一个最初用于立体光刻CAD软件的文件格式,由3D Systems开发
- OBJ - 最初由Wavefront Technologies开发的一种几何定义文件格式
- X3D - 基于XML用于表征3D计算机图形数据的文件格式,符合ISO标准
- and many others 其他更多的
正如下一部分要说明的,以上所有的文件格式都存在几个共同的缺点——这些缺点的存在都很自然,因为这些文件格式的最初都是不同时期针对不同的目的而设计开发的,当时像今天一样的感知技术和算法还没有被发明(自注:当然也不会超前考虑这些问题)。
PCD版本
先于PCL1.0版本的发布,PCD文件格式有不同版本编号。这些版本编号是PCD_Vx (e.g., PCD_V5, PCD_V6, PCD_V7, etc),表示版本号为0.x的PCD文件格式。
正式用于PCL的官方PCD文件格式版本号是0.7(PCD_V7)。
头文件格式
每一个PCD文件都包含一个文件头,这个文件头定义和声明存储于此文件中的点云数据的特定特征。PCD的文件头必须用ASCII来进行编码。
Note
定义在一个PCD文件中的每一个文件头条目以及ascii点数据(如下所示)用新行来进行分割。
As
0.7版本中,PCD文件头包含了以下条目:
-
VERSION - 指定PCD文件版本号
-
FIELDS - 指定点拥有的每一维/通道数据的名称。例如:
-
SIZE - 指定点的每一维数据的字节(bytes)大小。例如:
- unsigned char/char has 1 byte
- unsigned short/short has 2 bytes
- unsigned int/int/float has 4 bytes
- double has 8 bytes
-
TYPE - 指定点每个维度的类型为char。当前接受的类型是:
- 指定点云数据集点数目的高度。HEIGHT具有两重含义:
- I - represents signed types int8 (char), int16 (short), and int32 (int)
- U - represents unsigned types uint8 (unsigned char), uint16 (unsigned short), uint32 (unsigned int)
- F - represents float types
-
COUNT - 指定每一维数据包含的元素数。例如,x数据一般拥有1个元素,但是一个像VFH一样的特征描述子拥有308个元素。本质上这是将n-D直方图描述子应用到每一个点的一种方式,可以将它们当成一个单个连续的存储块来对待。如果COUNT 不明确设定,所有维度的count都会默认设置为1。
-
WIDTH -指定点云数据集点数目的宽度。WIDTH具有两重含义:
- 指定不规则数据点云(等价于下文的POINTS)中点的总数;
- 它可以指定一个规则点云数据集的宽度(每一行点的总数(自注:其实就是“列”数目))。
Also see HEIGHT.
Note
一个规则点云数据集是指具有类似规则图像(或矩阵)结构的点云,这些规则图像的数据一般都按行和列分布。类似于这种规则数据的实例有用立体相机或者TOF(飞行时间)相机获取的数据。规则数据集的优点在于通过获取相邻点(例如,像素)之间的关系,最近邻操作(nearest neighbor operations)将会非常的高效,因此可以加速计算并减少PCL库中算法的复杂度。
Examples:
-
HEIGHT - 指定点云数据集点数目的高度。HEIGHT具有两重含义:
- 指定规则数据点云集的高度(总行数(自注:其实就是“行”总数));
- 将非规则数据集的HEIGHT设置为1(用于检验一个数据集是否是规则的)。
Example:
Example:
- 指定规则数据点云集的高度(总行数(自注:其实就是“行”总数));
-
VIEWPOINT - 指定数据集中点的获取视角。这个参数很可能被用于随后的坐标系直接的转换,或者用于确定一些需要连续方向的特征,例如面法向量。
视角信息由一个平移(tx ty tz)+四元组(qw qx qy qz)确定。默认值是:
-
POINTS - 指定点云中点的总数。0.7版本中,这个变量显得有些冗余(自注:因为有上面的WIDTH和HEIGHT的存在),所以我们计划在后续版本中移除这个变量。
Example:
-
DATA - 指定点云数据被存储的数据类型。0.7版本支持ascii和binary两种数据类型。更多细节请参照下一部分。
Note
紧随文件头最后一行(也就是DATA行)的后续字节将被认为是点云数据的一部分,将会出现如下警告。(自注:感觉翻译有点问题,个人理解是后续字节要记得和文件头换行,要不然会出现警告)
Warning
The header entries must be specified precisely in the above order, that is:
数据存储类型
0.7版本中.PCD文件格式使用了两种不同的模式来存储数据:
-
ASCII形式存储,每一个点换一个新行:
Note
从PCL1.0.1版本开始,NaN的字符串表示形式是“nan”。(自注:也就是说不区分大小写)
- 二进制形式存储,此处的数据是pcl::PointCloud.points array/vector的一个完整的内存副本。在Linux系统中,我们使用mmap/munmap操作来进行快速的可能性数据读/写操作。
无论将点云数据以一种简单的ascii形式进行存储——其中这种存储方式通过space或者tab键分割,每行存储一个点,没有其他任何附加字符——或者以一种二进制转储格式进行存储,在不同的潜在应用上面,都会使得我们有一个两全其美的结果:简练和速度。Ascii格式允许用户打开点云文件,并可以使用一些像qnuplot这样的标准软件工具来绘制它们,或者使用sed、awk等这样的工具来操作它们。
相较于其他文件格式的优势
使用PCD(或者其他)文件格式或许会被看做是PCL“非我发明症”(自注:非我发明症是一种文化,在该文化中的组织单位对不是由内部提出的事物或者不能在内部执行的事物持排斥和憎恶态度)的体现。事实并非如此,因为上面提到的任何一个文件格式类型都不具有PCD文件的高灵活性和快速度。
一些明显的优点如下:
- 存储和处理规则点云数据集的能力——这一点对实时性应用以及像增强现实、机器人等这样的领域具有极其重要的重要性。
- 二进制mmap/munmap 数据类型是装载和保存数据到硬盘最快的方式。
- 不同数据类型(所有基本数据类型都支持:char, short, int, float, double)的存储能力使得点云数据的存储和处理比较灵活和高效。无效点维度一般被存储为NAN类型。
- 特征描述子n-D直方图——对3D感知/计算机视觉应用非常重要。
另外一个优点是:通过控制文件格式,我们可以最好的方式将它应用到PCL,避免了应用不同的文件格式作为PCL的初始数据类型,并且免去了数据类型转换函数导致的额外延迟,从而在具体的PCL应用问题中获得最高的性能。
Note
尽管PCD是PCL中的基本文件格式,pcl io库中依然提供了将其他所有之前提到的文件格式进行存储和装载的可能性。
例子
下面是一小段PCD文件。这段数据具体表示了什么就留给读者。:) Have fun!: