Part IV · 第 14 章 运动规划 · 14.3

轨迹优化:CHOMP 与 TrajOpt

采样式规划器给出一条能走的折线,轨迹优化把它变成一条好走的曲线:光滑、离障碍物有余量、满足关节限位。本节讲两种经典做法。CHOMP 用平滑度度量 A⁻¹ 把障碍物的“推力”沿整条轨迹摊开,并按弧长积分机器人身上各点的 SDF 代价;TrajOpt 把避障写成约束,用带信赖域的序列凸规划求解,并用扫掠体检查两个航点之间的碰撞。两者都是局部方法,所以最后还要回答:初值从哪里来。

约 45 分钟 前置:6.13 轨迹优化初探 · 6.7 约束优化 · 6.5 信赖域 · 12.2 SDF · 14.2 采样式规划 6 个交互

    1为什么机器人需要它

    14.2 节的 RRT 在机械臂的构型空间里撒点、连边,很快就能找到一条无碰撞的路径。但这条路径是一串随机方向的折线:关节速度在每个拐点突变,绕了不必要的远路,有时还贴着障碍物擦过。直接交给电机执行,机械臂会抖、会慢,还可能因为跟踪误差撞上去。OMPL 和 MoveIt 先用捷径化把它简化一遍(14.2 节 FIG 6),但结果仍是折线。常见的做法是“先规划,再优化”:把这条路径按弧长重采样成航点,当作初值,交给轨迹优化器修成光滑、留有余量的轨迹。

    6.13 节已经搭好了骨架:把轨迹离散成航点向量,代价 = 平滑项 + 障碍项,用梯度下降、预条件或 Gauss-Newton 求解;还在 2 连杆机械臂上演示了“CHOMP 风格”的预条件下降。那一节回答了“轨迹优化是什么”。本节回答真正写一个运动规划器时会遇到的问题:

    • CHOMP 的完整形式:为什么用 \(A^{-1}\) 而不是普通梯度(FIG 1),机器人的身体怎样变成一组球、在 SDF 里取代价(FIG 2),以及为什么障碍代价要按弧长积分,否则优化器会学会“加速冲过”障碍(FIG 3)。
    • TrajOpt:把避障当成约束而不是软代价,用 6.7 节的精确罚函数和 6.5 节的信赖域做序列凸规划(FIG 4);以及只在航点上查碰撞为什么不够,扫掠体怎样补上,又在哪里仍然会漏(FIG 5)。
    • 局部极小与初始化:两种方法都只会往“下坡”走。直线初值穿过障碍时它们会卡住,这时需要 14.2 节的采样规划器给出初值,或者多起点重启;顺带介绍不用梯度的 STOMP(FIG 6)。

    2直觉:推一个航点,整条轨迹该怎么动?

    设想优化进行到一半,只有一个航点 \(\mathbf q_k\) 碰到了障碍物,障碍代价的梯度 \(\mathbf g\) 只在这个航点上非零。普通梯度下降会只把这一个航点推开,轨迹上出现一个尖刺:障碍代价降了,平滑代价却猛增,下一步平滑项又把尖刺拉回去,两者来回拉扯,所以 6.13 节的梯度下降那么慢。

    CHOMP 的回答是:步长不该在欧氏度量 \(\|\boldsymbol\delta\|^2\) 下最短,而该在平滑度量 \(\boldsymbol\delta^\top A\boldsymbol\delta\) 下最短,\(A=K^\top K\) 是有限差分矩阵(6.13 节)。在“一阶下降量相同”的条件下,平滑代价增加最少的步长恰好是 \(\boldsymbol\delta\propto\hl{Ainv}{A^{-1}}\mathbf g\)(第 6 节证明)。下图把这三种步长画在一起,三条曲线都被缩放到在第 \(k\) 个航点处位移相同(等于推力箭头),因而带来相同的一阶障碍代价下降,比较它们各自让平滑代价涨了多少。

    FIG 1度量决定一次推力怎样摊开
    灰色虚线是原轨迹:起点和终点(方块)固定,中间 \(n\) 个航点。蓝色箭头是作用在第 \(k\) 个航点上的推力 \(\mathbf g\)(拖动箭头尖端改变它)。红色:欧氏步长,只动第 \(k\) 个航点。琥珀色:\(A_v^{-1}\mathbf g\),\(A_v\) 是速度(一阶差分)度量,形状是一顶“帐篷”。紫色:\(A_a^{-1}\mathbf g\),\(A_a\) 是加速度(二阶差分)度量,形状更圆、铺得更开。读数给出三者使速度平滑代价 \(\tfrac12\sum\|\mathbf q_{i+1}-\mathbf q_i\|^2\) 增加了多少,以及欧氏步长与 \(A_v^{-1}\) 步长之比。
    试一试
    • 把推力移到正中间的航点:比值达到最大值 \((n+1)/2\)(默认 19 个航点时恰好是 10)。
    • 把推力移到紧挨起点或终点的航点:比值跌到 2 以下。帐篷没有地方摊开,因为一端被固定住了。
    核心洞见

    \(A^{-1}\) 是一个“推力扩散器”:它把局部的力变成整条轨迹的光滑形变,同时保持两端不动。欧氏步长与它的平滑代价之比在中点处是 \((n+1)/2\),随航点数线性增长:航点越密,普通梯度越吃亏,这正是 6.13 节说的条件数约为 \(N^2\) 的另一面。代价是每步要解一个带状线性方程,但三对角系统只要 \(O(n)\)。

    3动手:CHOMP 在 2 连杆机械臂上

    现在把机器人的身体放进来。CHOMP 不直接计算“连杆和障碍物有多近”,而是把身体近似成一组球:每根连杆上取若干个点 \(\hl{body}{u\in\mathcal B}\),每个点带一个半径(这里取连杆的半径 0.07)。点 \(u\) 在构型 \(\mathbf q\) 下的工作空间位置是 \(\mathbf x_u(\mathbf q)\)(正运动学),它到障碍物表面的距离直接从环境的 SDF 里查(12.2 节),减去球的半径就是这个球的间隙 \(d\)。间隙小于余量 \(\varepsilon\) 时付出代价 \(\hl{eps}{c(d)}\),它的梯度沿 SDF 梯度方向把球推开,再经过雅可比转置 \(J_u^\top\) 变成关节空间的力。

    下图左边是工作空间:红色圆盘是障碍物(可拖动),红色虚线圈是余量 \(\varepsilon\),绿色是起始姿态,蓝色是目标姿态,淡色是中间 19 个航点的姿态,青色小圆是 CHOMP 看到的身体球。右边是同一条轨迹在关节空间(构型空间,7.2 节)里的样子:红色区域是会碰撞的构型。初值是关节空间里的直线,它让第二根连杆扫过障碍物。按“运行”,每一步都是完整的 CHOMP 更新:\(\xi\leftarrow\xi-\tfrac1\eta A^{-1}(\nabla F_{\rm obs}+\lambda\nabla F_{\rm smooth})\)。

    FIG 2CHOMP:身体球、SDF 代价与协变梯度
    左:工作空间。琥珀色曲线是末端走过的路径,姿态发生碰撞的航点画成红色。右:关节空间 \((q_1,q_2)\),琥珀色折线是当前轨迹,灰色虚线是初值,绿点是起点,蓝点是终点。读数里“间隙(连杆)”是把连杆当成胶囊体、在相邻航点之间各插 12 个构型做的精确检查;“间隙(球)”是 CHOMP 自己看到的球的最小间隙。迭代以每秒 25 步的固定速率进行,最大步长小于 \(10^{-5}\) rad 时视为收敛。
    • 保持默认设置按“运行”:约 140 步后收敛,连杆的间隙变成正数,轨迹在关节空间里从红色带子的下端绕了过去。
    • 把余量 \(\varepsilon\) 调到 0.05,按“重置”再运行到收敛:CHOMP 停下了,但连杆仍然插在障碍物里约 0.07。
    值得注意的细节

    (1) 障碍项是代价,不是约束。代价 \(c(d)\) 在障碍物内部的斜率只有 1,它和平滑项的拉力平衡时,轨迹可以停在碰撞里(第二个任务);把 \(\lambda\) 调到 1 也会这样:从同一初值出发只走 6 步就停住,间隙约 −0.24。CHOMP 不保证无碰撞,结果必须再用精确的碰撞检查验收。 (2) 球是近似:每根连杆只取 1 或 2 个球时,收敛后用胶囊体检查,间隙会略低于零(约 −0.006 和 −0.005),因为两个球之间的连杆段没有被“看到”。 (3) 拖动障碍物后接着运行,优化从当前轨迹出发(热启动),通常几十步就能重新绕开。

    为什么障碍代价要乘速度:别让优化器“加速冲过”

    最朴素的写法是把每个航点的障碍代价加起来:\(\sum_t c(\mathbf x_t)\)。问题在于,航点只是时间上的采样,代价衡量的却是“在障碍附近停留了多少个采样”。优化器很快会发现一个漏洞:只要让航点在障碍区里排得稀一点(等价于让机器人在那里跑得快一点),代价就降了,而机器人走过的几何路径一点没变。CHOMP 的解决办法是按弧长积分:\(\int c(\mathbf x(t))\,\hl{arc}{\|\dot{\mathbf x}(t)\|}\,dt=\int c\,ds\),这个积分与轨迹怎样参数化无关,航点疏密不再影响代价。它的泛函梯度只保留垂直于运动方向的分量,再加一个曲率项(第 6 节)。

    下图用一个点机器人看这个漏洞。红色的竖带是一片代价区(比如贴近桌边的余量区),从左到右的任何路径都必须穿过它,所以代价只能被重新分配,无法消除。上面一条用朴素代价,下面一条用 CHOMP 的弧长代价,其余完全相同(都用 \(A^{-1}\) 预条件,同样的 \(\lambda\))。

    FIG 3朴素代价会“冲过”代价区,弧长代价不会
    红色竖带是代价区(拖动顶部的圆圈可平移,宽度用滑块调),虚线是它外侧余量 \(\varepsilon=0.3\) 的边界。上(琥珀色):朴素代价 \(\sum_t c(\mathbf x_t)\),乘上直线初值的平均速度,使两条的初始代价相近。下(蓝色):CHOMP 的弧长代价。每条 15 个可动航点,起点终点固定。读数给出每条轨迹落在代价区里的航点数和最长的一段步长(初值的步长是 0.33)。每次运行从直线初值开始,以固定速率迭代到收敛。
    • 先用默认 \(\lambda=0.1\) 运行:朴素的一条只剩 2 个航点在带内,蓝色一条仍是 3 个(与初值相同)。再把 \(\lambda\) 降到 0.01 并运行:琥珀色轨迹一个航点也不在带内了,逐点检查会以为它根本没碰到代价区,可路径照样横穿过去。

    4另一条路:TrajOpt 把避障当成约束

    FIG 2 的第二个任务暴露了 CHOMP 的软肋:障碍项只是代价,和平滑项打平手时就停在碰撞里。TrajOpt(Schulman 等,2013/2014)换了一个提法:平滑度是目标,避障是约束,即对每个航点(或每段)、每根连杆、每个障碍物要求带符号距离 \(\mathrm{sd}\ge d_{\rm safe}\)。约束是非凸的,所以它做序列凸规划:

    1. 凸化:在当前轨迹 \(\bar\theta\) 处,把每个带符号距离线性化:\(\mathrm{sd}(\theta)\approx\mathrm{sd}(\bar\theta)+\hat{\mathbf n}^\top J_{\mathbf p}(\bar\theta)(\theta-\bar\theta)\),\(\mathbf p\) 是连杆上离障碍物最近的点,\(\hat{\mathbf n}\) 是从障碍物指向它的单位法向量。在关节空间里,这就是每个航点上的一个半平面。
    2. 精确罚函数:约束写进目标,变成 \(\mu\sum|d_{\rm safe}-\mathrm{sd}|^+\)(\(|x|^+=\max(x,0)\))。这是 6.7 节罚函数的 \(\ell_1\) 版本:只要 \(\mu\) 大于最大的拉格朗日乘子,它的最小点就恰好满足约束,不需要像二次罚函数那样让 \(\mu\to\infty\)。引入松弛变量后,子问题是一个凸 QP。
    3. 信赖域:线性化只在 \(\bar\theta\) 附近可信,所以给每个变量加一个盒子 \(|\theta-\bar\theta|\le\hl{trust}{\Delta}\)。解完 QP 后比较“模型预测的下降”与“真实罚函数的下降”,比值 \(\rho\) 大于阈值就接受并放大盒子,否则拒绝、缩小盒子,在同一个线性化上再解一次。本页用 TrajOpt 开源实现(sco 库)的默认值:阈值 0.25、放大 1.5 倍、缩小到 0.1 倍,初始盒子 0.1、初始 \(\mu=10\)。这是 6.5 节的信赖域逻辑,只是盒子代替了圆。
    4. 当这一轮停下来(盒子缩到不能再小,或模型预测的下降已小于 \(10^{-4}\))而约束仍不满足时,把 \(\mu\) 乘以 10 重来(最多 5 次)。
    FIG 4TrajOpt:一次一个 QP,看信赖域伸缩
    场景与 FIG 2 的默认场景相同(障碍物固定),19 个可动航点。右图:青色方框是最近一次 QP 所用的信赖域 \(\Delta\)(以当时的航点为中心);紫色短线是线性化约束 \(\mathrm{sd}+\mathbf g^\top(\mathbf q-\bar{\mathbf q}_k)=d_{\rm safe}\) 的边界,小刻度指向允许的一侧(扫掠模式下一个约束牵涉两个航点,每个航点上画的是固定另一个航点时的边界);虚线是这次 QP 给出的候选轨迹,被接受时为绿色,被拒绝时为红色;琥珀色是当前轨迹。左图中障碍物外的虚线圈是 \(d_{\rm safe}\) 余量。目标 \(f=\sum\|\mathbf q_{t+1}-\mathbf q_t\|^2\),\(\mu\) 初值 10,\(\Delta\) 初值 0.1 rad。“运行”以每秒 4 个 QP 的固定速率进行。
    • 保持“离散”碰撞检查并运行到结束:TrajOpt 报告完成,每个航点的间隙都 \(\ge d_{\rm safe}\),可读数里的“间隙(连续)”是负的:轨迹在两个航点之间穿过了障碍物(关节空间里跳过了那条细细的红带)。
    • 换成“扫掠”并运行:约束改为作用在每一段的扫掠体上,结果真正无碰撞,从红带的下端绕过去。
    • 在“扫掠”模式下按“重置”,再一次一个地按“单个 QP”:前 4 个 QP 都被接受,盒子每次放大 1.5 倍;第 5 个被拒绝(\(\rho\lt0.25\)),候选轨迹变红,盒子缩小到 0.1 倍。

    航点之间:扫掠体检查

    第一个任务里的“隧穿”是离散检查的通病(6.13 节的误区 2):两个航点都安全,不代表它们之间的运动安全。TrajOpt 的办法是对每一段、每根连杆,取它在 \(t\) 和 \(t+1\) 时刻两个形状的凸包 \(\hl{hull}{\mathrm{conv}(A(\theta_t)\cup A(\theta_{t+1}))}\),要求这个凸包到障碍物的带符号距离 \(\ge d_{\rm safe}\)。凸包与凸障碍物的距离用 GJK 算,穿透深度用 EPA 算;最近点 \(\mathbf p\) 落在凸包的一条边上,可写成两个时刻上的点的凸组合 \(\mathbf p=\alpha\mathbf p_0+(1-\alpha)\mathbf p_1\),于是线性化把梯度按 \(\alpha\) 和 \(1-\alpha\) 分给 \(\theta_t\) 和 \(\theta_{t+1}\)(第 6 节)。

    凸包只是扫掠体的近似。物体平移时两者完全一样;转动时,连杆末端走的是圆弧,圆弧会鼓出两端连线之外,而凸包只连到弦。下图让你亲手找出两种情况:离散检查漏掉而凸包抓住的,以及凸包也漏掉的。

    FIG 5离散检查、凸包与真实扫掠体
    两个相邻航点的姿态:绿色是 \(\theta_t\),蓝色是 \(\theta_{t+1}\),拖动各自的末端(解析逆运动学,保持肘部朝向)可以改变它们。琥珀色的淡色姿态是两者之间按关节线性插值的 40 个中间姿态,即真实的扫掠体;青色多边形是每根连杆在两个时刻的端点构成的凸包(画的是连杆中心线的凸包,计算距离时再减去连杆半径)。红色圆盘是障碍物(可拖动)。读数给出四种检查各自报告的带符号距离。
    • 把障碍物拖到两个姿态之间,让两个姿态本身都不碰它:离散检查报告安全,凸包和真实扫掠体都报告碰撞。
    • 让两个姿态之间转过一个大角度(比如把蓝色末端拖得离绿色很远),再把障碍物放在末端圆弧的中段、紧贴弧线外侧:凸包报告安全(正值),真实扫掠体却碰到了它。
    CHOMP 与 TrajOpt,一张对照表

    障碍物:CHOMP 是软代价(可以停在碰撞里),TrajOpt 是用精确罚函数处理的约束(\(\mu\) 足够大时严格满足)。 几何:CHOMP 要环境的 SDF 和身体的球近似,查表快、能在 GPU 上并行;TrajOpt 用凸体之间的带符号距离(GJK/EPA),能直接用网格和凸分解。 步长:CHOMP 是固定步长的预条件梯度步,便宜但需要调 \(\eta\);TrajOpt 每步解一个 QP,贵一些,但信赖域自动定步长,收敛所需的迭代少得多。 航点之间:CHOMP 靠足够密的航点;TrajOpt 可以加扫掠体约束。 共同点:都是局部方法,初值决定它们落进哪个“盆地”(FIG 6)。

    5局部极小:初值从哪里来

    在关节空间里看,一个小障碍物往往对应一条细长的红带(FIG 2、FIG 4 都是)。直线初值横穿红带时,CHOMP 和 TrajOpt 只能沿着垂直于红带的方向推,推不到红带的尽头;红带太长,它们就卡在带子里,或者停在“一半在左、一半在右”的位置。这不是步长或权重没调好,而是代价函数本身的形状:从直线出发,“往下坡走”到不了绕过红带的那个盆地。

    三种常见对策:(1) 用 14.2 节的 RRT 先找一条无碰撞路径,按弧长重采样成航点作为初值,优化器只负责把它修光滑(实际系统通常先做 14.2 节的捷径化;FIG 6 为了让你看清优化器做了什么,直接用未捷径化的 RRT 路径);(2) 多起点重启:在直线初值上叠加若干条光滑的随机扰动(从 \(\mathcal N(0,A^{-1})\) 采样,所以本身是光滑的),各跑一遍取最好的;(3) 换用基于采样的优化器 STOMP(Kalakrishnan 等,2011):每步生成若干条带光滑噪声的轨迹,按每个时间步的代价给它们加权平均,再用 \(A^{-1}\) 平滑更新,不需要梯度(6.11 节的 MPPI/CEM 思想用在轨迹上)。下图在一个直线初值会失败的场景里比较这些组合。

    FIG 6初值 × 求解器:谁能绕出去?
    右图(关节空间):灰色虚线是初值;选“RRT”时,青色淡线是 RRT 树,紫色是它找到的路径;选“8 次重启”时,紫色淡线是 8 条优化结果,其中无碰撞且代价最低的一条用琥珀色画出。琥珀色是最终轨迹。CHOMP 与 FIG 2 默认参数相同(最多 300 步),TrajOpt 与 FIG 4 相同(扫掠检查,\(d_{\rm safe}=0.05\)),STOMP 每步 20 条带噪声的轨迹、共 200 步。成功与否用连杆胶囊体的连续检查判断。
    • 初值选“直线”,三种求解器各试一次:全都收敛在碰撞里。
    • 初值换成“RRT”或“8 次重启”,用 CHOMP 或 TrajOpt 优化:得到无碰撞的光滑轨迹。按“新的随机种子”多试几次。
    分工

    采样式规划器擅长回答“哪一侧”(拓扑),优化器擅长回答“具体怎么走”(几何与平滑)。STOMP 用噪声探索,但噪声的幅度有限,它仍然是局部方法,跨不过红带。多起点重启是最朴素、也最容易并行的全局化手段:GPU 上的规划器(如 cuRobo)同时优化成百上千个初值。

    6再看数学

    提示:把鼠标悬停在公式中带底色的符号上,图中对应的元素会被高亮(FIG 1 的 A⁻¹ 步长、FIG 2 的轨迹、身体球和余量圈、FIG 3 的弧长轨迹、FIG 4 的信赖域盒子和线性化约束、FIG 5 的凸包)。

    CHOMP 的目标函数

    轨迹 \(\xi:[0,1]\to\mathcal C\) 把时间映到构型。CHOMP 最小化

    $$ \mathcal U[\xi]=\mathcal F_{\rm obs}[\xi]+\lambda\,\mathcal F_{\rm smooth}[\xi],\qquad \mathcal F_{\rm smooth}=\frac12\int_0^1\Big\|\frac{d}{dt}\hl{xi}{\xi}(t)\Big\|^2dt $$ $$ \mathcal F_{\rm obs}=\int_0^1\!\!\int_{\hl{body}{\mathcal B}}c\big(\mathbf x_u(\xi(t))\big)\,\hl{arc}{\Big\|\frac{d}{dt}\mathbf x_u(\xi(t))\Big\|}\,du\,dt $$

    离散成 \(n\) 个内部航点、步长 \(\Delta t=1/(n+1)\),\(\mathcal F_{\rm smooth}=\frac1{2\Delta t}\sum\|\mathbf q_{i+1}-\mathbf q_i\|^2=\tfrac12\xi^\top A\xi+\mathbf b^\top\xi+\text{常数}\),\(A=\frac1{\Delta t}K^\top K\)(每个关节各一份三对角矩阵,\(\mathbf b\) 来自固定的两端)。障碍代价 \(c\) 作用在身体球的间隙 \(d=\mathrm{SDF}(\mathbf x_u)-r_u\) 上(CHOMP 原文的形式,在 \(d=0\) 与 \(d=\varepsilon\) 处一阶导数连续):

    $$ \hl{eps}{c(d)}=\begin{cases}-d+\tfrac12\varepsilon, & d\lt0\\[2pt] \dfrac{(d-\varepsilon)^2}{2\varepsilon}, & 0\le d\le\varepsilon\\[4pt] 0, & d\gt\varepsilon\end{cases}\qquad \nabla_{\mathbf x}c=c'(d)\,\nabla\mathrm{SDF}(\mathbf x),\quad c'(d)\in[-1,0] $$

    协变梯度步

    在当前轨迹 \(\xi_i\) 附近,取“线性化代价 + \(A\) 度量下的步长惩罚”的最小点(6.13 节已推导):

    $$ \xi_{i+1}=\arg\min_\xi\ \mathcal U[\xi_i]+\bar\nabla\mathcal U^\top(\xi-\xi_i)+\frac\eta2\|\xi-\xi_i\|_A^2=\xi_i-\frac1\eta\,\hl{Ainv}{A^{-1}}\bar\nabla\mathcal U[\xi_i] $$

    为什么它是“平滑代价最便宜”的方向(FIG 1):在 \(\mathbf g^\top\boldsymbol\delta=\gamma\) 的约束下最小化 \(\tfrac12\boldsymbol\delta^\top A\boldsymbol\delta\),拉格朗日条件(6.7 节)给出 \(A\boldsymbol\delta=\nu\mathbf g\),即 \(\boldsymbol\delta=\nu A^{-1}\mathbf g\),代价为 \(\gamma^2/(2\,\mathbf g^\top A^{-1}\mathbf g)\)。欧氏步长 \(\boldsymbol\delta\propto\mathbf g\) 的代价是 \(\gamma^2\,\mathbf g^\top A\mathbf g/(2\|\mathbf g\|^4)\)。当推力只在第 \(k\) 个航点上时,两者之比是 \(A_{kk}(A^{-1})_{kk}\);对速度度量 \(A_{kk}=2\),\((A^{-1})_{kk}=k(n+1-k)/(n+1)\)(三对角矩阵的格林函数,正是那顶“帐篷”),所以比值 \(=2k(n+1-k)/(n+1)\):中点处为 \((n+1)/2\),紧挨端点处为 \(2n/(n+1)\lt2\)。

    障碍项的泛函梯度:投影与曲率

    对弧长积分求泛函梯度(欧拉-拉格朗日方程),每个身体点贡献

    $$ \bar\nabla\mathcal F_{\rm obs}(t)=\int_{\mathcal B}J_u^\top\,\|\mathbf x_u'\|\Big[\big(I-\hat{\mathbf x}_u'\hat{\mathbf x}_u'^{\top}\big)\nabla c-c\,\boldsymbol\kappa\Big]du,\qquad \boldsymbol\kappa=\frac{1}{\|\mathbf x_u'\|^2}\big(I-\hat{\mathbf x}_u'\hat{\mathbf x}_u'^{\top}\big)\mathbf x_u'' $$

    \(\hat{\mathbf x}'\) 是工作空间里的单位速度方向,\(\boldsymbol\kappa\) 是路径的曲率向量。投影 \(I-\hat{\mathbf x}'\hat{\mathbf x}'^\top\) 去掉了沿运动方向的推力,所以航点不会被推着“顺路溜走”,这正是 FIG 3 蓝色一条航点间距保持均匀的原因;曲率项则在代价高的地方把弯道拉直。实现里 \(\mathbf x'\)、\(\mathbf x''\) 用相邻航点的中心差分计算。注意这个梯度是对连续泛函求的,再离散化,并不是离散代价的精确梯度,这在实践中无妨,但意味着 CHOMP 一般不配合线搜索使用。

    TrajOpt:罚函数 SQP

    原问题是 \(\min_\theta f(\theta)\) s.t. \(g_i(\theta)\le0\),\(h_j(\theta)=0\)(这里 \(g_i=d_{\rm safe}-\mathrm{sd}_i\),还可以加关节限位、末端位姿等)。TrajOpt 最小化 \(\ell_1\) 罚函数,并在每次迭代用它的凸近似:

    $$ \phi(\theta)=f(\theta)+\mu\sum_i|g_i(\theta)|^++\mu\sum_j|h_j(\theta)| $$ $$ \tilde\phi(\theta)=\tilde f(\theta)+\mu\sum_i\big|g_i(\bar\theta)+\nabla g_i^\top(\theta-\bar\theta)\big|^++\cdots,\qquad |\theta-\bar\theta|\le\hl{trust}{\Delta} $$ $$ \rho=\frac{\phi(\bar\theta)-\phi(\theta^{\rm new})}{\phi(\bar\theta)-\tilde\phi(\theta^{\rm new})}\qquad\begin{cases}\rho\gt0.25: & \text{accept},\ \Delta\leftarrow1.5\Delta\\ \text{else}: & \text{reject},\ \Delta\leftarrow0.1\Delta\end{cases}\qquad \text{converged but infeasible}:\ \mu\leftarrow10\mu $$

    \(\tilde f\) 是 \(f\) 的二次近似(本页的 \(f\) 本身就是二次的)。每个 \(|\cdot|^+\) 引入一个松弛变量 \(s_i\ge0\)、\(s_i\ge g_i(\bar\theta)+\nabla g_i^\top(\theta-\bar\theta)\),子问题就是一个凸 QP;本页用一个小型原始-对偶内点法求解。\(\ell_1\) 罚函数的“精确性”来自 KKT 条件(6.7 节):若 \(\theta^\star\) 是满足约束规范的局部最优解、乘子为 \(\lambda^\star\),则当 \(\mu\gt\max_i|\lambda_i^\star|\) 时 \(\theta^\star\) 也是 \(\phi\) 的局部极小点。FIG 4 里 \(\mu=10\) 已经足够,所以 \(\mu\) 从未被增大。

    带符号距离的线性化

    对两个凸体 \(A\)(机器人连杆)和 \(O\)(障碍物),设 \(\mathbf p_A\in A\)、\(\mathbf p_O\in O\) 是最近点对(穿透时是最小平移向量的两端),\(\hat{\mathbf n}\) 是从 \(\mathbf p_O\) 指向 \(\mathbf p_A\) 的单位向量(穿透时取反)。把 \(\mathbf p_A\) 看成固定在连杆上的点,它随关节的运动由雅可比 \(J_{\mathbf p_A}\) 给出,于是

    $$ \hl{lin}{\mathrm{sd}(\theta)\approx\mathrm{sd}(\bar\theta)+\hat{\mathbf n}^\top J_{\mathbf p_A}(\bar\theta)\,(\theta-\bar\theta)} $$ $$ \text{swept: }\ \mathbf p=\alpha\,\mathbf p_0+(1-\alpha)\,\mathbf p_1\ \Rightarrow\ \nabla_{\theta_t}\mathrm{sd}=\alpha\,J_{\mathbf p_0}(\theta_t)^\top\hat{\mathbf n},\ \ \nabla_{\theta_{t+1}}\mathrm{sd}=(1-\alpha)\,J_{\mathbf p_1}(\theta_{t+1})^\top\hat{\mathbf n} $$

    上面这一行是页面加载时现算的:在 FIG 4 的直线初值上,把离散和扫掠两种约束的解析梯度与中心有限差分逐项比较。这个公式在最近点对唯一时成立;当最近的特征切换(例如从连杆的一端换到另一端),\(\mathrm{sd}\) 只是分段光滑的,这也是信赖域必不可少的原因之一。

    STOMP 的更新

    每步采样 \(K\) 条噪声 \(\boldsymbol\epsilon_k\sim\mathcal N(0,\sigma^2R^{-1})\)(\(R\) 是加速度度量,所以噪声是光滑的),对每个时间步 \(i\) 计算代价 \(S_{k,i}\),再按 \(P_{k,i}\propto\exp\!\big(-h\,\frac{S_{k,i}-\min_kS_{k,i}}{\max_kS_{k,i}-\min_kS_{k,i}}\big)\) 加权:\(\delta\theta_i=\sum_kP_{k,i}\,\epsilon_{k,i}\),最后 \(\theta\leftarrow\theta+M\delta\theta\),\(M\) 是把每列最大值缩放到 \(1/n\) 的 \(R^{-1}\)。本页取 \(K=20\)、\(h=10\),\(S\) 为该时间步的障碍代价加一个小的加速度惩罚。

    从路径到轨迹:时间参数化

    本页所有结果都只是几何路径 \(\mathbf q(s)\),航点之间的“时间”只是编号。执行前还要选一个时间律 \(s(t)\),使速度 \(\mathbf q'(s)\dot s\) 和加速度 \(\mathbf q'(s)\ddot s+\mathbf q''(s)\dot s^2\) 不超过每个关节的限值。这是关于 \(s\) 的一维问题:在 \((s,\dot s)\) 相平面上,时间最优解是“能加速就全力加速、该减速就全力减速”的 bang-bang 曲线,TOPP-RA 用可达性分析把它变成一串小 LP,速度很快。另一条路是把时间(或动力学)直接放进优化变量(6.13 节的转录),代价是问题更大、更非凸。

    7机器人中的它

    真实系统里

    CHOMP(Ratliff、Zucker、Bagnell、Srinivasa,ICRA 2009;期刊版 Zucker 等,IJRR 2013)最早在 Barrett WAM 机械臂和 LittleDog 四足机器人上演示;名字里的 “Hamiltonian” 指它用哈密顿蒙特卡洛加随机扰动来跳出局部极小。MoveIt 自带 CHOMP 规划插件,平滑项可以分别加权速度、加速度和加加速度,环境距离场来自规划场景;它也可以作为 OMPL 之后的后处理器,正是 FIG 6 的“采样初值 + 优化”。 STOMP 同样有 MoveIt 插件,适合代价不可导的情形(例如来自网络或仿真器的代价)。 TrajOpt(Schulman 等,RSS 2013;IJRR 2014)的实验包括 PR2 的手臂与全身规划;ROS-Industrial 的 Tesseract 框架把它与 OMPL、Descartes 一起作为面向工业机器人的运动规划器。 距离与碰撞:FCL、Bullet 提供 GJK/EPA 和连续碰撞检查;体素距离场来自 Voxblox、nvblox 一类建图系统(12.2 节)。 GPU 与多起点:NVIDIA 的 cuRobo 把机器人近似成一组球,在 GPU 上从大量初值并行地做粒子式优化加 L-BFGS 梯度优化,并惩罚加速度和加加速度,这是 FIG 6 “多起点”的工业版。 相关方法:GPMP2 把轨迹看成高斯过程、用因子图求解;Drake 的 KinematicTrajectoryOptimization 用 B 样条参数化路径和时间;Toussaint 的 KOMO 用 k 阶马尔可夫结构的牛顿法,也是 14.4 节 LGP 的底层求解器。 时间参数化:MoveIt 提供迭代抛物线、迭代样条和 TOTG(Kunz & Stilman 2012)等时间参数化方法,TOPP-RA 也有开源实现。

    在整个系统里的位置:机械臂的典型流水线是“感知建图(距离场或网格)→ 采样规划器(OMPL)给出路径 → CHOMP / TrajOpt / STOMP 修光滑并留余量 → 时间参数化 → 关节控制器跟踪”。移动机器人和无人机则常把轨迹优化放进滚动时域:每个控制周期在局部距离场上重新优化一小段(13.4 节的 MPC 就是这种思路加上动力学),地图的表示方式见 15.3 节。任务与运动规划(14.4 节)则在更上层决定“先抓哪个、放在哪里”,再把每一段交给本节的方法。

    8常见误区

    误区 1:以为优化器会自己找到绕行的一侧

    FIG 6 里,从直线出发的 CHOMP、TrajOpt 和 STOMP 都卡住了。关节空间里一个小障碍物可以是一条横跨大半个空间的细带,局部方法只会垂直于带子推。调大权重或步长不解决问题,只会让轨迹在带子两侧来回跳。正确做法是用采样规划器给初值、多起点重启,或者在更高层(TAMP)先决定拓扑。

    误区 2:优化器说“完成”就当作无碰撞

    CHOMP 的障碍项是软的(FIG 2 的 \(\varepsilon=0.05\) 时收敛在碰撞里);离散约束的 TrajOpt 会在航点之间隧穿(FIG 4);连扫掠约束也只是凸包近似,转动时会少算圆弧鼓出的部分(FIG 5):在 FIG 4 里把 \(d_{\rm safe}\) 设为 0,扫掠版的结果仍有约 0.003 的穿透。所以永远要留一个正的 \(d_{\rm safe}\),并在执行前用独立的、足够密的(或连续的)碰撞检查器复核一遍。

    误区 3:身体近似和距离场太粗

    CHOMP 和 cuRobo 一类方法的“机器人”就是一组球:球太少,球与球之间的缝隙对优化器不可见(FIG 2 每根连杆只取 1 或 2 个球时,胶囊体检查略低于零);球太大,又会把窄通道堵死。距离场的分辨率也一样:格子大于余量时,插值出来的距离和梯度会有明显误差(12.2 节的 FIG 6)。还别忘了机器人自身各部分之间的碰撞(自碰撞),它同样需要成对的距离项。

    误区 4:用二次罚函数,或者把 \(\mu\)、\(\lambda\) 当成“越大越好”

    二次罚函数 \(\mu\max(0,g)^2\) 的最小点总在约束之外(6.7 节),要 \(\mu\to\infty\) 才逼近可行,问题随之病态;\(\ell_1\) 罚函数在有限的 \(\mu\) 下就精确,这是 TrajOpt 选择它的原因。另一方面,平滑权重 \(\lambda\) 太大时 CHOMP 根本推不动轨迹(FIG 2 中 \(\lambda=1\) 停在 −0.24 的碰撞里),而固定步长的 CHOMP 还要求 \(\lambda/\eta\lt2\),否则平滑部分的更新本身就会发散。

    误区 5:把几何路径当成可执行的轨迹

    “平滑”的路径不等于满足速度、加速度和力矩限值的轨迹:执行前必须做时间参数化(第 6 节最后一小节),或者把时间和动力学放进优化。还有两个实现细节:连续旋转的关节要处理角度的周期性(\(-\pi\) 与 \(\pi\) 是同一个角度,直线插值可能绕远路);关节限位要作为约束(TrajOpt)或通过把越界部分沿 \(A^{-1}\) 平滑投影回来(CHOMP 的做法)处理,而不是在每一步之后简单截断,截断会在轨迹上留下尖角。

    9小练习

    1. 39 个内部航点、两端固定,用速度度量 \(A=K^\top K\)。障碍梯度只作用在第 20 个(正中间)航点上。与欧氏梯度步相比,在一阶下降量相同时,\(A^{-1}\) 步长增加的平滑代价是它的几分之一?
    比值是 \(A_{kk}(A^{-1})_{kk}=2k(n+1-k)/(n+1)\)。\(n=39\)、\(k=20\) 时为 \(2\cdot20\cdot20/40=20\),即 \((n+1)/2\)。所以选项 C。航点越多,这个比值越大,普通梯度越吃亏。
    2. 把 CHOMP 障碍项里的 \(\|\dot{\mathbf x}\|\) 去掉(只对航点求和),最可能出现什么?
    选项 B。没有 \(\|\dot{\mathbf x}\|\) 时代价数的是“在障碍附近停留的采样数”,而不是“经过的路程”,梯度里沿运动方向的分量会把航点推出代价区的两侧(FIG 3:\(\lambda=0.01\) 时琥珀色一条在带内一个航点都不剩)。弧长积分与参数化无关,投影 \(I-\hat{\mathbf x}'\hat{\mathbf x}'^\top\) 去掉了沿路的推力。
    3. TrajOpt 某次 QP 的模型预测罚函数会下降 0.40,真实罚函数却上升了 0.20(\(\rho=-0.5\))。接下来会发生什么?
    选项 A。\(\rho\lt0.25\) 说明线性化在这么大的盒子里已经不可信(FIG 4 第三个任务里第 5 个 QP 就是这样)。缩小盒子后线性化更准,迟早会被接受。\(\mu\) 只在内层收敛后约束仍不满足时才增大。
    4. TrajOpt 返回的轨迹每个航点都离障碍物至少 \(d_{\rm safe}\),执行时机械臂却撞到了一根细杆。最可能的原因和对策是?
    选项 D。约束本身已经满足,问题在于约束“看不到”航点之间的运动(FIG 4 离散模式:所有航点都 \(\ge d_{\rm safe}\),连续检查却是负的)。凸包扫掠约束能抓住它;对转动造成的圆弧鼓出,再留一点余量(FIG 5)。
    5. 在约束最优点,避障约束的拉格朗日乘子最大为 \(\lambda^\star_{\max}=3.2\)。TrajOpt 的 \(\ell_1\) 罚系数 \(\mu\) 至少要多大,罚函数的局部极小点才与约束最优解重合?
    选项 B。这是 \(\ell_1\) 罚函数的“精确性”:乘子衡量“放松约束一点点,目标能下降多少”(6.7 节的影子价格),罚系数只要比它大,违反约束就不划算。二次罚函数则需要 \(\mu\to\infty\),所以选项 A 描述的是二次罚函数。

    10延伸阅读

    • N. Ratliff, M. Zucker, J. A. Bagnell & S. Srinivasa, CHOMP: Gradient Optimization Techniques for Efficient Motion Planning, ICRA 2009 — CHOMP 的原始论文:协变梯度与身体点上的障碍代价
    • M. Zucker, N. Ratliff, A. Dragan, M. Pivtoraiko, M. Klingensmith, C. Dellin, J. A. Bagnell & S. Srinivasa, CHOMP: Covariant Hamiltonian Optimization for Motion Planning, International Journal of Robotics Research, 2013 — 期刊版:弧长代价、泛函梯度的推导、约束与哈密顿蒙特卡洛
    • J. Schulman, J. Ho, A. Lee, I. Awwal, H. Bradlow & P. Abbeel, Finding Locally Optimal, Collision-Free Trajectories with Sequential Convex Optimization, RSS 2013 — TrajOpt 的会议版
    • J. Schulman, Y. Duan, J. Ho, A. Lee, I. Awwal, H. Bradlow, J. Pan, S. Patil, K. Goldberg & P. Abbeel, Motion Planning with Sequential Convex Optimization and Convex Collision Checking, International Journal of Robotics Research, 2014 — 罚函数 SQP、信赖域、带符号距离线性化与扫掠体碰撞检查
    • M. Kalakrishnan, S. Chitta, E. Theodorou, P. Pastor & S. Schaal, STOMP: Stochastic Trajectory Optimization for Motion Planning, ICRA 2011 — 不用梯度的采样式轨迹优化
    • M. Mukadam, J. Dong, X. Yan, F. Dellaert & B. Boots, Continuous-time Gaussian Process Motion Planning via Probabilistic Inference, International Journal of Robotics Research, 2018 — GPMP2:用高斯过程先验和因子图做轨迹优化
    • B. Sundaralingam et al., cuRobo: Parallelized Collision-Free Robot Motion Generation, ICRA 2023 — GPU 上的多起点轨迹优化
    • H. Pham & Q.-C. Pham, A New Approach to Time-Optimal Path Parameterization Based on Reachability Analysis, IEEE Transactions on Robotics, 2018 — TOPP-RA:路径的时间最优参数化
    • J. Nocedal & S. J. Wright, Numerical Optimization, 2nd ed., Springer, 2006, Ch. 17–18 — 罚函数、精确罚函数与 SQP