Part 2: Hardware · The robot's body
Chapter 4
传感器 - 机器人的眼睛、耳朵和皮肤
你闭上眼睛走进一个陌生房间。什么感觉?你不知道前面有没有桌子,不知道地上有没有台阶,不知道门在哪。你会伸出手摸,慢慢挪步,竖起耳朵听。
一台没有传感器的机器人就是这个状态 - 它有腿有手臂有电机,但它是“瞎的”。算法再强也没用,因为没有输入数据。感知层的一切 - SLAM、物体检测、位姿估计 - 全部建立在传感器的原始数据之上。传感器的质量和特性直接决定了你的算法上限。
对软件开发者来说,传感器是最需要建立“物理直觉”的地方。你之前处理的数据来自数据库、API、用户输入 - 它们可能格式不对,但不会“因为太阳太大而失效”。传感器数据会。
相机(RGB) - 最便宜的“眼睛”
RGB 相机是最容易理解的传感器 - 它输出的就是图片,跟你手机拍的照片本质一样。便宜(几百块就能买到工业级的),数据量适中,已有海量的 CV 模型可以直接用。
机器人上常见三种:
单目相机:一个镜头,输出 2D 图像。最大的问题是没有深度信息 - 你看到一个杯子,但不知道它离你 30 厘米还是 3 米。在 Web CV 场景里这不是问题(你只需要知道图片里有什么),在机器人上这是致命问题(手臂要伸多长去抓它?)。
双目相机:两个镜头,模拟人眼的立体视觉。通过两个镜头的视差(同一个物体在左右图像中位置的差异)来计算深度。原理跟你闭一只眼再睁开、物体会“跳”一下是一样的。ZED 2 是机器人上最常用的双目相机之一。
鱼眼相机:超广角,一个镜头能覆盖 180 度甚至更多。代价是图像边缘畸变严重 - 直线会变成弧线。适合需要大视野但对精度要求不高的场景,比如全景环境感知。
深度相机 - 能”看到”距离的眼睛
深度相机的输出不只是一张 RGB 图,还有一张 depth map - 每个像素对应一个距离值。这意味着你能直接拿到物体的 3D 坐标,不需要自己算。
假设你在做一台室内分拣机器人,手臂需要从货架上抓取不同尺寸的物品。你需要一个深度相机来告诉手臂”目标物体在空间中的精确位置”。你会面对三种技术路线,选哪个取决于你的工作环境。
结构光(Structured Light):朝场景发射一个已知的红外光图案(通常是散斑点阵),然后看图案在物体表面的变形来计算深度。Intel RealSense D435 就是这个原理。在 1 米以内的近距离操作上,结构光的精度是三者中最高的 - 这对抓取来说至关重要,差 1 厘米可能就是抓到和抓空的区别。但它有一个致命限制:在户外阳光下基本废掉,太阳的红外辐射会淹没投射的光图案。所以你会发现几乎所有用 RealSense 的抓取方案都在室内。
ToF(Time of Flight):发射一束红外光,测量光从发射到返回的时间差来算距离。RealSense L515(已停产)和 Azure Kinect 用的是这个原理。ToF 不那么怕环境光,在半室外的仓库、月台这种场景更扛得住。代价是近距离精度不如结构光,而且在物体边缘容易出现”飞行点”(depth 值在前景和背景之间乱跳) - 如果你的算法依赖精确的物体轮廓,这会是个麻烦。
主动双目(Active Stereo):在双目相机的基础上加红外投射器,增强纹理来提升立体匹配效果。RealSense D400 系列其实就是主动双目。它的优势是通用性 - 精度不是最高但够用,室外不是最强但还能工作。特别是在弱纹理表面(白墙、纯色桌面)上,纯被动双目几乎算不出深度,加了红外投射器就好很多。
回到分拣机器人的例子:如果你的仓库全在室内、灯光可控,选结构光(RealSense D435i,带 IMU),精度最高、性价比也最高;如果仓库有大面积的卷帘门、自然光不可控,考虑 ToF 或者主动双目(RealSense D455 或 ZED 2);如果完全在室外,深度相机可能不是最优选择,直接上 LiDAR 更靠谱。
LiDAR - 激光雷达,机器人的“声呐”
想象你站在一个漆黑的房间里,手里拿着一支激光笔。你快速转一圈,每一个方向射出一束激光,记录下每束激光碰到墙壁或物体后返回的时间。一圈下来,你就知道了周围所有方向上“最近的障碍物离你多远”。
这就是 LiDAR 的基本原理。
2D LiDAR 只在一个平面上扫描 - 通常是水平面。输出是一圈距离值,像一个俯视图的切面。RPLIDAR、Hokuyo 是常见型号。便宜(几百到几千块),够用来做 2D SLAM 和平面避障。大部分 AGV / AMR 用的就是 2D LiDAR。
3D LiDAR 在多个平面上扫描,输出一个 3D 点云 - 几万到几十万个带坐标的点。Velodyne(现在叫 Ouster)、Livox 是主流厂商。贵很多(几千到几万),但能“看到”地面的凹坑、头顶的管道、站在旁边的人。自动驾驶汽车顶上那个旋转的“罐子”就是 3D LiDAR。
点云(Point Cloud) 是 LiDAR 最重要的输出格式。每个点是一个 [x, y, z] 坐标(有些还带反射强度 intensity)。一帧点云可能有十几万个点。处理点云的计算量远大于处理图像 - 这也是为什么 3D LiDAR 数据经常成为带宽和算力的瓶颈。
LiDAR 的物理盲区 - 这些是真实事故的来源,不是教科书上的边角知识。
一个经典场景:你的送餐机器人在商场里跑得好好的,突然全速撞上了一面落地玻璃墙。LiDAR 的点云上那个位置完全是空的 - 激光直接穿透了玻璃,机器人”看到”的是玻璃后面 10 米外的墙壁。在它的世界里,那面玻璃根本不存在。商场、写字楼、机场到处都是玻璃隔断,这不是极端情况,是每天都会遇到的现实。
同样的物理原理也让 LiDAR 对其他材质”失明”:深色哑光物体(黑色沙发、黑色行李箱)吸收激光,反射信号弱到检测不到;镜面把激光反射到别处,反而在点云里制造出不存在的”幽灵障碍物”;雨雪雾天,水滴和颗粒物散射激光,点云里到处是噪点。这些都是物理原理决定的,你没法通过 firmware 升级来解决 - 只能靠其他传感器来补偿,这就是后面传感器融合的核心动机。
IMU - 惯性测量单元,机器人的“内耳”
你闭着眼睛也知道自己在加速还是减速、在向左转还是向右转。这是因为你的内耳有一套精密的惯性感知系统。
IMU(Inertial Measurement Unit)就是机器人的内耳。它包含两个核心部件:
- 加速度计(Accelerometer):测量三个轴上的线性加速度。静止时,它能感受到重力方向(所以也能用来判断倾斜角度)
- 陀螺仪(Gyroscope):测量三个轴上的角速度 - 机器人在绕哪个轴旋转、转多快
IMU 的最大优点是快 - 更新频率通常在 200-1000 Hz,远快于相机(30 Hz)和 LiDAR(10-20 Hz)。这意味着在两帧 LiDAR 数据之间,IMU 已经告诉你机器人动了多少。这对高速运动场景至关重要。
IMU 的最大问题是漂移。IMU 测量的是加速度和角速度,要获得位置和姿态需要做积分。积分会累积误差 - 哪怕每次测量只有微小偏差,积分几秒钟之后误差就大到不可用。一个典型的消费级 IMU,纯积分定位 30 秒后误差可能达到好几米。
这就是为什么 IMU 几乎从不单独使用。它的价值在于跟其他传感器配合 - 用 LiDAR 或相机来周期性地“修正”IMU 的漂移,同时用 IMU 来填补两帧 LiDAR/相机之间的高频空白。这是后面 SLAM 章节会详细讲的传感器融合思路。
力/力矩传感器 - 机器人的“触觉”
前面所有传感器都是“远程感知” - 看到、听到,但不需要接触。力/力矩传感器不一样,它测量的是物理接触产生的力。
一般装在三个位置:
- 关节处:测量每个关节承受的力矩,用于判断是否撞到东西
- 末端执行器(手/夹爪)处:测量抓取时施加的力,用于精细力控
- 足底(腿足机器人):测量与地面的接触力,用于步态控制和平衡
为什么力传感器重要?因为抓鸡蛋和抓铁块是完全不同的事。如果只有位置控制(“夹爪闭合到间距 5cm”),你要么捏碎鸡蛋,要么夹不住铁块。力控制(“施加 2N 的力,如果力突增就停止”)才能让机器人安全地操作不同材质、不同脆弱程度的物体。
对于做操作(manipulation)的开发者来说,力/力矩传感器的数据质量直接决定了你能做多精细的任务。研磨、插拔、拧螺丝这些需要“手感”的操作,没有好的力传感器几乎不可能实现。
传感器融合 - 真正让机器人可靠工作的关键
到这里你应该注意到了一个 pattern:每种传感器都有明显的弱点。LiDAR 精度高但看不见玻璃、不知道颜色;相机有丰富的颜色和纹理信息但深度不准、受光照影响大;IMU 频率高但漂移严重;深度相机距离有限、室外容易失效;力传感器只能感知物理接触。
如果你只用一种传感器,你的机器人总会在某个场景下”瞎掉”。这不是概率问题,是确定性事件 - 只要跑得够久,LiDAR-only 的机器人一定会撞上玻璃门,camera-only 的机器人一定会在光线突变时迷路。
传感器融合的核心思想是互补。不是简单地”把数据放在一起”,而是利用不同传感器在不同维度上的强项,让系统在任何单一传感器失效时仍然能工作。
拿最常见的 LiDAR + IMU 融合(LIO)来举例。LiDAR 每秒输出 10-20 帧点云,精度很高但频率低;IMU 每秒输出几百上千次加速度和角速度数据,频率极高但会漂移。融合算法做的事情是:在两帧 LiDAR 之间,用 IMU 数据来预测机器人移动了多少(填补高频空白);每当新一帧 LiDAR 到来,用它来修正 IMU 累积的漂移(定期校准)。两者单独用都不够好,合在一起就能提供又准又快的位姿估计。
相机 + IMU 融合(VIO,Visual-Inertial Odometry)是成本更低的替代方案 - 不需要 LiDAR,一个相机加一个 IMU 就能做。精度比 LIO 差一些,但对预算敏感的项目来说是个好选择。AR 眼镜和手机上的空间定位基本都是 VIO。
回到前面 LiDAR 看不见玻璃的问题 - 解法就是融合:LiDAR 在玻璃位置没有返回点,但相机能看到玻璃上的反光和指纹,深度相机能检测到玻璃表面的红外反射。多传感器交叉验证,系统就能推断”这里有一个 LiDAR 看不到的障碍物”。
一个典型的室内移动机器人传感器配置:
- 1 个 2D LiDAR(导航和避障的主力)
- 1-2 个深度相机(物体识别和抓取引导)
- 1 个 IMU(高频运动估计)
- 轮式编码器(测量轮子转了多少圈,推算移动距离)
开发者在做传感器融合时最常踩的坑是时间同步。LiDAR 的时钟、相机的时钟、IMU 的时钟并不天然对齐。如果一帧点云的时间戳和对应的 IMU 数据差了 50 毫秒,融合算法就会把 50 毫秒前的运动状态当成现在的,导致地图”糊掉”。这也是为什么很多传感器模组(比如 RealSense D435i)把相机和 IMU 做在同一块板子上并硬件同步 - 就是为了省去开发者自己对时间戳的麻烦。
对开发者来说,选传感器不是选”最好的”,而是选”组合起来最互补的”。预算有限的情况下,一个 2D LiDAR + 一个 RealSense + 一个 IMU 的组合,能覆盖大部分室内场景的需求。融合算法的具体实现(EKF、因子图等)在 SLAM 那一章展开。