跳转至

前置 2 · 机器人怎么看,怎么知道自己在哪

第二章是给从 ML 这一边过来的读者补传感器和状态估计的基础。这章读起来像一份硬件目录加几条数学直觉,但每个东西都是后面正文要反复用到的。机器人圈对这些东西熟得像 ML 人熟 cross-attention,跳过去后面会一直卡。


一台机器人能看见什么

ML 人开口说"视觉"通常默认 ImageNet 那种 224×224 RGB。机器人这一行的视觉是个谱系,每一档解决不同问题。

单目相机 (monocular camera)。一只眼,给 RGB。便宜,几十美元就能买到工业级。问题是没有深度。一张 RGB 图看一个杯子,你不知道它离镜头 30cm 还是 80cm。Depth-from-monocular 这一线(MiDaS、Depth Anything v1/v2)可以从单图出深度,2024 年开始足够好用,但仍然不可信于 mm 级精度。家用机器人用单目 + Depth Anything 拼出来的深度可以指引 grasp planner 知道"杯子大概在那个范围",但 grasp 要落到表面这一步还是要真深度。

双目相机 (stereo camera)。两只眼,间距 10-20cm,三角测量出深度。RealSense D435/D455、ZED 2 都是这一类。优点是真深度。缺点是要纹理才能 match,一面纯白墙上双目算出来的深度全是噪声。在受控工业环境里好用,在家里碰到玻璃柜门会崩。

RGB-D 相机。RGB + 一颗主动深度传感器(结构光、ToF)。Kinect v1 用结构光把家用 3D 视觉这件事推到大众,现在大部分桌面机械臂场景默认装一颗 RealSense D405/D435。近距离 15cm 以下不可信这件事第 2 章已经说过,原因是结构光投出去的图案在近距离散开,ToF 的回波也会饱和。

事件相机 (event camera)。每个像素独立异步触发,只在亮度变化时输出,时间分辨率到微秒。Prophesee、iniVation 这两家做硬件。优点是高速运动场景下不模糊、动态范围超大、功耗低。缺点是输出不是图像而是事件流,所有现成的 CV 模型都没法直接吃。这一线 ML 人觉得新鲜,但工业部署目前几乎没用上,原因是数据集和工具链还没成熟。

鱼眼/全景。家用扫地机和外送机器人爱用鱼眼相机,单颗就能覆盖大视场。代价是畸变厉害、纹理在边缘被拉变形,需要 calibration 把它矫正回标准透视模型才能跟其他模块对接。

每一类相机都有 intrinsics (焦距、主点、畸变系数) 和 extrinsics (相对机器人本体的位姿)。任何用相机的项目第一件事就是 calibration,不做 calibration 后面所有几何算出来的东西都偏。这件事 ML 人很容易忽略,因为 ImageNet 那一边没有谁在意 calibration。


LIDAR:用激光量距离

LIDAR (Light Detection And Ranging) 是激光雷达的英文缩写。原理是发一束光、接收回波、算飞行时间,得到距离。每秒打几十万到几百万个点,每个点是 (x, y, z, intensity)

为什么机器人圈对 LIDAR 这么执着,理由就一句话:LIDAR 给你 ±5cm 以内的距离测量是物理保证,不是模型推理。视觉在低光、低纹理、高反光场景下都会崩,LIDAR 不会。代价是贵(几千到几万美元一颗)、动态物体上点云稀疏、玻璃透射、雨雪干扰。

按"线数"和"机械结构"分主要几种:

机械旋转式。Velodyne 那一波(VLP-16, VLP-32, HDL-64)。一颗激光头加一面旋转镜,每秒转 5-20 圈,每圈在垂直方向打 16-128 条线。线数越多,垂直分辨率越好。Velodyne 16 线一直是仓储和无人车的入门款。整体可靠性不算最好,旋转部件长期会坏。

固态 LIDAR。Livox(大疆系)、Hesai、Innoviz、Luminar。没有大尺寸旋转件,靠 MEMS 扫描镜或者 OPA 相控阵或者 FMCW。便宜、可靠、寿命长,缺点是单颗视场角窄、扫描模式不规则。Livox Mid-360 那种全向固态在仓储 AMR 上几乎已经默认。

