第 12 章 — 规划与控制(算法实现,不涉硬件)
开篇段落
本章是连接导航算法“大脑”与物理世界“身体”的关键桥梁。前述章节产出的宏观计划(如 VLA 的子目标序列)或几何路径(如 A* 的航点),在质上仍是离散和抽象的。本章的目标,是系统性地阐述如何将这些指令,转化为人形机器人可以精确、平滑、安全执行的时空连续运动轨迹。我们将从“行动原语”这一核心抽象层入手,探讨其设计哲学与实现模式;随后深入剖E析轨迹生成的数学本质——一个带约束的多目标优化问题,并对比不同的参数化和求解方法;接着,我们将重点介绍现代机器人控制的基石——模型预测控制(MPC),特别是其在处理复杂动力学和安全约束上的优势;最后,我们将讨论平顺性控制和系统级的故障安全(Fail-Safe)策略,它们是决定用户体验和系统可靠性的最后一道防线。学完本章,您将具备设计一个完整、鲁棒且高效的机器人运动规划与控制栈的算法能力。
12.1 行动原语库(Action Primitives Library)
行动原语(Action Primitives)是高层规划与底层控制之间的“合约”或API”。它们将复杂的连续控制问题,封装成一系列离散、可参数化、有明确执行语义的“技能”。这使得 VLA 等“大脑”可以专注于任务层面的逻辑推理,而无需关心动力学的细枝末节。
12.1.1 设计哲学与粒度权衡
- 完备性 vs. 简洁性: 原语库应该足够完备,以覆盖机器人所需执行的大部分基础动作。但一个过于庞大的库会增加高层规划的选择负担和复杂性。
- 原子性: 每个原语应是原子的,即执行过程中不应被轻易打断,除非是更高优先级的安全事件。它应该有一个清晰的开始、过程和结束状态。
- 参数化: 设计良好的原语是可参数化的。例如,
Cruise(path, speed_profile) 而不是多个固定速度的巡航原语。这提供了灵活性。
- Rule-of-Thumb: 原语的粒度应与其失败后可采取的恢复策略相匹配。如果一个动作的某个子步骤失败后,需要完全不同恢复逻辑,那么这个子步骤可能就应该独立成一个原语。
12.1.2 核心原语详解
- 转身 (TurnInPlace):
- 参数: 目标偏航角
target_yaw,角速度/加速度包络 (w_max, alpha_max)。
- 实现: 内部生成一个平滑的角速度规划曲线(如 S-curve 或梯形曲线),以最小化启动和停止时的加加速度(Jerk)。底层控制器(如 PID 或更复杂的全身控制器)负责跟踪此速度曲线,同时保持身体的平衡(尤其对人形机器人)。
- 内部状态:
STARTING -> ACCELERATING -> CONSTANT_VEL -> DECELERATING -> DONE.
- 终止条件:
|current_yaw - target_yaw| < yaw_tolerance 且 |current_w| < w_tolerance。
- 沿路径巡航 (CruiseAlongPath):
- 参数: 路径段
path: List[Pose],速度配置文件 speed_profile_params。
- 实现: 采用路径跟踪算法。
- 几何方法: Pure Pursuit 算法计算一个前视点,并生成驶向该点的曲率指令。简单直观,但可能切角。
- 模型基方法: Stanley Method(用于车辆模型)或更适用于人形的非线性模型预测控制(NMPC)跟踪器,同时考虑了位姿误差和朝向误差。
- 终止条件: 到达路径段的末端缓冲区,或下一个原语的触发条件(如“接近门”)被满足。
- 穿门/闸机 (TraverseDoorway):
- 这是一个典型的基于有限状态机(FSM)的复合原语。
- 状态机:
APPROACH: 远距离接近门,使用标准 CruiseAlongPath。
ALIGN: 在门前特定距离停止,微调位置和姿态,确保与门洞中心线对齐。感知模块需提供门框位姿。
VERIFY_CLEARANCE: 再次确认门洞宽度、高度,并检查门洞内及出口处无动态障碍物。
PASS_THROUGH: 以低速、固定朝向直行通过。在此阶段,局部避障的敏感区域会临时调整,避免将门识别为障碍物而“卡死”。手臂可能会收回到身体两侧以减小横截面积。
EXIT_CLEAR: 确认身体完全通过门洞后,恢复正常导航模式。
- Rule-of-Thumb: 状态转移依赖于几何条件和感知模块的信号。例如,从
ALIGN 到 VERIFY_CLEARANCE 的转移,需要 pose_error < threshold 和 perception.is_door_clear == True。
- 操作电梯 (OperateElevator):
- 这是一个人机交互(HRI)与导航结合的复杂原语。
- FSM:
CALL_ELEVATOR (识别并定位按钮) → WAIT_FOR_DOOR (监测门状态) → ENTER (进入电梯,类似穿门) → SELECT_FLOOR (识别楼层按钮) → RIDE (等待到达) → EXIT (门开后退出)。
- 每个状态都强依赖于感知系统的特定输出,如
vision.get_button_pose('up') 或 vision.get_elevator_door_status()。
12.2 轨迹生成:多目标约束优化
全局规划器输出的路径是几何和静态的,而机器人需在动态世界中移动。轨迹生成(Trajectory Generation)的目标是,为这条路径赋予时间信息,并将其优化成一条平滑、安全、且动力学可行的时空曲线。
12.2.1 问题形式化
寻找一条由时间 $t$ 参数化的状态轨迹 $X(t) = [p(t), v(t), a(t), …]$,其中 $p(t) \in SE(3)$ 是机器人的位姿,该轨迹需要最小化一个加权代价函数 $J_{total}$:
$ \min_{X(t)} J_{total} = \int_{0}^{T} ( w_{s} L_{smooth} + w_{o} L_{obs} + w_{e} L_{energy} ) dt + w_t L_{time}(T) $
-
$L_{smooth}$ (平滑度): 通常惩罚高阶导数,最常见的是最小化加加速度(Jerk)或加加加速度(Snap)。
$ L_{smooth} = || \frac{d^3 p(t)}{dt^3} ||^2 $
-
$L_{obs}$ (障碍物): 惩罚轨迹与障碍物的接近程度。使用从占据地图(Chapter 9)导出的欧几里得符号距离场(ESDF)是最高效的方式。$ESDF(p)$ 返回点 $p$ 到最近障碍物的距离。
$ L_{obs}(p(t)) = \begin{cases} (d_{max} - ESDF(p(t)))^2 & \text{if } ESDF(p(t)) < d_{max} \ 0 & \text{otherwise} \end{cases} $
-
$L_{energy}$ (能耗代理): 精确的能耗模型复杂,通常用控制量(如加速度或电机力矩)的二范数平方作为代理。
$ L_{energy} = || a(t) ||^2 $
-
$L_{time}$ (时间): 对总时长 $T$ 的惩罚,鼓励轨迹高效。
12.2.2 轨迹参数化
为了将无限维的优化问题转为有限维,需要对轨迹进行参数化。
- 多项式 (Polynomials): 如最小化 Jerk 的轨迹通常是分段 5 阶多项式。简单,但自由度有限。
- 样条 (Splines): B-样条或贝塞尔曲线是更灵活的选择。轨迹由一系列控制点定义,移动控制点即可改变轨迹形状。样条的连续性($C^2$ 或更高)保证了轨迹的平滑。
12.2.3 求解方法
- 梯度基方法 (e.g., CHOMP): 在轨迹上离散采样点,然后沿着代价函数的负梯度方向迭代更新这些点的位置,同时保持路径的连续性。
- 随机优化 (e.g., STOMP): 在每个轨迹点周围进行随机扰动,生成一组候选轨迹,然后根据代价加权平均,更新原轨迹。对局部最小值不敏感,但收敛较慢。
- Rule-of-Thumb: 轨迹优化通常在局部规划器中以较高频率(如 5-10 Hz)运行。为了保证实时性,优化的起点通常是上一周期的解,这被称为“热启动”(Warm Start),能极大加速收敛。
(Obstacle Field - High Cost)
/========================\
| ESDF < d_max |
\========================/
^
| Cost Gradient Pushes Trajectory Away
|
Initial Path: A------------------>B
|
Optimized Traj: A~~~~~~~~~~~~~~~>B (Bends around obstacle)
12.3 鲁棒控制:MPC 深入、动力学模型与约束处理
有了理想轨迹 $X_{ref}(t)$,控制器的任务是计算出电机指令 $u(t)$,使得机器人的实际状态 $X_{actual}(t)$ 尽可能精确地跟踪 $X_{ref}(t)$,同时应对各种扰动。模型预测控制(MPC)因其前瞻性和处理约束的能力,已成为事实上的标准。
12.3.1 MPC 核心循环
在每个控制周期(例如 $t_k$,周期为 $\Delta t$),MPC 执行以下操作:
- 状态估计: 获取当前机器人状态 $X_{actual}(t_k)$。
- 构建优化问题: 在未来 $N$ 个时间步(预测时域 $T_p = N \cdot \Delta t$)内,求解一个最优控制序列 $U^* = { u_k^, u_{k+1}^, …, u_{k+N-1}^* }$。
$ \min_{U} \sum_{i=0}^{N-1} ( ||X_{k+i} - X_{ref, k+i}||^2Q + ||u{k+i}||^2R ) + ||X{k+N} - X_{ref, k+N}||^2_P $
subject to:
- $X_{k+i+1} = f(X_{k+i}, u_{k+i})$ (动力学模型约束)
- $X_{min} \le X_{k+i} \le X_{max}$ (状态约束,如关节角度)
- $u_{min} \le u_{k+i} \le u_{max}$ (输入约束,如电机力矩)
- $g(X_{k+i}) \le 0$ (其他约束,如与障碍物的安全距离)
- 应用控制: 仅将计算出的最优控制序列的第个元素 $u_k^*$ 应用到机器人。
- 滚动时域: 在下一个时间步 $t_{k+1}$,重复整个过程。这种“滚动优化”策略使得 MPC 能够持续地对新信息做出反应。
12.3.2 动力学模型的选择
MPC 的性能关键取决于内部预测模型 $f(X, u)$ 的好坏。
- 1B 方案: 可能使用简化的单刚体或自行车运动学模型。这类模型忽略了动力学效应,计算速度快,适用于低速、平坦地面场景。
- 10B 方案: 对于人形机器人,必须考虑动力学和平衡。
- 线性倒立摆模型 (LIPM): 将机器人简化为质心和一个无质量的伸缩腿,是步态规划的经典模型。
- 质心动力学 (Centroidal Dynamics): 考虑了整个机器人的线性和角动量变化,是更精确的模型,能处理更动态的动作。
- Rule-of-Thumb: 模型的复杂度是一个权衡。更精确的模型能做出更优的预测和控制,但会大大增加优化问题的求解间。一个常见的做法是使用简化的(甚至是线性的)模型进行 MPC 预测,然后由一个更高频的全身控制器(WBC)将 MPC 输出的质心级指令映射到所有关节的力矩。
12.3.3 约束处理
MPC 最大的优势在于其显式处理约束的能力。
- 软约束 vs. 硬约束: 关节限位、电机力矩是硬约束,必须满足。而与动态障碍物的距离可以是软约束,即允许在付出巨大代价的情况下短暂违反,以避免无解。
- 稳定性约束: 对于人形机器人,最重要的约束是零力矩点 (ZMP) 必须保持在支撑脚(或多边形)内部,这是维持平衡的物理条件。MPC 在预测时域内的每一步都必须满足此约束。 $ ZMP(X_k, u_k) \in \text{SupportPolygon}_k $
12.4 抖动与迟滞的消除:根源分析与系统级解决方案
不平滑、犹豫的运动是机器人导航中最影响用户体验的问题之一。
- 根源分析:
- 感知不定性: 传感器读数的微小噪声导致代价地图或障碍物位置频繁小幅更新。
- 规划器不稳定性: 当面临两个代价几乎相等的选择时(例如从障碍物的左边还是右边绕行),规划器可能会在高频重规划中来回切换。
- 时间不同步: 规划器使用的地图是 $t-1$ 时刻的,而机器人当前位姿是 $t$ 时刻的,这种延迟会引发震荡。
- 系统级解决方案:
12.5 安全停止与分层降级策略 (Fail-Safe)
一个鲁棒的系统必须假设任何组件都可能失败,并为此设计预案。
- L1: 独立安全监控 (Watchdog):
- 一个轻量级、高优先级的独立进程,负责监控核心模块(感知、定位、规划、控制)的“心跳”和数据新鲜度。
- 如果某个模块在规定时间内没有发出心跳,或者其输出数据的时间戳过旧,监控器就触发降级。
- L2: 优雅降级 (Graceful Degradation):
- 这是应对非致命故障的首选策略。
- 示例:
- VLA 大脑超时 -> 系统自动切换到更可靠但功能较少的 OCC 或传统导航栈。
- 主深度相机故障 -> 系统使用次要相机,并自动降低最大速度和加速度,增大安全距离。
- 定位质量下降 (covariance 增大) -> 机器人暂停任务,执行一个“原地环顾”的原语以重新定位,若失败则请求人工干预。
- L3: 安全停止 (Safe Stop):
- 当检测到严重异常(如 MPC 求解器连续失败、IMU 姿态异常、即将发生不可避免的碰撞)时触发。
- 此操作会立即中止所有当前原语,并执行一条预先计算好的、动力学可行的制动轨迹。这条轨迹的目标是在最短时间内稳定地停止,而不只是简单地将速度设为零。通常会有一个基于当前速度的查找表来获取最优制动曲线。
- L4: 紧急停止 (Emergency Stop - E-Stop):
- 这是最后的防线,通常由硬件(如物理红色按钮)或极严重的软件故障(如内核恐慌)触发。
- 算法上,它会绕过所有平滑控制,直接给驱动器下达最大制动指令,甚至可能切断电机电源。这是有损的,但能最大程度保证安全。
本章小结
本章详细阐述了从抽象计划到具体运动的算法全链路,这是决定机器人导航性能和安全性的核心。
- 行动原语通过封装和状态机,实现了高层逻辑与底层控制的解耦,是构建复杂行为的基础。
- 轨迹生成是一个多目标优化过程,通过参数化和数值求解,平衡了平滑性、安全性、效率等多个相互冲突的目标。
- 模型预测控制 (MPC) 以其前瞻性、对动力学的建模能力以及强大的约束处理能力,成为现代机器人鲁棒控制的首选方案,对人形机器人的平衡至关重要。
- 运动的平顺性是一个系统工程问题,需要从规划频率、决策逻辑和指令滤波等多个层面协同解决。
- 分层安全策略(监控 -> 降级 -> 安全停止 -> 紧急停止)是确保机器人在复杂现实世界中可靠运行的基石。
常见陷阱与错误 (Gotchas)
- 控制器与规划器打架: 局部规划器(轨迹优化器)和 MPC 控制器都在进行优化,如果它们的目标或模型不一致,可能会导致系统振荡。调试建议: 确保 MPC 的目标是紧密跟踪轨迹优化器生成的轨迹,而不是自己重新规划。MPC 应该扮演一个“高质量的轨迹跟踪器”角色。
- MPC 求解时间不稳定: MPC 的计算时间取决于问题的复杂度和状态。在接近大量障碍物时,约束增多,求解时间可能飙升,超过控制周期,导致系统失稳。调试建议: 使用实时性更好的求解器(如 qpOASES),设置求解超时,如果超时则复用上一周期的解或执行安全停止。
- 忽略状态估计的延迟和噪声: 控制器依赖的状态(位置、速度)本身是估计出来的,有延迟和噪声。直接将带噪的速度信号用于控制会引起剧烈抖动。调试建议: 控制器应使用经过卡尔曼滤波或类似滤波器平滑后的状态估计。同时,在 MPC 模型中应考虑并补偿已知的系统延迟。
- 原语的死锁或活锁: 在复杂的状态机设计中,可能会出现状态之间来回跳转(活锁)或卡在某个状态无法退出(死锁)的情况。调试建议: 为每个状态设置一个超时定时器。对状态转移的条件进行形式化验证或充分的压力测试,确保逻辑的完备性。
- 不切实际的轨迹: 轨迹优化器如果使用了过于简化的模型,可能会生成一条机器人动力学上无法跟踪的轨迹,导致巨大的跟踪误差和不稳定。调试建议: 确保轨迹生成器的动力学约束至少与(或比)MPC 控制器使用的模型同样严格。轨迹的生成和执行之间应该有“可行性握手”。