机器人的"五官" — 它们如何感知世界 / Robot Senses: How Machines Perceive the World
第 1 章 机器人的"五官"——它们如何感知世界
Robot Senses: How Machines Perceive the World
凌晨两点,一台扫地机器人在客厅里安静地转圈。它绕过椅脚、躲开拖鞋、躲到沙发底下去吸走猫毛。这一切看起来很自然,但你有没有想过:它是怎么"看见"那个黑色拖鞋的?它没有眼睛,没有大脑皮层,更没有"视觉"这个词的概念——可它偏偏就能识别障碍物。这是为什么?
答案就藏在这一章里:感知(perception)。感知是机器人与世界之间最基础也最神奇的一道桥梁。没有感知,世界模型(world model)就是空中楼阁;没有感知,机器人写的"日记"全是空白。本章我们要回答的核心问题是:机器人没有眼睛和耳朵,它们到底是怎么知道周围世界长什么样的?
1.1 一切感知的起点:人类与机器的"感官鸿沟"
The Sensory Gap Between Humans and Robots
人类有五种传统感官:视觉、听觉、触觉、嗅觉、味觉。但机器人不一样——它们没有"五官"的生物学结构,而是用一种叫传感器(sensor)的电子元件,把现实世界里的物理量(光、声、压力、距离、加速度……)转化成可以测量的电信号,再交给计算机去分析。
你可能会说:"那不就是把人眼换成了摄像头吗?"——听起来简单,做起来却完全不是一回事。人眼背后有一套几亿年演化出来的神经回路:视网膜(retina)把光变成电信号,初级视觉皮层(V1)识别边缘和方向,更高级的脑区识别物体和人脸。整个过程在你读到这一行字的几百毫秒内就已经完成,而且几乎不需要刻意思考。
而机器人面对的,是一长串冰冷的数学题:摄像头拍下来的是一堆数字(每个像素点的 RGB 值),麦克风录下来的是一串随时间变化的声压波形,雷达发出去的是一道看不见的电磁波。怎么从这些数字里"读出"猫、杯子、椅子、台阶、行人? 这就是本章要拆开的黑箱。
下面这张图展示了机器人感知流水线的完整流程,从最原始的物理信号一直到最终的语义理解:
```mermaid flowchart LR A[传感器层 Sensors] --> B[预处理 Preprocess] B --> C[特征提取 Features] C --> D[多模态融合 Fusion] D --> E[语义理解 Semantics] E --> F[世界快照 World Snapshot] ```
我们接下来就沿着这条流水线,一步一步地把每个模块拆给你看。先从最常见的传感器——摄像头——开始。
1.2 视觉传感器:把光变成数字的艺术
Vision Sensors: The Art of Turning Light into Numbers
1.2.1 摄像头是怎么"看见"的
一台最普通的 RGB 摄像头(RGB camera),内部最关键的元件叫做图像传感器(image sensor),通常是一片 CMOS(Complementary Metal-Oxide-Semiconductor,互补金属氧化物半导体)芯片。它的工作原理可以浓缩成一句话:把光子(photon)变成电子,再把电子变成数字。
具体来说:
1. 光线穿过镜头,进入传感器表面。 2. 每个像素(pixel)下面都有一个微小的光敏二极管,光子撞击上去会产生电子。 3. 这些电子被收集起来,量出多少,就代表这个点接收到了多少光。 4. 为了得到颜色,每个像素前面会盖上一片滤镜:红色、绿色或蓝色(RGB 三原色)。 5. 传感器扫完所有像素,输出一张由数字组成的图像。
一张 1920×1080 的图像大约有 200 万个像素。如果每个像素的颜色用 0~255 之间的整数表示(8 位色深),那么这一张图就是 1920×1080×3 ≈ 620 万个数字。如果你的手机摄像头一秒能拍 30 张这样的图,那一秒钟它就要处理 1.86 亿个数字——这就是为什么图像处理对算力的要求那么高。
这里有一个非常关键的概念你需要记住:在计算机眼里,一张图像就是一个三维数组(3D array),维度分别是高度 H、宽度 W、通道数 C。RGB 图像 C=3,灰度图 C=1。你用手机拍一张照片传到电脑上,存成 PNG 或 JPG,文件里的内容本质就是一个巨大的数字矩阵。
1.2.2 摄像头不是万能的
但普通 RGB 摄像头有几个"致命弱点",会让机器人工程师抓狂:
- **依赖光照**:在没有光的环境下它就是睁眼瞎。在黑暗里,普通摄像头什么都看不见。所以波士顿动力的 Spot 机器狗和自动驾驶汽车都在车身装了**红外摄像头**或者**热成像仪(thermal camera)**,它们感知的是物体发出的红外辐射(heat radiation),即使在夜里也能"看见"行人。
- **没有深度信息**:一张 RGB 图像告诉你"前面有一只猫",但它不会直接告诉你这只猫离你 1 米还是 5 米。要测距离,得用别的传感器(下一节讲)。
- **运动模糊(motion blur)**:机器人自己也在动,曝光时间长一点,图像就糊了。所以工业相机常常配**全局快门(global shutter)** 而不是卷帘快门(rolling shutter),保证整张图同一瞬间曝光。
- **镜头畸变(lens distortion)**:便宜的摄像头拍出来的直线其实是弯的,需要做"相机标定(camera calibration)"来校正。
1.2.3 深度摄像头:直接告诉你"距离"
为了解决"没有深度"这个问题,工程师发明了深度相机(depth camera)。它主要有两种流派:
- **结构光(Structured Light)**:代表产品有苹果 Face ID 用的 TrueDepth 相机、微软 Kinect 一代。原理是发射一道已知图案的红外光斑(通常是散斑 dot pattern),根据光斑在物体表面的变形,反算出每个像素的距离。
- **飞行时间(Time-of-Flight, ToF)**:发射一束红外光,测量它"飞出去再飞回来"的时间。光速约 30 万公里/秒,往返 1 米只需要 3.3 纳秒,所以电路要做得非常精确。ToF 的代表产品有 iPhone 后置的 LiDAR 扫描仪、Kinect 二代。
无论是结构光还是 ToF,它们最后都会输出和 RGB 图像尺寸相同的一张"深度图(depth map)"——每个像素的值不再是颜色,而是距离。
1.2.4 一帧图像到底长什么样
让我们用 Python 真真切切地"看一眼"一帧图像的数据结构。打开你的电脑(或者手机上的 Python 环境,比如 QPython、Pydroid 3),运行下面这段代码:
```python import numpy as np from PIL import Image
读取一张图片(你可以换成自己的照片路径)
img = Image.open("cat.jpg") arr = np.array(img)
print("形状 shape:", arr.shape) # 应该是 (H, W, 3) print("数据类型 dtype:", arr.dtype) print("最小值 min:", arr.min(), "最大值 max:", arr.max()) print("左上角 5x5 像素的 R 通道:") print(arr[:5, :5, 0]) ```
如果你看到类似这样的输出:
``` 形状 shape: (1080, 1920, 3) 数据类型 dtype: uint8 最小值 min: 0 最大值 max: 255 左上角 5x5 像素的 R 通道: [[ 23 25 27 ...] [ 22 24 26 ...] ... ] ```
恭喜,你已经"看到"了一个真实图像的数据形态。一个数字 23,就代表这个点红色光强度是 23/255 ≈ 9%。这就是图像的真相——它就是一堆数字。机器人工程师做的事情,就是从这一堆数字里提取出"猫在左下角""杯子在右边"这样的语义。
1.3 距离与深度:LiDAR、超声波与毫米波雷达
Distance and Depth: LiDAR, Ultrasonic, and mmWave Radar
摄像头擅长回答"那里有什么",却不太擅长回答"那里有多远"。要让机器人安全地移动,必须稳定地测距。这就要靠一系列"距离传感器"了。
1.3.1 LiDAR:激光测距之王
LiDAR(Light Detection and Ranging) 是自动驾驶汽车头顶上那个不停旋转的"小桶"。它的原理和 ToF 类似,但发射的是激光脉冲(通常是 905 nm 或 1550 nm 波长的近红外光),并能在一秒内发出数十万个脉冲。
当激光打到物体表面,会反射回来。LiDAR 通过测量光飞行的时间(time-of-flight)算出距离:
$$d = \frac{c \cdot \Delta t}{2}$$
其中 $c$ 是光速,$\Delta t$ 是往返时间,$d$ 是距离。激光雷达的水平角分辨率可以做到 0.1° 以内,垂直方向也能分出几十层。
LiDAR 输出的数据叫点云(point cloud)——一堆带 (x, y, z) 坐标的 3D 点。比如 Velodyne HDL-64E 一次扫描就能产生约 130 万个点。点云可以拼成一张非常精确的 3D 地图,让机器人"看见"世界的几何形状。
1.3.2 超声波传感器:便宜但粗糙
很多车载倒车雷达、扫地机器人都用了超声波传感器(ultrasonic sensor)。它发射人耳听不到的声波(频率通常 40 kHz),遇到障碍物反射回来,根据时间算出距离:
$$d = \frac{v_{sound} \cdot \Delta t}{2}$$
其中 $v_{sound}$ 约 340 m/s。超声波便宜(几块钱一个),但缺点也很明显:
- 测量距离短(一般 0.1~5 米);
- 波束角宽(beam angle 大),分辨率低,分不清"前方是墙还是柱子";
- 容易被柔软物体吸收(布料、海绵几乎不反射)。
所以超声波常常作为"补盲"传感器,和 LiDAR、摄像头一起用。
1.3.3 毫米波雷达:恶劣天气的王者
毫米波雷达(mmWave Radar) 是自动驾驶里的"老兵",早在 1990 年代奔驰 S 级就用它做自适应巡航(ACC)。它发射的是 77 GHz 左右的电磁波(波长约 4 mm),可以穿透雨、雾、烟尘,测速精度极高。
它的物理原理和 LiDAR 类似,但用的是多普勒效应(Doppler effect)来测速。毫米波雷达 + LiDAR + 摄像头 被称为自动驾驶感知的"铁三角",三者互补:摄像头识别物体种类,LiDAR 测距精度最高,毫米波雷达全天候稳定。
1.3.4 三种传感器的对比
| 传感器 | 测距范围 | 精度 | 全天候 | 成本 | 典型应用 | |---|---|---|---|---|---| | 摄像头 | 不直接测距 | — | 差 | 低 | 物体识别 | | LiDAR | 100~250 m | 厘米级 | 一般 | 高 | 自动驾驶 | | 超声波 | 0.1~5 m | 厘米级 | 好 | 极低 | 倒车雷达 | | 毫米波雷达 | 200 m+ | 分米级 | 优秀 | 中 | 自适应巡航 |
这意味着,现实中的机器人几乎不会只用一种传感器——传感器融合(sensor fusion) 是工程常态。我们后面会专门讲。
1.4 平衡与触觉:IMU、编码器、触觉皮肤
Balance and Touch: IMU, Encoders, Tactile Skin
视觉和距离感是"对外"的感知。但机器人要走路、转弯、抓住一个鸡蛋,还需要"对内"的感知——它得知道自己的身体状态。这一类传感器叫做本体感觉传感器(proprioceptive sensor)。
1.4.1 IMU:机器人的"小脑"
IMU(Inertial Measurement Unit,惯性测量单元) 是几乎所有移动机器人都离不开的核心元件。它通常包含两部分:
- **加速度计(accelerometer)**:测量三个轴向上的加速度 $a_x, a_y, a_z$。手机里那个"翻屏自动旋转"的功能就是它干的。
- **陀螺仪(gyroscope)**:测量三个轴上的角速度 $\omega_x, \omega_y, \omega_z$,告诉你机器人是不是在转弯。
更高级的 IMU 还会加上磁力计(magnetometer),相当于电子罗盘,给你一个绝对朝向。
把加速度和角速度做积分(integration),可以推算出机器人的位置和姿态(pose)。但这里有个坑——积分会累积误差(integration drift)。如果陀螺仪有 0.01°/s 的微小偏差,1 小时后就会偏掉 36°。所以 IMU 必须和别的传感器(比如 GPS、轮式里程计、视觉)联合使用,靠滤波算法(Kalman filter、ESKF)来校正。
1.4.2 编码器:轮子转了几圈
编码器(encoder) 是电机或轮子上的"计步器"。它通过光学或磁学原理,输出脉冲信号:一个脉冲代表轮子转过了一个固定角度(比如 0.1°)。把脉冲数乘以轮子周长,就知道机器人走了多远。
最常见的两种:
- **增量式编码器(incremental encoder)**:输出 A、B 两路相位差 90° 的脉冲,可以判断正反转。
- **绝对式编码器(absolute encoder)**:每个位置输出一个唯一的二进制码,断电后也不会丢。
1.4.3 触觉传感器:让机器人"摸"世界
如果你让机器人抓鸡蛋,靠视觉判断力反馈显然不够——鸡蛋会碎。所以机械手需要触觉传感器(tactile sensor)。它的设计五花八门:
- **压阻式(piezoresistive)**:受力后电阻变化。
- **电容式(capacitive)**:两个电极间距离变化,电容值跟着变。
- **光学式(optical)**:用一个内部摄像头看软胶表面的形变,比如 MIT 的 GelSight。
最近大火的电子皮肤(e-skin) 可以让机器人全身布满触觉点阵,密度高达每平方厘米几百个感知单元。东京大学的 Someya 组用有机半导体做的皮肤甚至能感受到蚂蚁的重量(~1 mg)。
1.4.4 力矩传感器:关节的"疼痛感"
协作机器人(cobot)能在碰到人时立刻停下来,靠的是关节内的力矩传感器(torque sensor)。它通过测量电机输出轴的微小形变(应变片 strain gauge),反推出外力大小。一旦检测到异常碰撞,控制器会在 1 毫秒内切断电机。
1.5 听觉与声学感知:让机器人"听见"世界
Hearing and Acoustic Sensing: Let Robots Listen
麦克风(microphone)是机器人最常用的听觉传感器。它的原理和摄像头有相似之处:声波让振膜振动,振膜带动线圈或电容变化,产生随时间变化的电压信号。
机器人麦克风阵列(microphone array)可以做很多有趣的事:
- **声源定位(sound source localization)**:用多个麦克风之间的时间差(time difference of arrival, TDOA)算出声音来自哪个方向。智能音箱回答"你说'嗨 Siri'时它从哪只耳朵听到"靠的就是这个。
- **语音识别(ASR)**:把声波转换成文字。OpenAI 的 Whisper、谷歌的 USM 都是当前最先进的多语言 ASR 模型。
- **声学场景理解**:识别"玻璃碎了""婴儿在哭""门铃响了"等事件。
- **回声定位(echolocation)**:模仿蝙蝠,用超声波脉冲感知障碍物。某些工业机器人用它来定位金属零件。
1.6 视觉的真相:从像素矩阵到语义理解
The Truth of Vision: From Pixel Matrices to Semantic Understanding
讲了这么多种传感器,下面我们深入地讲讲视觉——因为视觉是当前机器人感知里最丰富、也最复杂的一种。
1.6.1 经典方法的瓶颈
在 2012 年之前,工程师处理图像靠的是手工特征(hand-crafted features)。比如 SIFT、HOG、SURF,这些算法由人类专家根据经验设计,告诉计算机"去找边缘""去找角点""去找纹理"。然后用支持向量机(SVM)这些分类器去判断"这个边缘+角点+纹理的组合是不是一只猫"。
这条路走到尽头了——它能识别干净背景下的杯子,但只要杯子被部分遮挡、在暗光下、被遮挡一半,准确率就掉得惨不忍睹。手工特征的瓶颈在于,人类根本无法把所有视觉模式写进代码里。
1.6.2 CNN:让机器自己学"看"
2012 年,Alex Krizhevsky 用一个叫 AlexNet 的卷积神经网络(Convolutional Neural Network, CNN)把 ImageNet 图像识别的错误率从 26% 降到 16%,震惊了整个学界。从那以后,深度学习(deep learning)几乎统一了计算机视觉。
CNN 的核心思想可以这样理解:
1. 卷积层(convolutional layer):用一组可学习的"小滤镜(filter)"在图像上滑动,提取局部特征。底层学会检测边缘和颜色块,中层学会检测角点、纹理、零件,高层学会检测整张脸、整辆车、整只猫。 2. 池化层(pooling layer):把图像缩小,让网络只关心"有没有"而不是"在哪"。 3. 全连接层(fully connected layer):把高层特征组合起来,输出"是猫的概率 0.92,是狗的概率 0.07,是杯子 0.01"。
数学上,卷积操作可以写成:
$$Y_{i,j} = \sum_{m=0}^{k-1}\sum_{n=0}^{k-1} X_{i+m, j+n} \cdot W_{m,n} + b$$
其中 $X$ 是输入图像,$W$ 是卷积核权重,$b$ 是偏置,$Y$ 是输出特征图。
CNN 在训练时,会通过反向传播(backpropagation)不断调整 $W$ 和 $b$,让输出越来越接近真实标签。这个过程需要海量标注数据(Image