3D vs 2D。2D LIDAR 只在水平面扫一圈,输出一个圆环上的点云。便宜、轻、低功耗,扫地机几乎全是。但只能感知平面上的障碍,桌面、悬挂物体看不见。3D LIDAR 给你完整 3D 点云,但贵几倍。

FMCW LIDAR。除了距离还能给径向速度(多普勒),同时对其他 LIDAR 干扰免疫。是这一两年汽车行业在押的技术路线。家用机器人短期内不会用上。

ML 类比:LIDAR 点云 ≈ 一个非定长的 3D 词序列。每个 token 是一个 (x, y, z, intensity) 元组。处理它的网络通常是 PointNet++、PointTransformer 这一系,思路上跟 attention 不远。但点云的稀疏性、不变性、非欧拓扑让具体网络架构跟 NLP/CV 差异很大。


IMU:知道自己在以什么姿态加速

IMU (Inertial Measurement Unit) 是六轴或九轴的惯性测量单元。

六轴 = 加速度计 (accelerometer) + 陀螺仪 (gyroscope)。加速度计测当前的线加速度,陀螺仪测当前的角速度。把这两个量在时间上积分,理论上能得到位置和姿态。

九轴 = 六轴 + 磁力计 (magnetometer)。磁力计读地磁场方向,给你一个绝对的"朝北"参考,弥补 yaw 角的长期漂移。

听起来 IMU 就够了:积分一下就能知道自己在哪。实际上不行。IMU 有几个死角:

  • 零漂 (bias)。每一颗 IMU 静止时输出也不是 0,有个慢慢变化的偏置。这个偏置直接积分两次进位置就是分钟级累积几米的误差。
  • 噪声 (noise)。每个采样里都有随机扰动,积一次进速度就是缓慢漂移,积两次进位置就是快速漂移。
  • 温漂 (temperature drift)。环境温度变化会改变 bias,特别是机器人运行发热之后。
  • 重力 (gravity)。加速度计读到的是"线加速度 + 重力",要先减掉重力才能得到自身运动加速度。重力的方向取决于姿态,姿态又取决于陀螺仪积分。这是个鸡生蛋的问题

所以 IMU 几乎从不单独用。它必须跟其他传感器(视觉、LIDAR、wheel encoder、GPS)融合,靠其他传感器把长期漂移压住。这件事就是状态估计 (state estimation) 这门学科的核心。

家用机器人的 IMU 通常是 Bosch BMI088、TDK ICM-42688 这一档,几美元一颗,工业级。无人机和高端人形会用 Xsens MTi-300 或更专业的,几百到几千美元。第 1 章末尾提过,看一台机器人的"硬件等级",IMU 是一个隐性指标


编码器:电机自己知道转了多少

编码器 (encoder) 是装在电机轴上的角度传感器。每个关节的"我现在转到多少度"就是从这里来的。

两类:

  • 增量式 (incremental)。每转一格输出一个脉冲,开机时不知道绝对位置,要先 homing(回零)。便宜、高分辨率,工业上很多用。
  • 绝对式 (absolute)。开机直接读到绝对角度。多圈绝对编码器还能记住"我已经转过几圈"。贵,但人形和协作机器人几乎都用绝对式(开机不需要 homing 是用户体验的硬要求)。

编码器的分辨率通常是十几位到二十几位每转。这意味着关节角的反馈精度是 0.001 度量级。对位置控制来说足够。

ML 类比:编码器是电机的 self-supervised 信号。每个采样都告诉你"上一时刻我命令电机转 X,现在它实际转到 Y"。这是控制律的输入,也是"VLA 输出关节角到底执行得对不对"这件事唯一的真相来源。


力/力矩传感器、触觉

最后一档传感器跟物体接触有关。

关节力矩传感器 (joint torque sensor)。装在每个关节里,测这个关节当前承受的扭矩。KUKA LBR iiwa 是把这件事做到工业级的标杆,所以它能做"碰到人就让一让"的真实柔顺控制。一台机器人的关节如果没有 link-side torque sensor,它的"impedance control"基本是装的。这件事第 10 章详细讲。

