想象这个画面:你是一位专车司机,刚接到一位端着满满咖啡杯的乘客。乘客急着赶飞机,却对你说:“师傅,咖啡一滴都不许洒。”你必须在红绿灯、限速牌、弯道的重重约束下,找到一条既快又稳的路线。这个“怎么开”的智慧——什么时候加速、什么时候收油、过弯走多大弧线——就是轨迹优化的日常版本。它不回答“去哪条路”,而回答“每一步怎么走”。 机器人世界里的轨迹优化,正是同一件事。规划出一条几何路径只是画好了地图,而轨迹优化要在这条地图上,给每一个瞬间配上合适的速度、加速度和转向,让机械臂高速作业时不抖不飘,让无人车变道时乘客不晕,让四足机器人跨障碍时不摔倒。它决定了机器人从“能走”到“走得好”的距离。
掌握轨迹优化,意味着你能让机器人在满足物理限制的前提下,变得更快、更稳、更省能。这是机器人控制算法工程师的核心竞争力,也是具身智能从实验室走向真实产品的关键一环。
可视化演示
展示轨迹优化中平滑与抖动对比、速度加速度约束边界及时间最优轨迹规划过程,支持模式切换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
轨迹平滑对比 未优化轨迹存在高jerk突变 优化后轨迹平滑减少冲击 min∫||jerk||²dt jerk最小化提升运动平稳性
轨迹优化基础
老司机接到一单生意,乘客说“走二环高架”,这就定下了一条“路径”。可真正考验师傅手艺的,是在高架上什么时候加速、弯道前何时收油、刹车踩多深。这些“怎么开”的细节,就是“轨迹”。同一个起点和终点,不同的开法,乘客的舒适度和到达时间截然不同。机器人世界也一样:路径是空间中的一条几何线——机械臂末端经过哪些位置;轨迹则在这条线上赋予了时间的节奏——每个时刻在哪里、速度多大、加速度多大。
轨迹可以看成一个随时间变化的位置函数。机械臂的轨迹由其每个关节的角度随时间的变化来描述;移动机器人的轨迹则用它在平面上的坐标随时间的变化来描述。我们可以把这个位置函数写成向量形式,每个分量代表一个自由度。
就像网约车的行程单一样,“走哪条路”只是地图,真正体现专业水准的是时间表上的速度曲线。有了这个随时间变化的位置函数,接下来才能给驾驶打分、设定限制、找出真正又稳又快的行车方案。轨迹优化,优化的就是这个“时间表”。
- 位置函数$q_i(t)$ 表示第 $i$ 个自由度在时刻 $t$ 的位置取值,比如某个关节的角度。
- 向量形式把 $n$ 个自由度排列成列向量 $q(t)$,一次性描述整个系统的状态。
- 时间区间$t \in [0, T]$ 表示轨迹从起始时刻 $0$ 持续到任务结束时刻 $T$。
数学建模
要交给算法一个清晰的任务,老司机得先把乘客的模糊需求翻译成具体指标:“快”是多快?“稳”是多稳?“不能压线”的边界在哪?把这些需求变成数学语言,就是建模。轨迹优化的建模,核心要回答三个问题:优化什么变量、用什么函数评价好坏、有哪些必须遵守的边界。
在数学上,决策变量通常是轨迹函数本身或其离散化表示,评价函数称为目标函数,边界条件称为约束。把它们放在一起,就形成了一个标准的优化问题:在所有满足约束的轨迹中,找到让目标函数值最小的那一个。
乘客把“稳”翻译成“加速度别超过某个值”,把“快”翻译成“总时间小于多少分钟”,导航系统就拿到了清晰的优化目标。建模的本质,就是把口头上的驾驶经验变成一台机器能计算的评分规则,让算法知道什么叫“好”。
- 最小化目标$\min_q$ 表示我们要在可行轨迹中挑选使代价 $J(q)$ 最小的那个轨迹。
- 代价函数$J(q)$ 把“快、省、稳”等诉求换算成一个可比较的数值。
- 不等式约束$g_i(q) \le 0$ 把安全距离、限速上限等表达为必须满足的临界值。
- 等式约束$h_j(q) = 0$ 表示起点位置、终点姿态这类必须完全相等的条件。
约束条件
开车上路,不是想怎么开就怎么开。限速牌告诉你速度上限,红绿灯告诉你何时必须停,车道线限制你的横向位置——这些都是行车的“边界条件”。轨迹优化同样有一组边界:关节角度不能超出机械限位,速度不能超过电机极限,末端执行器不能撞到障碍物。这些边界统称为约束。
约束主要分三类。运动学约束来自结构本身,比如关节角度范围、速度与加速度上限;动力学约束来自执行器的物理能力,比如电机最大扭矩、制动系统的热极限;安全约束则来自任务环境,比如避免碰撞、保持安全距离。它们共同划出了一块“可行域”,轨迹必须完全落在这块区域内。
约束就像电子地图中的禁行与限速信息。老司机必须尊重它们,规划出的路线不能在禁行区域里穿行,否则订单无法完成。有了约束,我们才能确保优化出来的轨迹是车辆真正跑得通的,而不是数学上好听、物理上做不到的“空中楼阁”。
- 速度极限$|\dot{q}(t)| \le v_{\max}$ 相当于路段的最高限速,任何时刻的移动速度都不能突破。
- 加速度极限$|\ddot{q}(t)| \le a_{\max}$ 是“油门和刹车”的幅度上限,防止速度变化过猛。
- 绝对值含义绝对值符号表示无论正向还是反向运动,都不能越过上下边界。
目标函数
同一条路,三位司机有三种开法:有人追求最快,大脚油门、急刹车;有人追求省油,缓缓滑行;有人追求平稳,乘客几乎感觉不到换挡。平台给司机发“评分表”,哪项权重高,司机就会往哪个方向优化。轨迹优化里的目标函数,就是这张可调节的“评分表”。
常见的评分项有三个:总时间、能量消耗、平滑性。总时间衡量任务完成得快不快;能量项代表执行器的输入做功,越小越省电;平滑性通常用加速度的变化率——也就是冲击——来衡量,冲击越小,动作越柔和。工程师通过调节权重,让算法在快、省、稳之间取得平衡。
平台如果收到很多“驾驶太猛”的投诉,就会调高平滑项的权重 $\gamma$;如果运营成本居高不下,就会调高能耗项的权重 $\beta$。轨迹优化的目标函数就是一张可以随时调参的评分表,引导算法生成符合期望的运动风格。
- 时间代价$T$ 是完成任务的时长,这一项越大代表轨迹越慢。
- 能量代价$\int_{0}^{T} \|u(t)\|^2 dt$ 是控制输入的平方积分,衡量执行器消耗的能量。
- 平滑代价$\int_{0}^{T} \|\dddot{q}(t)\|^2 dt$ 是冲击的平方积分,衡量动作的柔和程度。
- 权重向量$\alpha, \beta, \gamma$ 由工程师根据任务偏好设定,改变它们就改变了驾驶风格。
求解算法
有了评分表,老司机还得有试车的策略:先凭经验开一段,看看哪里转弯太急、哪里加速太晚,然后修正驾驶手法,一遍遍迭代直到接近理想状态。轨迹优化的求解算法,就是这样的“试车回路”。
常用的求解思路有三类。数值优化方法沿着梯度方向改进轨迹,每次迭代都让代价降低一点;凸优化近似把局部非凸问题转化为凸子问题,交给成熟的凸优化求解器处理;采样法在状态空间里撒点,连接出可行路径后再做平滑。实际工程中,这些方法常常配合使用。
老司机每次试车,方向盘的修正幅度会越来越小,刹车越来越顺,这就是“下降方向加合理步长”的迭代过程。当轨迹不再明显变化时,算法就找到了它眼中的“最优驾驶风格”——一个满足所有约束且代价最小的可行轨迹。
- 当前轨迹$q_k$ 是第 $k$ 轮迭代时的轨迹解。
- 改进方向$\Delta q_k$ 是由目标函数梯度和约束信息计算出的“下降方向”。
- 步长控制$\alpha_k$ 决定沿该方向前进多大步幅。
- 迭代更新$q_{k+1}$ 是经过一次修正后的新轨迹,反复更新直到收敛。
平滑性分析
真正的高手司机,副驾驶放一杯水,开完全程一滴不洒。秘诀不在平均速度,而在每次动作切换的过渡是否自然——速度不能突变,加速度也不能突变。机器人学中,这个“平顺程度”用连续性阶来描述:$C^0$ 连续表示位置不跳变,$C^1$ 连续表示速度不跳变,$C^2$ 连续表示加速度也不跳变。加速度一旦跳变,就会产生冲击,让机械臂振动、让乘客前仰后合。
为了构造这种平滑轨迹,工程师常用样条曲线——把轨迹切分成多个小段,每段用低阶多项式表示,再在拼接点处保证各阶导数连续。贝塞尔曲线就是最常用的基函数之一。
最稳的司机开的不是折线,而是所有过渡都浑然一体的流畅曲线。样条就是数学上画这条曲线的工具,让杯子里的水始终保持在杯沿之下。
- 组合系数$\binom{m}{i}$ 是二项式系数,控制第 $i$ 个基函数的权重大小。
- 幂次项$(1-t)^{m-i} t^i$ 决定曲线在不同参数区间上的插值形状。
- 局部区间$t \in [0,1]$ 表示每个样条段都在自己的局部参数区间内定义。
- 拼接效果多段多项式在节点处保持位置、速度、加速度连续,形成整体平滑的轨迹。
工程实践
理论上的“最优轨迹”再漂亮,也得能在真实路况中落地。老司机要实时看导航、绕开临时施工、迟到时重新选路。机器人量产产品里,轨迹优化的工程化同样要直面三个现实:计算时间有限、传感器存在噪声、环境时刻变化。
把轨迹优化放进完整的控制链路,通常是“感知 → 规划 → 轨迹优化 → 底层跟踪”的流水线。轨迹优化必须在规定的控制周期内算出结果,否则控制器就只能使用过期指令。同时,系统要对噪声和扰动保持鲁棒——传感器给的位置有偏差时,优化出的轨迹不能剧烈抖动。实际设计中还有一个重要的时序预算:
有经验的师傅不会每次都从头规划完整路线,而是基于当前路况在局部快速修正一小段,既应对突发状况又不让整体路线变得僵硬。这正是轨迹优化在真实产品中的角色:在有限的计算预算内,持续输出满足物理极限的高质量运动指令。
- 规划时间$t_{\text{plan}}$ 是每周期重新运行轨迹优化所需的时间。
- 执行与通信时间$t_{\text{track}}$ 包括底层控制器计算和通信传输的耗时。
- 控制周期$t_{\text{cycle}}$ 是系统的控制节拍,如 1ms、10ms 或 100ms。
- 时序约束两者的总和必须不超过控制周期,系统才能在线稳定运行。
AI 应用场景
工业机械臂喷涂
阶段:轨迹生成与执行优化
解决的问题:传统人工示教的喷涂轨迹常有抖动和积料,手工调参耗时且依赖老师傅经验。轨迹优化把示教轨迹处理成平滑曲线,限制加速度与冲击,减少材料浪费和表面瑕疵,同时提升生产节拍。
具体案例:某汽车零部件喷涂产线引入轨迹优化后,在保持喷涂质量的前提下循环时间缩短 15%,废品率下降 8%。工程师通过调低目标函数中的平滑权重,在效率与品质之间找到了最佳平衡点。
自动驾驶平稳变道
阶段:决策规划与运动控制衔接层
解决的问题:路测中发现变道逻辑容易急打方向盘,乘客明显不适。轨迹优化在变道过程中对横向加速度与曲率变化施加约束,让车辆在时间最优与乘坐舒适之间取得折中。
具体案例:某 L4 级自动驾驶轻客在高速公路变道场景中加入时间—平滑复合代价函数后,实测乘客晕车指数下降 30%,方向盘修正次数减少 40%。
四足机器人动态步态
阶段:步态生成与足端轨迹规划
解决的问题:四足机器人摆动腿时如果速度突变,容易导致机身晃动甚至摔倒。轨迹优化对摆动腿施加行程约束和冲击代价,使足端轨迹更平滑,提高动态行走的稳定性。
具体案例:实验室中利用优化后的摆腿轨迹,四足机器人上下斜坡时机身姿态震荡幅度显著减小,足端跟踪精度提升约 40%,为后续的跑跳动作打下基础。
Python 演示
# 使用 Catmull-Rom 样条平滑原始折线轨迹, 比较冲击度下降import numpy as np def catmull_rom(p0, p1, p2, p3, n=20): t = np.linspace(0.0, 1.0, n).reshape(-1, 1) t2 = t * t t3 = t2 * t return 0.5 * ( 2.0 * p1 + (-p0 + p2) * t + (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t2 + (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3 ) def build_trajectory(waypoints, n=50): pts = [] for i in range(len(waypoints) - 1): p0 = waypoints[max(i - 1, 0)] p1 = waypoints[i] p2 = waypoints[i + 1] p3 = waypoints[min(i + 2, len(waypoints) - 1)] frag = catmull_rom(p0, p1, p2, p3, n) if i < len(waypoints) - 2: frag = frag[:-1] pts.append(frag) return np.vstack(pts) def line_trajectory(waypoints, n=200): t = np.linspace(0.0, 1.0, n).reshape(-1, 1) pts = [] for i in range(len(waypoints) - 1): p0 = waypoints[i].reshape(2, 1) p1 = waypoints[i + 1].reshape(2, 1) pts.append((p0 + (p1 - p0) * t).T) return np.vstack(pts) def total_jerk(pts, dt=0.01): vel = np.diff(pts, axis=0) / dt acc = np.diff(vel, axis=0) / dt jerk = np.diff(acc, axis=0) / dt return float(np.sum(jerk ** 2)) def main(): waypoints = np.array([ [0.0, 0.0], [1.0, 1.0], [2.0, 0.5], [3.0, 1.5] ]) raw = line_trajectory(waypoints) smooth = build_trajectory(waypoints, n=100) jerk_raw = total_jerk(raw) jerk_smooth = total_jerk(smooth) print(f"原始折线轨迹冲击: {jerk_raw:.2f}") print(f"优化后轨迹冲击: {jerk_smooth:.2f}") print(f"冲击降低: {100.0 * (1.0 - jerk_smooth / max(jerk_raw, 1e-8)):.1f}%") if __name__ == "__main__": main()
smooth = build_trajectory(waypoints, n=100)用样条在路点之间构造高密度平滑轨迹raw = line_trajectory(waypoints)构造未经优化的直线折线轨迹作为对照组jerk_raw = total_jerk(raw)计算原始轨迹的冲击度,折点处会产生极大冲击jerk_smooth = total_jerk(smooth)计算优化后轨迹的冲击度,反映平滑效果print()输出两者对比,让优化收益一目了然
常见误区
误区路径规划完成之后就大功告成了,只要选了一条短路径,机器人就能又快又好地到达目标。
正解路径只回答“走哪条线”,不包含时间和速度信息。轨迹优化回答的是“这条线上怎么走”——何时加速、何时减速、加速度多大。一条很短的路径如果急转急停,反而比稍长但平滑的轨迹更慢更伤机器。规划出路径之后,轨迹优化才是决定实际表现的关键环节。
为何常见:入门教材往往把“找路径”作为重点,让人误以为“找到路”就是“走好路”,忽略了运动执行层面的时间参数。
误区为了安全,把所有限制都塞进优化问题,障碍物每个面都设一条约束,算法肯定能给出万无一失的轨迹。
正解约束过多过密会让可行域急剧缩小,甚至变得无解;对弱相关的冗余约束,求解器还会花大量时间做无用功。工程实践通常辨识关键约束,并区分“硬约束”和“软约束”——硬约束必须满足,软约束尽量逼近。约束的本质是框定可行空间,而不是越多越好。
为何常见:直觉上“管得越严越安全”,但忽略了优化问题的数学复杂性——约束之间可能互相矛盾,导致无解或过度保守。
误区要想开得稳,就得把速度降下来,平滑和高效是天生的对手。
正解平滑的核心是让速度、加速度连续变化,而不是把速度压低。一个平滑的轨迹可以减少执行器振动和跟踪误差,在同样的时间预算下反而能达成更高的平均速度。许多机械臂节拍优化,正是靠平滑轨迹减少振荡,才在相同时间内安全地完成了更多动作。
为何常见:日常驾驶直觉里“慢才稳”,但精密控制中冲击会激发系统振动,反而限制了速度提升,这是两种不同的场景逻辑。
误区只要把轨迹优化写成一个优化问题,丢进求解器就能得到结果,凸优化是万能解药。
正解凸优化要求目标函数和约束满足凸性,而轨迹优化中常见的避障、单摆动力学、关节力矩限幅等都是强非凸的。实际工程中常用 SQP、内点法,或者把非凸约束在局部线性化,构造一系列凸子问题迭代逼近。凸优化是工具箱中的一件利器,但不是万能钥匙。
为何常见:教科书里凸优化有漂亮的收敛性质、容易理解,学生容易把它当成通用方法,忽视了现实问题的非凸性。
误区优化算法算出来的轨迹就是“最好的行程”,其他任何方案都不可能更好。
正解在非凸问题中,大多数算法只能收敛到局部最优解。不同的初始轨迹、不同的参数设置,可能得到完全不同的结果。工程实践通常用多个初值同时求解,或结合采样方法,挑选代价最低的候选解,得到的是“足够好”的解而非数学上的全局最优。
为何常见:把“优化”和“全局最优”画等号,盲信求解器输出,忽略了非凸优化对初值的高度敏感性。
面试题
Q1. 轨迹优化和路径规划最主要的区别是什么?
- A.轨迹优化只关心路径长度
- B.路径规划不考虑时间参数← 正确答案
- C.轨迹优化不考虑任何约束
- D.路径规划生成完整速度曲线
答案:B。路径规划回答“走哪条线”,只关心几何路径;轨迹优化则在路径上加入时间参数,调节速度、加速度并满足物理约束。A 把轨迹优化理解成路径求短,C 忽略约束,D 混淆了两者的职责。
Q2. 以下哪项属于轨迹优化中的决策变量?
- A.电机品牌与型号参数
- B.轨迹函数 q(t) 的离散点← 正确答案
- C.传感器的采样频率
- D.控制器的通信协议版本
答案:B。决策变量是被优化的对象,通常是轨迹函数本身或其离散化表示——一组随时间变化的位置点。电机型号、采样率和通信协议都是系统固定参数,不参与优化决策。
Q3. 下列哪些内容适合作为轨迹优化的硬约束?
- A.关节角度限位范围← 正确答案
- B.速度上限与加速度上限← 正确答案
- C.与障碍物的最小安全距离← 正确答案
- D.尽可能节约能量的偏好
答案:ABC。硬约束是“绝不违反”的边界条件,关节限位、速度上限、避障安全距离都属于此类。节能是一种软性偏好,适合放进目标函数里用权重调节,而不是做成硬约束。
Q4. 为什么把最小冲击(jerk)作为优化目标很常见?
- A.降低机械结构的振动与磨损← 正确答案
- B.提升乘客或物件的稳定性← 正确答案
- C.保证路径在几何上绝对最短
- D.方便底层控制器平滑跟踪← 正确答案
答案:ABD。冲击是加速度的变化率,冲击越小动作越柔和。这能降低振动磨损、提升舒适度,也让底层控制器更容易跟踪。路径长度是另一维度的指标,不能由冲击目标保证。
Q5. 关于凸优化近似方法的描述,正确的是?
- A.一定可以找到非凸问题的全局最优解
- B.将非凸约束线性化后迭代逼近原问题← 正确答案
- C.完全不需要给定初始轨迹
- D.每次迭代的结果完全一致且无差异
答案:B。轨迹优化常含非凸约束,常见做法是在当前解附近对非凸项做线性化,形成凸子问题求解,再迭代更新。全局最优只在凸问题中有保证,而且迭代通常需要合理初值,不同初值也会导致不同结果。
Q6. 样条曲线在轨迹平滑中的主要作用是什么?
- A.用低阶多项式分段拼接出连续曲线← 正确答案
- B.在节点处保证位置连续← 正确答案
- C.可构造 C2 连续的平滑轨迹← 正确答案
- D.自动消除所有动力学约束
答案:ABC。样条把轨迹切分为多段,每段用低阶多项式表示,在拼接点处保持位置乃至速度、加速度连续,是构造平滑轨迹的经典工具。样条只是参数化方式,不能替代动力学约束。
Q7. 单纯追求时间最优的轨迹通常会带来什么问题?
- A.时间越短一定耗费越大
- B.可能产生极大加速度造成冲击← 正确答案
- C.轨迹路径一定是最短的直线
- D.与平滑性之间不存在取舍
答案:B。最小化时间会让轨迹逼近速度与加速度极限,产生“猛冲猛停”的动作,带来冲击和机械磨损。所以工程中通常在时间项与平滑项之间加入权重,找到可接受的折中。
Q8. 关于实时轨迹优化,下列说法正确的是?
- A.计算时间可以不固定,慢一点也没事
- B.规划时间必须小于控制周期← 正确答案
- C.只需要在离线阶段执行一次即可
- D.实时优化不需要任何初始轨迹
答案:B。实时优化要求规划(或重规划)的计算时间小于控制周期,才能在线及时更新控制指令。离线算一次、随机耗时、不要初值都不符合实时系统的约束。
Q9. 以下哪些属于工程实践中常用的轨迹优化技巧?
- A.用多个初始轨迹求解候选方案← 正确答案
- B.将障碍物近似为凸包处理← 正确答案
- C.完全忽略动力学参数与限幅
- D.使用局部优化方法快速修正轨迹← 正确答案
答案:ABD。工程中常做多初值尝试、将非凸障碍物近似为凸包、用 TEB 等局部方法在线修正。忽略动力学参数会让优化结果脱离物理现实,导致轨迹不可执行。
Q10. 在非凸轨迹优化中,关于“局部最优”最准确的说法是?
- A.局部最优一定也是全局最优解
- B.不同初始值可能收敛到不同结果← 正确答案
- C.非凸问题中不存在局部最优
- D.任何算法都能自动跳出局部最优
答案:B。非凸优化的收敛点与初始值强相关,不同初值可能落入不同局部最优。工程上常用多初值并行求解、比较候选解来逼近更优答案,但无法保证一次收敛即全局最优。