深度与三维:机器人怎么知道"多远"
前情提要:前面第 6 篇《图像如何变成数字:像素与卷积的直觉》里,我们把平面图像讲清楚了——一张照片本质上就是一个像素矩阵,颜色被拆成数字交给机器。可真实世界是立体的,机器人只凭那张平面图,并不知道桌上的杯子离它多远。今天我们就补上这一课:机器怎么把"二维照片"变回"三维距离"。
一、照片是平的,世界是深的
你拍一张照片,得到的是一张长方形的图:横着多少像素、竖着多少像素,每个格子里一个颜色。这已经是我们上次聊透的内容。但请你想一件事——照片里远处的山和近处的水杯,在图上只是上下左右的位置不同,你却永远无法从这张图里直接读出"水杯离我三十厘米、山离我五公里"。
这就是所谓的"深度丢失"。相机把三维世界投影到了二维平面,就像把一块立体的蛋糕拍扁成一张圆饼。拍扁的过程中,"离我多远"这个信息被压没了。可机器人要干活,光知道东西长什么样、在画面哪个位置远远不够。它得知道距离,才知道手要伸多长、力气要使多大、会不会撞上去。
所以问题来了:我们能不能从一张(或几张)平面图像里,把丢失的深度找回来?答案是能,而且机器人现在主要靠两类"眼睛"来干这件事——一类叫深度相机,另一类借用我们人类最熟悉的原理:两只眼睛看东西。
二、双目:用"两只眼睛的视差"量距离
你先做个小实验。把手指举到鼻子前,分别只用左眼、只用右眼看它,你会发现手指相对后面的背景左右挪了一点位置。两只眼睛看到的图像并不完全一致,这种不一致就叫"视差"。手指离你越近,左右眼看到的偏移越大;离得越远,偏移越小,远到一定程度两只眼睛几乎看到一样的东西。
机器人装两个相机,一左一右,间距跟人眼差不多,就是这个道理。左眼拍一张图,右眼拍一张图,机器把这两张图里的同一个点对应起来,量出它在左右图里横向差了多少像素,再结合两个相机之间的距离和镜头参数,就能用简单的几何关系算出这个距离。
原理其实很直观:两个相机像两个站在不同位置的人,看同一个物体时视线会交汇于一点,这一点离相机的远近,由两条视线的夹角决定。夹角大(物体近),夹角小(物体远)。所以"视差越大、距离越近"这句话,就是双目测距的核心直觉。
当然,机器也不是天生知道左右图里哪个点对应哪个点。它得在左眼里找一个特征(比如杯子边缘的一个角),再去右图里找最像它的那个位置,这个过程叫"立体匹配"。匹配对了,距离就准;匹配错了(比如墙上是重复的花纹,左右难分),深度就会算错。这也是为什么双目在纹理少、反差弱的场景里会"发懵"。
三、深度相机:主动"打光"测距
除了靠两只眼睛比,还有一种更直接的方式——深度相机。它不只是接收环境光,而是主动发出一束光(常见的是红外结构光或飞行时间光),让光打到物体上再弹回来,通过测量光往返花了多少时间,或者图案在物体表面怎么变形,直接得到每个点到相机的距离。
你可以把它想象成机器在黑暗里不断往四周扔小石头,听回声判断墙壁离自己多远。这样它输出的不再是一张普通彩色照片,而是一张"深度图":图上每个像素不是颜色,而是"这里离我多少厘米"。颜色图告诉我们"有什么",深度图告诉我们"有多远",两者叠在一起,机器才真正开始理解眼前的三维场景。
四、点云:把世界变成一堆带坐标的点
拿到深度图之后,机器通常会进一步把它转换成"点云"。什么意思呢?深度图里每个像素都知道自己离相机多远,结合相机的位置和朝向,就能算出这个点在真实空间里的三维坐标(x, y, z)。把一张图上所有像素都这样展开,就得到一大团悬浮在空中的点,每个点都有三维位置——这就是点云。
一张点云看起来像是一团由小点组成的、半透明的雕塑:桌子的轮廓、杯子的曲面、墙的平面,全是由成千上万个点拼出来的。它比深度图更"原始"也更灵活,因为现在每个点都在真实坐标系里了,机器可以旋转着看、可以量两点间距、可以识别出"这是一个能抓的把手"。很多抓取、避障、三维建模的算法,第一步就是把传感器数据变成点云。
五、SLAM:边走边画地图,同时知道自己在哪
到这里还有一个更妙的难题。机器人有了深度,能看清单个画面的三维结构,可如果它要在一个房间里走动呢?它每走一步,相机位置就变了,刚才建好的局部点云得接上新的。而且它还得回答一个看似鸡生蛋的问题:我想把新看到的东西拼进地图,得先知道我现在站在哪;可我要知道自己站在哪,又得先有地图做参照。
解决这个循环的办法叫 SLAM,意思是"同步定位与建图"。直觉上,机器人一边用传感器感知周围环境、一边在脑子里把看到的新结构拼到旧地图上,同时根据环境的特征(墙角、桌腿)反推自己移动了多少。它不需要一开始就有完整地图,而是在行走中不断修正:每看到一个熟悉的角落,就校准一次自己的位置;每走一段,就补全一段地图。慢慢地,地图越来越完整,定位也越来越准。这正是扫地机器人、自动驾驶小车能在陌生空间里不迷路、不撞墙的底子。
回过头看,从双目视差到深度图,从深度图到点云,再到 SLAM 把零散的三维片段连成一张可行走的地图——这一整条链,目的只有一个:让机器真正"知道物体离自己多远、自己又在哪"。而这恰恰是它能伸出手去抓杯子的前提。要是连杯子在三十厘米外都说不准,手伸出去要么够不着,要么一把拍飞。深度,是动作得以发生的第一块基石。
读后小测
3 句话复述
1. 照片把三维世界压成了二维,深度信息在成像时被丢掉了,但机器人干活必须知道物体离自己多远。 2. 双目相机靠左右眼的视差估距离,深度相机靠主动测光往返时间直接输出深度图,两者都能补回深度。 3. 深度图可转成带三维坐标的点云,再靠 SLAM 边走边拼地图并定位自己,这样机器才知道怎么伸手去抓东西。
1 件动手小事
拿出手机,分别闭上左眼、右眼轮流看桌上的一个杯子,体会它相对背景左右挪动了多少;再把杯子拿近一点、放远一点重复,感受"越近偏移越大"——这就是机器人双目测距用到的视差直觉。
下一篇《触觉:被忽视的第三感官》:你会看到,光靠看还不够稳,机器人怎么用"皮肤"去摸、去感知接触的力度和形状,才真正敢下手抓握。