末端力/力矩传感器 (end-effector F/T sensor)。装在末端和夹爪之间,测末端受到的 6D 力(3 力 + 3 力矩)。ATI Mini40、Robotiq FT300 都是工业上常用的型号,单颗几百到几千美元。装配机器人插销、抛光、打磨这些 contact-rich 任务都靠它。

触觉 (tactile)。装在指尖,测接触位置、形状、滑动。GelSight (MIT)、DIGIT (Meta 开源, 30 美元 BOM)、ReSkin (CMU)、AnySkin 是这一波代表。第 4 章会详细展开。触觉是这一波最有潜力但工程化最慢的一类传感器


位姿:3 个数加 3 个数(或 4 个数)

机器人世界里描述"一个东西在哪"的标准格式是 6-DoF 位姿 (pose):3 个平移 + 3 个旋转。

平移好懂:(x, y, z),单位米。

旋转有几种表示方式:

  • 欧拉角 (Euler angles)。(roll, pitch, yaw),三个角度。直观但有奇异点(gimbal lock)。
  • 旋转矩阵 (rotation matrix)。3×3 正交矩阵,9 个数但只有 3 个独立自由度。无奇异,但参数多。
  • 四元数 (quaternion)。4 个数 (w, x, y, z),约束 ||q|| = 1。无奇异、紧凑、组合方便。机器人界默认用四元数,因为它在控制和插值上都干净。
  • 轴角 (axis-angle)。一个旋转轴 + 一个角度,3 个数(用 rotation vector)。可微好用。

ML 人需要知道的是:6-DoF 位姿不是一个 6 维欧氏空间里的点。它在 SE(3) 这个李群上。直接对欧拉角做加减、平均、回归,会出各种各样的诡异问题。这是为什么机器人里旋转回归通常用 6D 表示(Zhou 等 2019)或者四元数 + 一个特殊损失。


状态估计:把所有传感器拼到一起

这一节是这章核心。机器人怎么知道"我现在在哪、姿态如何、速度多少",叫做 state estimation。所有定位、导航、控制都建立在状态估计之上。

输入:n 路异步传感器(IMU、编码器、相机、LIDAR、GPS)。每路传感器有自己的频率、噪声特性、延迟。 输出:每个时刻的机器人完整状态向量(位置、姿态、速度,可能还有偏置等)。

Kalman filter (KF) 是这一行的牛顿力学定律级的工具。卡尔曼 1960 年提出来的,最初为阿波罗登月做的。本质是一个迭代的贝叶斯推理:当前的状态信念 + 新观测 → 后验状态信念。前提假设是线性高斯。

Extended Kalman Filter (EKF) 把它推到非线性系统:每一步在当前估计点做一阶 Taylor 展开。机器人 99% 的现成栈都用 EKF(ROS 的 robot_localization 包就是 EKF)。

Unscented Kalman Filter (UKF) 用 sigma points 做更准的非线性传播,但工程上很少压上 EKF 的覆盖率。

Particle Filter (PF) 拿一群粒子代表整个分布,扛得住强非线性和多模态分布。代价是粒子数指数增长。Monte Carlo localization (MCL) 是它在二维定位上的著名应用。

Factor Graph / GTSAM。把状态估计写成一张图:节点是变量(每个时刻的位姿),边是 factor(约束,来自传感器观测或者动力学)。整张图做最大后验估计。比 EKF 更通用,能处理 loop closure(回环检测把过去某时刻的位姿强制对齐)这类长程一致性约束。GTSAM (Frank Dellaert) 是这一线最有名的库。

ML 类比:状态估计 ≈ 在线贝叶斯推理。每来一条新观测,根据似然更新后验。Kalman filter 在线性高斯假设下有闭式更新;非线性场景就近似一下(EKF)或者采样一下(PF)。整套数学跟 ML 那边的概率图模型其实是一回事,只是套了控制论的术语。


SLAM:边走边建图边定位

SLAM (Simultaneous Localization And Mapping) 是机器人最常被外行误以为已解决、内行最知道还没解决的问题。

