Skip to content

Latest commit

 

History

History
336 lines (168 loc) · 11.3 KB

点云数据(Point Cloub Data)学习笔记.md

File metadata and controls

336 lines (168 loc) · 11.3 KB

点云数据(Point Cloub Data)学习笔记

什么是 点云(Point Cloub Data) ?

点云是指目标表面特性的海量点集合。

通过测量仪器得到的物体外观表面的点数据集合就称之为点云。

请注意:上面虽然使用的是 “物体表面”,但其实暗含的意思为 “物体空间表面”。


PCD 格式标准是为了更好支持 PCL 库而诞生的。

PCL库是什么?

PCL(Point Cloud Library) 是一个大型跨平台开源的 C++ 编程库。该库实现了大量点云相关的通用算法和高效数据结构。涉及到点云获取、过滤、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。

关于 PCL 更多相关知识,可查看 PCL 官网 :https://pointclouds.org/


结合点云数据的一些特征,又产生了以下一些名词概念。


稀疏点云

使用三维坐标测量机所得到的点数比较少,点与点的间距比较大,这类被称为 稀疏点云。

例如 AI 自动驾驶过程中,周边空间极大,所采集得到的点云数据,就是稀疏点云。


密集点云

使用三维激光扫描仪或相机式扫描仪得到的点云,点数量较大且比较密集,这类被称为 密集点云。

例如扫描出某个较小物体的 3D 全貌,多数都是 密集点云


无序点云

这里说的 “无序” 暗含 2 层意思:

  1. 点与点之间是不必是连续的。
  2. 某个点在 数据(Data) 中出现的先后顺序是无序、无所谓的。

绝大多数时候,我们使用的 .pcd 都是无序点云


有序点云

所谓有序点云,意味着点云有类似图像或矩阵那样的结构,即数据分为行和列。

这种有序点云数据通常由立体摄像机和时间飞行摄像机采集而成的。

由于存在类似矩阵的结构,所以某个点在 数据(Data)中出现的先后顺序是有序的。

有序点云的优势在于所有的点都有相邻的点,预先了解相邻点的信息,可以让邻域操作更加高效,加速计算并降低 PCL 中某些算法的成本。




点云中每个点存储的数据内容是什么?

空间坐标(x,y,z) + [激光反射强度Intensity] + [颜色信息RGB]

空间坐标(x,y,z) 是必须项

激光反射强度(Intensity) 和 颜色信息(RGB) 是选填项


每个点必须包含空间坐标(x,y,z) 这个无需多言,选填项是由测量工具决定的。

测量工具决定了除空间外的其他存储信息


以智能汽车为例,来说明测量工具的差异

该知识点来源于抖音上 李永乐老师 的 “智能汽车如何眼观六路耳听八方” 相关视频。

智能汽车若想实现自动驾驶,那核心有一个环节,就是需要在行驶过程中不断测量周围物体与自己的距离。

目前市面上的智能汽车都配备以下 3 种测量工具:

  1. 激光雷达
  2. 毫米波雷达
  3. 摄像头

这 3 种测量工具的差异之处为:

激光雷达 毫米波雷达 摄像头
是否定位精准?
是否夜晚可用?
是否可以3D建模?
是否可以在雨雪天气下使用?
是否可以识别颜色?

激光雷达工作原理是:自己发射出一道激光,遇到障碍物反射回来,通过计算发射和接收返回激光的时间来判定距离。 由于是自己发出的激光,并不需要外界光,所以即使在夜晚激光雷达也可以正常工作。

毫米波雷达发射的光,波长比较长,利于传播,不易被雨雪影响,所以在雨雪天气中也可以正常工作。

摄像头主要作用是用来判断颜色。在比较近的距离,例如二目摄像头是可以做定位的,只不过精准度不高,可以被忽略。


从上面表格可以看出,3 种测量工具各有优缺点,只有同时将 3 种测量工具得到的数据综合一下,才可以得到完整的周边空间信息。


回到我们刚才提到的问题:点云中每个点存储的数据内容是什么?

  1. 若使用激光原理得到的点云,每个点除空间坐标(x,y,z)外,还包含激光反射强度(Intensity)

  2. 若使用摄像头原理得到的点云,每个点除空间坐标(x,y,x)外,还包含颜色信息(RGB)

    对于很多 3D 扫描仪来说,能够在近距离对物体扫描得出 3D 模型,包括物体颜色。实际上是摄像头加其他测量工具综合得到的数据结果。

  3. 若使用激光原理 + 摄像头原理得到的点云,每个点除空间(x,y,z)外,还可以同时包含激光反射强度(Intensity) 和 颜色信息(RGB)。




点云数据的数据格式是什么?

目前最主流的点云数据(Point Cloud Data)格式为 .pcd,遵循点云库(Point Cloud Library)标准。

2020年正式版本为 PCD 0.7,相对于 0.6 版,在头部新增了 VIEWPOINT 字段,用来指定传感器对于数据集方向的信息。


文件格式后缀

PCD 标准规范文件对应的文件后缀为 .pcd。

