1. 机器人的「感官-大脑-肌肉」:感知、规划与控制总览 / 1. The "Senses-Brain-Muscles" of Robots: Overview of Perception, Planning, and Control
刚学站的小崽子摇摇晃晃扶着沙发挪步时,谁家爸妈没在旁边喊过「小心前面有凳子!慢点走!」?娃儿先抬眼瞅瞅(视觉感知),脚底蹭蹭地面试试软硬(触觉感知),耳朵听着爸妈的指令(听觉感知),小脑袋瓜一转:「哦,得绕开凳子,走沙发和茶几中间的空隙最稳」(决策规划),紧接着小腿肌肉发力:抬左脚、落左脚、调整重心、抬右脚,整个过程行云流水,最多晃两下也不会摔。这套「感官收信息-大脑做决策-肌肉执行动作」的本能,恰恰是移动机器人自主导航的核心逻辑——只不过我们把机器人的「感官」叫感知层、「大脑」叫规划层、「肌肉」叫控制层,三者分工明确又紧密耦合,任何一个环节掉链子,机器人要么原地打转,要么直接撞墙。
如果你拆解过市面上的移动机器人产品,不管是扫地机器人、仓储AGV,还是波士顿动力的 Atlas 人形机器人、Waymo 的无人驾驶车,底层架构永远跳不出这个「感官-大脑-肌肉」的框架:感知层负责从激光雷达、摄像头、IMU 等传感器中提取环境的结构化信息,相当于机器人的眼睛、耳朵和皮肤;规划层负责基于感知到的信息做决策,包括构建环境地图、定位自身位置、规划行驶路径、判断避障策略,相当于机器人的小脑和大脑;控制层负责把规划层的抽象指令转换成电机、舵机等执行器能识别的具体控制信号,驱动机器人精准完成动作,相当于机器人的骨骼和肌肉。很多人刚接触机器人领域时容易把 SLAM、路径规划、运动控制的概念混为一谈,甚至以为只要把 SLAM 调通就能实现机器人自主导航,实际上这三个模块的边界、输入输出、技术栈差异极大,本章的核心目标就是帮你把这套逻辑彻底捋顺,建立全局认知。
1.1 三大模块的核心任务边界:别再把 SLAM 当成感知的全部
很多新手入门时最先接触的往往是 SLAM(Simultaneous Localization and Mapping,同步定位与建图)技术,误以为 SLAM 就是机器人感知的全部,实际上它只是规划层的基础模块之一,和感知、控制的边界非常清晰。我们可以用「小孩去客厅拿玩具」的场景进一步拆解三个模块的职责,顺便理清常见的认知误区:
1.1.1 感知层:机器人的「感官系统」,输出结构化环境信息
感知层的核心任务不是直接输出原始传感器数据,而是从杂乱的原始数据中提取对后续决策有用的结构化信息。比如小孩的眼睛看到的是杂乱的像素画面,但大脑会自动提取出「前面有个蓝色凳子」「地面是木质的没有水」这类结构化信息;机器人的激光雷达输出的是几千个无序的三维点,感知层需要把这些点转换成「障碍物距离我1.2米,高度0.5米」「这是墙壁,不是可通行区域」这类可被规划层直接使用的信息。
从技术栈来看,感知层可以进一步分为几何感知和语义感知两大方向:
- 几何感知的核心是处理空间几何信息,SLAM、点云处理、深度估计、里程计计算都属于这个范畴,输出的是地图、自身位姿、障碍物位置等几何维度的信息;
- 语义感知的核心是理解环境的语义信息,目标检测、语义分割、物体识别、语音识别都属于这个范畴,输出的是「这是门,可以通行」「这是行人,需要避让」「这是充电座,需要前往」这类带语义标签的信息。
这里要特别澄清一个常见误区:SLAM 既不属于纯粹的感知层,也不属于纯粹的规划层,而是两者的交叉模块——它的输入是传感器的原始数据(需要感知层的特征提取、去噪处理),输出是地图和定位结果(是规划层的基础输入),所以很多机器人架构会把 SLAM 放在感知和规划的衔接位置,而不是单纯归到某一侧。
1.1.2 规划层:机器人的「大脑」,输出可执行的决策指令
规划层的核心任务是基于感知层输出的结构化信息,做出「去哪、怎么走、遇到问题怎么办」的决策,它的输出永远是抽象的动作或路径指令,而不是直接给执行器的控制信号。对应到小孩拿玩具的场景:感知层告诉大脑「客厅有个蓝色凳子挡路,距离我1.2米,妈妈在沙发旁边喊我」,规划层需要决策「我先绕开凳子,走茶几旁边的空地,然后走到沙发旁边找妈妈」,输出的是「先向前走2米,然后左转30度,再向前走1.5米」的路径序列,或者更上层的「遇到动态障碍物就减速避让」的行为规则。
从技术栈来看,规划层也可以按决策层级分为三层: 1. 全局路径规划:在已知的静态地图上规划从起点到终点的最优全局路径,常用的算法有 Dijkstra、A*、Hybrid A* 等,输出的是全局的路径点序列; 2. 局部路径规划:基于全局路径和实时感知到的动态障碍物,规划短时间内的局部行驶轨迹,同时负责实时避障,常用的算法有 DWA(动态窗口法)、TEB(时间弹性带)、APF(人工势场法)等,输出的是未来几秒内的局部轨迹点; 3. 行为决策规划:更高层的决策模块,负责处理复杂的交通规则、人机交互逻辑,比如遇到行人要礼让、遇到限速标志要减速、充电电量低要先回充电座,现在前沿的方向是用大模型做行为决策,让机器人能理解自然语言指令,比如用户说「帮我把客厅的快递拿过来」,机器人能自动规划拿快递的完整动作序列。
1.1.3 控制层:机器人的「肌肉」,输出硬件可识别的控制信号
控制层的核心任务是把规划层输出的抽象路径/动作指令,转换成执行器能直接识别的控制信号,保证机器人能精准、稳定地完成规划的动作,它的输出永远是具体的硬件控制量,比如轮子的转速、关节的力矩、舵机的角度。对应到小孩的场景:规划层输出「向前走1米」的指令,控制层需要精确控制左腿和右腿的肌肉发力顺序、发力大小、重心调整,保证娃儿不会摔、不会走歪。
从技术栈来看,控制层主要分为两类: 1. 运动控制:控制机器人的位置、速度、姿态等运动量,比如轮式机器人的速度控制、无人车的转向控制、机械臂的轨迹跟踪控制,常用的算法有 PID 控制、MPC(模型预测控制)、LQR(线性二次调节器)等; 2. 力/力矩控制:控制执行器的输出力矩,比如机械臂的力反馈抓取、人形机器人的关节柔顺控制、无人车的制动控制,常用的算法有阻抗控制、导纳控制等,现在人形机器人的柔顺交互技术就属于这个方向。
这里也要澄清一个常见误区:控制层不是简单的「调PID」,很多新手觉得只要把PID参数调好就能解决所有控制问题,实际上控制层的设计需要考虑机器人的运动学/动力学模型、执行器的特性、传感器的噪声、环境的约束(比如地面摩擦系数),比如轮式机器人在湿滑地面行驶时,如果控制层没有考虑滑移补偿,哪怕PID参数调得再好,机器人也会打滑、走偏。
1.2 全书核心术语中英双语对照表
本章是全书的开篇,我们先梳理全书会用到的核心术语,按模块分类整理如下,后续章节会反复用到这些概念,建议读者先通读一遍,对专业术语建立初步认知:
| 模块分类 | 中文术语 | 英文术语 | 简要定义 | |----------|----------|----------|----------| | 通用基础 | 机器人操作系统2 | Robot Operating System 2 (ROS2) | 当前机器人开发的主流开源框架,提供硬件抽象、设备驱动、通信、算法包等基础功能,是本书所有Demo的底层框架 | | | 坐标系 | Coordinate Frame | 机器人描述空间位置的基准,常用世界坐标系、机器人本体坐标系、传感器坐标系、目标坐标系等 | | | 刚体变换 | Rigid Body Transformation | 描述两个坐标系之间位置和姿态关系的变换,由旋转矩阵$R$和平移向量$t$组成,变换公式为$p_w = R \cdot p_b + t$,其中$p_w$是世界坐标系下的点,$p_b$是机器人坐标系下的点 | | 感知层核心术语 | 同步定位与建图 | Simultaneous Localization and Mapping (SLAM) | 机器人在未知环境中一边构建环境地图,一边估计自身在地图中的位置的技术,是移动机器人自主导航的基础 | | | 激光雷达 | Light Detection and Ranging (LiDAR) | 通过发射激光束测量距离的传感器,是移动机器人最常用的环境感知传感器,可输出高精度的三维点云数据 | | | 惯性测量单元 | Inertial Measurement Unit (IMU) | 测量物体三轴加速度、三轴角速度的传感器,常和激光雷达、摄像头融合用于里程计计算和定位 | | | 点云 | Point Cloud | 由三维空间中的点组成的集合,每个点包含$x,y,z$坐标和反射强度等信息,是激光雷达、深度相机的原始输出格式 | | | 特征提取 | Feature Extraction | 从原始传感器数据中提取可区分、可重复的特征点(如角点、边缘、平面)的技术,是SLAM、目标检测的基础 | | | 语义分割 | Semantic Segmentation | 给图像或点云中的每个像素/点分配语义标签(如「行人」「车辆」「墙壁」)的技术,属于语义感知的核心方向 | | 规划层核心术语 | 全局路径规划 | Global Path Planning | 在已知静态地图上规划从起点到终点的最优全局路径,不考虑动态障碍物 | | | 局部路径规划 | Local Path Planning | 基于全局路径和实时感知数据,规划短时间内的局部行驶轨迹,负责动态避障 | | | 代价地图 | Costmap | 把环境地图转换成带代价的二维网格,每个网格的代价代表该区域的可通行程度,是路径规划的基础输入 | | | 自适应蒙特卡洛定位 | Adaptive Monte Carlo Localization (AMCL) | 基于粒子滤波的2D激光定位算法,是ROS2导航栈的默认定位模块 | | | 行为树 | Behavior Tree | 一种模块化的机器人行为决策框架,比传统状态机更灵活,是当前机器人行为规划的主流方案 | | 控制层核心术语 | 比例-积分-微分控制 | Proportional-Integral-Derivative Control (PID Control) | 最经典的控制算法,通过比例、积分、微分三个环节的线性组合消除误差,是机器人运动控制的基础算法 | | | 模型预测控制 | Model Predictive Control (MPC) | 基于模型的优化控制算法,通过预测未来一段时间内的系统状态,求解最优控制量,常用于无人车、机械臂的高精度控制 | | | 运动学模型 | Kinematic Model | 描述机器人运动学和几何约束的模型,不考虑力和力矩,只关心位置、速度、姿态的关系,是轮式机器人控制的基础 | | | 动力学模型 | Dynamic Model | 描述机器人动力学特性的模型,考虑力、力矩、质量、惯性等因素,是高动态机器人(如人形机器人、机械臂)控制的基础 | | | 轨迹跟踪 | Trajectory Tracking | 控制机器人沿着规划的轨迹精确运动的技术,是运动控制的核心任务之一 | | 系统集成核心术语 | 导航栈 | Navigation Stack | 实现机器人自主导航的软件模块集合,包含感知、定位、规划、控制等所有导航相关的功能模块,ROS2的Nav2是当前最主流的开源导航栈 | | | 仿真 | Simulation | 在虚拟环境中模拟机器人硬件和环境的软件工具,常用的仿真平台有Gazebo、Isaac Sim、Webots等,可降低算法开发的硬件成本 |
1.3 10分钟跑通第一个机器人导航Demo:从理论到实践的跨越
学完上面的概念你可能还是觉得抽象,没关系,我们用一个最小化的ROS2导航Demo,让你直观感受三大模块的协作流程。这个Demo基于ROS2官方开源的Nav2导航栈和TurtleBot3仿真模型,不需要任何实体机器人,只要有Ubuntu 22.04 + ROS2 Humble环境就能跑通,全程不超过10分钟。
1.3.1 前置准备
首先确保你的开发环境已经安装好ROS2 Humble,然后安装Demo需要的依赖包: ```bash
安装TurtleBot3仿真包、Nav2导航栈、Cartographer建图算法
sudo apt update sudo apt install ros-humble-turtlebot3-gazebo ros-humble-nav2-bringup ros-humble-cartographer ros-humble-nav2-amcl ros-humble-nav2-controller ros-humble-nav2-planner ros-humble-nav2-behavior-tree ros-humble-nav2-bt-navigator ``` 然后设置TurtleBot3的模型环境变量(TurtleBot3是ROS社区最流行的入门级移动机器人仿真模型,burger版是两轮差速底盘,适合入门): ```bash echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc source ~/.bashrc ```
1.3.2 启动Demo
整个Demo只需要两个终端窗口就能跑通: 终端1:启动Gazebo仿真环境和Cartographer建图节点 ```bash
启动TurtleBot3的仿真世界,包含地面、墙壁、障碍物等环境
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py ``` 启动后你会看到Gazebo窗口里出现了一个两轮的小机器人,周围是模拟的室内环境,激光雷达的点云数据会实时显示在界面上,这一步对应三大模块的感知层输入:激光雷达、IMU等传感器开始采集环境数据。
终端2:启动Nav2导航栈 ```bash
启动导航栈,包含定位、规划、控制等所有导航模块
ros2 launch turtlebot3_navigation2 navigation2.launch.py map:=$HOME/map.yaml ``` 如果你之前没有建过地图,可以先跑建图Demo生成地图: ```bash
新开终端3,启动Cartographer建图节点
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=true ``` 建图时用RViz2的「2D Nav Goal」按钮给机器人发目标点,让机器人绕环境走一圈,覆盖所有区域,然后保存地图到`$HOME/map.yaml`,再启动导航栈即可。
1.3.3 发导航目标,观察三大模块协作
导航栈启动后,RViz2窗口会显示已经构建好的2D地图,你可以看到机器人的位置(用箭头表示),接下来只需要两步就能让机器人自主导航: 1. 点击RViz2工具栏的「2D Pose Estimate」按钮,在地图上点击机器人所在的位置,拖拽箭头设置机器人的初始朝向,完成定位初始化,这一步对应规划层的定位模块:AMCL算法会根据激光雷达数据和初始pose,估计机器人在全局地图中的位置; 2. 点击RViz2工具栏的「2D Nav Goal」按钮,在地图上点击你想要机器人前往的目标点,拖拽箭头设置目标朝向,机器人就会自动规划路径、避障、行驶到目标点。
整个过程你可以在RViz2里清晰看到三大模块的协作流程:全局规划器会先计算从当前位置到目标点的全局路径(显示为绿色的线),局部规划器会实时根据感知到的动态障碍物调整局部轨迹(显示为蓝色的线),控制层会控制轮子按照局部轨迹运动,最终机器人会精准停在目标点。如果中途你手动拖动Gazebo里的障碍物,机器人会自动避障重新规划路径,完全模拟了真实机器人的导航流程。
这个最小化导航系统刚好对应「感官-大脑-肌肉」的架构:激光雷达等传感器是感官,Nav2里的建图、定位、规划模块是大脑,轮子电机和控制器是肌肉,没有任何冗余模块,是理解机器人导航最基础的样本。
1.4 三大模块的协作逻辑与耦合关系
从上面的Demo可以看出,三大模块不是独立工作的,而是通过数据流紧密耦合,任何一个模块的输出质量都会直接影响下游模块的效果。我们可以用下面的Mermaid序列图清晰展示整个导航流程的数据流: ```mermaid sequenceDiagram participant S as 传感器(感官) participant P as 感知/规划层(大脑) participant C as 控制层(肌肉) participant R as 机器人执行器 S->>P: 发送原始数据(激光点云、IMU数据、图像) P->>P: 感知处理(特征提取、障碍物检测、里程计计算) P->>P: 规划处理(SLAM建图、AMCL定位、全局/局部路径规划) P->>C: 发送目标路径/动作指令 C->>C: 运动控制(轨迹跟踪、力矩控制) C->>R: 发送执行指令(轮子转速、关节角度) R->>S: 反馈执行状态(位置、速度、姿态) ```
这种耦合关系也解释了为什么很多机器人算法看起来理论完美,实际落地却问题频出:比如感知层的激光雷达被灰尘挡住,点云噪声变大,定位结果就会飘,规划层算出来的路径就会有偏差,最后机器人可能撞墙;如果规划层输出的路径曲率太大,超过了控制层的跟踪能力,机器人就会走歪甚至打滑;如果控制层的电机响应太慢,机器人跟不上规划的轨迹,感知层的里程计就会产生误差,进一步导致定位失效。所以现在机器人领域的研究越来越强调端到端的协同优化,而不是单独优化某一个模块,这也是本书后续章节会反复提到的核心思路:不要孤立地学SLAM、路径规划或运动控制,要理解三者的耦合关系,才能做出真正能落地的机器人系统。
1.5 本书内容框架与学习路径
本章是全书的开篇,帮你建立了机器人感知、规划、控制的全局认知,后续章节会按模块拆解每个方向的技术细节,同时兼顾理论深度和工程实战:
- **第2-5章:感知层核心技术**:从机器人导航的基础数学(坐标系、旋转表示、概率基础)讲起,深入讲解2D/3D SLAM的原理与实现、多传感器融合(激光雷达+IMU+摄像头)、语义感知与语义SLAM的前沿方向,最后用Cartographer和RTAB-Map两个开源SLAM算法的实战案例,帮你掌握感知层的工程落地能力;
- **第6-9章:规划层核心技术**:从基础的图搜索算法讲起,深入讲解全局/局部路径规划的原理与优化、代价地图的设计、行为决策规划的方法,最后讲解Nav2导航栈的二次开发,以及无人车、服务机器人的路径规划实战案例;
- **第10-13章:控制层核心技术**:从机器人运动学/动力学模型讲起,深入讲解PID、MPC等经典控制算法的原理与调参、轨迹跟踪控制、柔顺控制技术,最后讲解轮