设定是这样:机器人放进一个未知环境,没有先验地图,没有 GPS。它要一边走,一边建出环境的地图,一边算自己当前在地图里的什么位置。这两件事互相耦合:要建图就要知道自己在哪(不然每帧观测放不到地图的同一个坐标系里),要定位就要有地图(不然没东西可参照)。

SLAM 的工程实现通常分两段:

前端 (front-end)。从原始传感器读数中提取特征、做帧间匹配、给出短时间内的局部位姿和地图增量。视觉 SLAM 的前端可能是 ORB 特征点 + 对极几何;LIDAR SLAM 的前端可能是 ICP 或者 NDT(normal distributions transform)。

后端 (back-end)。把前端的局部估计串起来,做全局优化。Bundle adjustment(BA)是视觉 SLAM 后端的经典操作:把所有帧的位姿和所有 landmark 的位置当成未知数,让重投影误差最小。LIDAR SLAM 后端通常是 pose graph optimization。

回环检测 (loop closure)。SLAM 系统跑久了累积误差会让地图"扭曲"。如果机器人走一圈回到老地方,认出来是老地方,就能把当前位姿强制和老位姿对齐,把累积误差摊到整条轨迹上。回环检测正确的 SLAM 像找回失忆,错误的 loop closure 比没有更糟:会把地图直接扭碎。

主流派别:

  • filter-based:EKF-SLAM、FastSLAM。早期主流,现在工业上不太用了,扩展性差。
  • graph-based:上面说的 pose graph + 后端优化。是当前主流。
  • direct vs feature-based:前者直接用像素亮度对齐 (LSD-SLAM, DSO),后者用提取出的特征点对齐 (ORB-SLAM)。各有优劣。
  • dense vs sparse:稠密重建(KinectFusion 那一支)追求每点都建图,稀疏(ORB-SLAM)只建特征点。
  • 学习派:DROID-SLAM、NeRF-SLAM、Gaussian-SLAM 这一波,把 SLAM 跟神经表示绑在一起。研究热,工业稳定性还差。

第 5 章会用整章讨论 SLAM 在 LLM 时代的位置。这里只需要记住:SLAM 是状态估计在"未知环境"这个 setting 下的特例。它没死,foundation model 没替代它,下面那一坨数学优化一项都没省。


几个该有的直觉

把这一章压成几句 takeaway:

  • 每种传感器都有它崩的地方。视觉死在低纹理低光、LIDAR 死在反光透射、IMU 死在长时间积分、编码器只测自己。唯一 robust 的方式是融合
  • Calibration 是所有几何模块的入口税。不做 calibration 后面一切都歪。
  • 位姿在 SE(3) 上不在 R^6 上。直接对欧拉角加减回归,会被旋转的非欧性反咬。
  • 状态估计是机器人版的在线贝叶斯推理。Kalman / EKF / 因子图是工具,背后的数学跟 ML 不远。
  • SLAM 没死。它只是被 foundation model 包了一层语义皮。下面那一层 ICP / loop closure / graph optimization 一个没省。

练习

找一台 RealSense D455 的 datasheet 读一遍。重点看 minimum / maximum depth、accuracy、FOV、frame rate。这些数字决定了"这颗相机能装在什么样的机器人上"。把 spec 读懂,比理解任何一篇 paper 更影响你下次选型的速度。

读 ROS 的 tf2 教程tf2 是 ROS 里管所有坐标系变换的库(base_link、odom、map、camera_link 这一堆)。机器人项目里 90% 的"为什么这个值不对"最后都被定位到 tf2 配置错了。理解它的心智模型在所有项目里都用得上。

找一段 ORB-SLAM3 的运行视频(YouTube 上很多)。看它建图、跑、回环检测三个阶段。注意"回环检测一瞬间整张地图被扭回来"的那个瞬间。这个瞬间是 SLAM 数学最迷人的地方,也是工程上最容易出 bug 的地方。

装一颗便宜的 IMU(比如 BNO055,几美元)拿到 Arduino 上,让它静止放着然后读 30 分钟数据。把加速度积一次进速度、积两次进位置画出来。亲眼看到 IMU 在没有融合的情况下分钟级漂移到几十米外,对 state estimation 这件事的体感比读十篇 paper 都直接。

下一章:前置 3 · 让机器人动起来、抓住东西