上一节,我们让机器人拥有了一双RGB眼睛。它能看见颜色,能分辨纹理,能认出眼前是一杯咖啡还是一本书。
但这里有一个致命的问题:它不知道这杯咖啡离自己有多远。
对于机器人来说,距离不是可有可无的信息,而是生存的底线。机械臂要去抓取水杯,如果不知道深度,它可能会一头撞上桌子。自动驾驶小车要避开行人,如果不知道对方距离几米,刹车指令就无从算起。RGB相机给了机器人一副平面画,而深度传感器,要在这幅画上标注出每一个像素的第三维坐标。
这一节,我们认识两种最主流的深度感知方案:深度相机和激光雷达。
在介绍硬件之前,我们先回答一个更基础的问题:人类是怎么感知深度的?
试试这个小实验。伸出一根手指放在眼前,先闭上左眼,用右眼看它;再闭上右眼,用左眼看它。你会发现手指似乎在背景前来回跳跃。这就是视差——同一个物体在左右眼中成像的位置存在微小偏移。物体离你越近,视差越大;离你越远,视差越小。我们的大脑时刻在计算这种双眼视差,从而重建出三维空间的深度感。
对于大多数人来说,这个过程毫不费力,甚至察觉不到。但对于计算机来说,它需要精确地找到左图像中的哪个像素对应右图像中的哪个像素——这叫做立体匹配。一张 $1920 \times 1080$ 的图像有超过200万个像素,逐一匹配的计算量可想而知。
幸运的是,机器人不必非要长两只眼睛才能看深度。工程师们发明了一种更直接的工具——深度相机。
目前最常见的深度相机方案叫结构光。它的工作流程像这样:相机上的红外投影仪向场景中投射出一片人眼不可见的斑点图案。这些斑点的排列是经过精密设计的,每个区域的光斑分布都是独一无二的指纹。然后,一个红外摄像头从略微不同的角度去拍摄这片投射出去的斑点。由于投影仪和摄像头之间存在固定的物理距离,打在物体表面上的斑点会发生形变和位移。算法通过分析斑点的畸变程度,反推出物体表面每一点的距离。
还有一种方案叫飞行时间。它的原理更加简单粗暴:向目标发射一束红外激光脉冲,然后用一个高速快门测量光脉冲往返的时间。光速是已知的常量 $c \approx 3 \times 10^8 \text{ m/s}$,那么距离就是:
$$ d = \frac{c \times t}{2} $$
其中 $t$ 是光脉冲从发射到返回的耗时,除以2是因为光走了个来回。因为光速极快,这个耗时通常在纳秒级别,对应到毫米级的距离分辨精度,对电子线路的要求极高。
不管用哪种方案,深度相机最终输出的都是一张深度图。它和RGB图像尺寸相同,但每个像素的值不再是颜色,而是一个距离数值,单位通常是毫米。
用数学语言说,深度图是一个二维矩阵 $D$:
$$ D \in \mathbb{R}^{H \times W} $$
其中 $D_{ij}$ 表示在像素坐标 $(i, j)$ 处,物体表面到相机光心的距离。纯白色通常代表近处,纯黑色代表远处,中间的各种灰度对应着从近到远的渐变。
有了深度图和RGB图像,我们就可以做一件很酷的事:把两者结合起来,生成点云。
对于图像中的每一个像素 $(u, v)$,我们知道它的颜色 $(R, G, B)$,也知道它的深度值 $d$。通过相机的内参矩阵,我们可以把这个像素反投影到三维空间中,得到一个三维坐标 $(x, y, z)$。这样,整张图像的每一个像素都变成了三维空间中的一个彩色点。数百万个这样的点聚合在一起,就构成了一幅点云——一个完整的三维场景模型。
$$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = d \cdot K^{-1} \cdot \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} $$
其中 $K$ 是相机内参矩阵,$d$ 是该像素对应的深度值。
在后面的章节里,你会直接操作点云数据,让机器人在三维空间中规划抓取路径。点云是你从二维图像迈向三维世界的关键跳板。
激光雷达的工作方式,和上面两种方案都不太一样。
想象你在一个黑暗的房间里,手里拿着一支激光笔和一个秒表。你按下开关,一束激光射出去,打到墙壁上又反射回来。你掐表计算往返时间,用光速公式算出墙壁离你有多远。然后你稍微转动手腕,再测一次。不断转动,不断测量——最终你把房间的每一个方向都扫了一遍,得到了一张完整的三维点云地图。
激光雷达就是这样工作的,只不过它转得比你快得多。一个典型的机械式激光雷达内部有几十束激光发射器,垂直排成阵列,整个顶部以每秒几十转的速度旋转。它每秒钟能发射数百万个激光脉冲,每个脉冲都带回一个距离值。最终输出的,是一圈又一圈的环境扫描线,稠密程度足以分辨出路灯、行人、路沿石的轮廓。
激光雷达的测距精度很高,通常达到厘米级,有效探测距离可以达到几百米,而且不受环境光照影响——半夜漆黑的路面上,它照样正常工作。因此,它几乎是当前所有自动驾驶车辆的标配传感器。
但它也有短板:激光雷达无法分辨颜色。它看到的世界是一团灰色的几何轮廓。所以实际应用中,激光雷达往往和RGB摄像头搭配使用,用相机来识别“这是什么”,用激光雷达来定位“它在哪里”。
你可能想问:到底该买深度相机还是激光雷达?
答案取决于你的任务和预算。深度相机价格从几百到几千元不等,适合室内场景,擅长近距离精细操作——机械臂抓取、室内导航是它的主场。激光雷达价格曾经高高在上,但近年来已经大幅下降,它更适合室外、大范围、高速运动的场景——自动驾驶、无人机测绘、室外机器人巡检。
对于你的学习之旅,从仿真环境里的虚拟深度相机开始是最佳选择。不需要花一分钱,你就能获取和真实传感器格式完全一致的深度图和点云数据。
这一节,你学会了三种让机器人“看穿”深度的方法:立体视觉模拟双眼、深度相机投射结构光或测量光脉冲飞行时间、激光雷达旋转扫描整个空间。无论哪种方案,它们都在回答同一个问题:那个东西,到底离我多远?
回答了这个问题,机器人的手才能伸向正确的方向,车轮才能停在安全的距离。下一节,我们将在RGB图像和深度图的基础上,让机器人更进一步——不仅看到一堆像素,还能认出“这是一个水杯”、“那是一个人”。