目前 .pcd 是对 PCL 库支持度最好的文件标准格式。

除了 .pcd 以外,不同 3D 扫描厂商还有自家定义的后缀格式,例如 .ply、.ifs、.vtk、.stl、.obj、.x3d 等。

但无论哪种后缀格式,点云数据内容规范相似,区别在于对 PCL 库的支持度不同。

文件后缀仅仅是一种表达文件格式规范的外在形式,只要文件实际内容遵循 点云 PCD 标准,哪怕文件后缀使用 .xyz 也是可以的。


文件结构

文件后缀是什么不重要,但文件结构一定要遵循 PCD 标准规范。

一个 .pcd 文件内容包含 2 部分:头部信息(Header)、数据(Data)

  1. 头部信息(Header)内容有若干字段组成,必须是 ASCII 编码。

    ASCII 编码就是普通文本编码,是我们人类可以直接阅读的文字内容

  2. 数据(Data),即点云存储的每个点的信息总集合,可以是 ASCII 编码,也可以是二进制编码,也可以是压缩二进制编码。


在很多文章中,会把 数据(Data) 称为 “点云数据集”

在本文用词中,我有时使用 数据(Data),有时使用 点云数据集,请你理解 他们 2 者所指的对象是相同的。


假设现在有一个 .pcd 文件,你可以选择使用记事本方式打开它,可以看到 头部信息(Header),至于数据(Data)部分有可能就出现无法直接阅读的乱码。


头部信息(Header)规范

假设我们用记事本打开一个 .pcd 文件,可以看到头部信息(Header) 如下:

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z
SIZE 4 4 4
TYPE F F F
COUNT 1 1 1
WIDTH 59750
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 59750
DATA binary
.......
.......

下面针对 头部信息(Header) 字段进行解释说明。

字段 含义 补充说明
# 注释 简单表明文件遵循的标准和版本
VERSION PCD版本 目前最新标准版本为 0.7
FIELDS 每个点所包含的N个维度信息 x y z [intensity] [rgb]
xyz 为点的空间坐标
intensity 为激光反射强度
rbg 为颜色信息
timestamp为时间戳
SIZE 用字节数指定每个维度的大小 unsigned char:占1个字节
unsigned short:占2个字节
unsigned int/float:占4个字节
double:占8个字节
TYPE 用字符指定每个维度的类型 I:int8(char)、int16(short)、int32(int)
U:uint8(unsigned char)、uint16(unsigned short)、uint32(unsigned int)
F:float
COUNT 每个维度包含的元素数量 默认为1,但是也有例外,例如 VFH 特征就是 308 个
WIDTH 用点的数量表示点云数据集的宽度 对于无序点云数据集,WIDTH 表示点的总个数
对于有序点云数据集,WIDTH 表示矩阵每行有多少个点
HEIGHT 用点的数量表示点云数据集的高度 对于无序点云数据集,HEIGHT 的值为 1
对于有序点云数据集,HEIGHT 表示矩阵每列有多少个点
实际中就是根据 HEIGHT 的值是否为 1 来判定当前点云是有序点云还是无序点云。
VIEWPOINT 指定数据集中点云的获取视点 视点信息由 7 个数字组成
前 3 个数字对应:平移(tx,ty,tz)
后 4 个数字对应:四元素(qw,qx,qy,qz)
默认值为:0 0 0 1 0 0 0
POINTS 指定点云中点的总数 从 PCD 0.7 版开始,该值就显得多余了,
因此可能会在未来版本中将其移除。
DATA 指定存储点云数据集的类型 有 3 种类型:
ascii:普通文本类型
binary:二进制类型
binary_compressed:压缩的二进制类型

某个点的信息的补充说明:

假设某个点是一个无效点,我们可以将该点的值设置为 nan

注意:要使用小写的 “nan”,不可以使用大写 “NAN”


点云数据集存储类型的补充说明:

  1. ascli:一个点占一行,点信息的不同维度使用空格或tab键分隔
  2. binary:标准的二进制存储方式



基于 Web 读取点云数据

  1. 需要加载、读取、解析 .pcd 文件
  2. 需要将得到的点云数据基于 WebGL 渲染到 画布(canvas) 中

目前满足以上 2 点要求的,首先想到的是 Three.js 了。


为什么首选 Three.js ?

因为 Three.js 满足以下几点:

  1. 基于 WebGL
  2. 包含 点(Point) 这个几何体
  3. 包含 .pcd 文件加载解析器 PCDLoader

要想了解更多,可查阅 Three.js 官方文档中 PCDLoader 的介绍页

https://threejs.org/docs/index.html#examples/zh/loaders/PCDLoader


悄悄告诉你,PCDLoader 介绍页简体中文版我由翻译并提交 PR 的,已经被官方合并在 r129 版本中。

若此刻你访问上述页面出现的依然是英文,那是因为当前还是 r128 版本,等到 r129 发布后就可以看到了。




关于点云信息标注

可以查看我的另外一篇学习笔记:数据标注学习笔记.md


国外点云信息标注的一个平台:

https://www.supervise.ly/lidar-3d-cloud