3. 数学基础回顾(下):优化理论基础

好,咱们接着聊。上一节我们把微积分和线性代数过了一遍,这一节要啃的,是轨迹优化的核心——优化理论。说白了,你给机器人规划一条路,本质上就是在解一个优化问题:在满足各种约束的前提下,找到一条代价最小的路径。

我个人习惯把优化问题拆成三块来看:目标函数(你要优化什么)、决策变量(你能调什么)、约束条件(你不能违反什么)。这三块搞清楚了,剩下的就是选算法的事了。

3.1 凸优化 vs 非凸优化

先问一个问题:为什么大家都喜欢凸优化?

答案很简单——凸优化有全局最优解。你想想看,一个凸函数就像一口锅,锅底就是全局最小值。不管你从哪个方向往下滚,最后都会滚到同一个锅底。这在工程上意味着什么?意味着你不需要担心算法陷入局部最优,可以放心大胆地用梯度下降这类简单方法。

那非凸优化呢?就像连绵起伏的山脉。你从不同的起点出发,可能掉进不同的山谷里。这些山谷都是局部最优解,但不一定是全局最优。我在做无人机避障轨迹规划时,就经常遇到这个问题——明明感觉路径已经挺好了,但换个初始值一算,发现还能更好。

凸优化的判定条件(我一般用这两个快速判断):
  • 函数形式:f(θx + (1-θ)y) ≤ θf(x) + (1-θ)f(y),对所有θ∈[0,1]成立
  • 二阶条件:Hessian矩阵半正定(∇²f(x) ⪰ 0)

实际项目中,我遇到的轨迹优化问题大部分是非凸的。为什么?因为约束条件太复杂了——障碍物避碰、动力学限制、执行器饱和……这些约束加进来,可行域往往不是凸集。但别慌,我们有办法处理。

我的经验之谈:遇到非凸问题,先别急着上高级算法。试试能不能把它松弛成凸问题。比如把非凸约束用凸集去近似,或者把目标函数换成凸函数。虽然会损失一点精度,但换来的是求解的稳定性和速度,这笔买卖在工程上往往划算。

3.2 代价函数与约束条件

代价函数,也叫目标函数,就是你想要最小化的东西。在轨迹优化里,常见的代价函数有这些:

代价类型 数学形式 物理含义
最小时间 ∫ dt 让机器人尽快到达终点
最小能量 ∫ ||u(t)||² dt 节省电池/燃料
最小加加速度 ∫ ||jerk(t)||² dt 让轨迹更平滑
最小跟踪误差 ∫ ||x(t) - x_ref(t)||² dt 精确跟踪参考轨迹

约束条件呢,分两类:等式约束不等式约束

  • 等式约束:h(x) = 0。比如机器人必须从起点出发,必须到达终点。
  • 不等式约束:g(x) ≤ 0。比如速度不能超过上限,不能进入障碍物区域。

嗯,这里要注意一点:约束条件不是越多越好。我曾经接手过一个项目,同事把能想到的约束全加进去了,结果求解器跑了一个小时还没收敛。后来我帮他删掉了几个冗余约束,求解时间降到了两分钟。约束越多,可行域越小,求解难度指数级上升。

避坑指南:我曾经在无人机轨迹规划中,把障碍物约束写成了等式约束(要求无人机恰好贴着障碍物边缘飞)。结果求解器死活找不到可行解。后来改成不等式约束(距离障碍物至少0.5米),问题瞬间解决了。记住:等式约束是铁律,不等式约束是弹性边界。能用不等式,就别用等式。

3.3 拉格朗日乘子法

拉格朗日乘子法,说白了就是把带约束的优化问题,变成无约束的优化问题。这个方法我几乎每天都在用,尤其是在处理动力学约束的时候。

先看最简单的形式——等式约束:

min f(x)
s.t. h(x) = 0

构造拉格朗日函数:

L(x, λ) = f(x) + λ · h(x)

然后对x和λ分别求导,令导数为0:

∂L/∂x = ∇f(x) + λ · ∇h(x) = 0
∂L/∂λ = h(x) = 0

解这个方程组,就得到了最优解。λ就是拉格朗日乘子,它的物理意义很直观——λ的大小反映了约束的"紧度"。如果λ=0,说明这个约束实际上没起作用;如果λ很大,说明这个约束在"用力"把解往可行域里拉。

对于不等式约束,情况稍微复杂一点,要用到KKT条件。我直接给结论:

min f(x)
s.t. g(x) ≤ 0

KKT条件:
1. ∇f(x) + μ · ∇g(x) = 0  (梯度条件)
2. g(x) ≤ 0                (原始可行)
3. μ ≥ 0                   (对偶可行)
4. μ · g(x) = 0            (互补松弛)

第四条互补松弛条件很有意思。它说:要么约束起作用(g(x)=0),要么乘子为0(μ=0)。不会出现两者都非零的情况。我在做轨迹优化时,经常用这个条件来判断哪些约束是"活跃的"——活跃的约束才是真正限制轨迹的因素。

实战技巧:在写代码实现时,我一般不会手动推导拉格朗日函数。而是用自动微分工具(比如CasADi或PyTorch)来自动计算梯度。但理解拉格朗日乘子法的原理很重要——它让你知道求解器在背后到底在干什么。当你遇到求解失败时,就能从原理层面去排查问题。

3.4 知识体系总览

为了让你对本章内容有个整体把握,我画了一张图:

优化理论基础 问题分类 凸优化 非凸优化 优化三要素 代价函数 决策变量 约束条件 求解方法 拉格朗日乘子法 KKT条件 核心思想:将约束优化转化为无约束优化 通过乘子衡量约束的"紧度" 💡 工程建议:优先尝试凸松弛,非凸问题用多起点+局部优化

这张图把优化理论的核心脉络理清楚了。你从中心出发,往左看是问题分类(凸 vs 非凸),往中间看是优化三要素(代价、变量、约束),往右看是求解方法(拉格朗日乘子法、KKT条件)。这三块是相互关联的——你选什么求解方法,取决于你的问题类型和三要素的具体形式。

好了,数学基础部分就到这里。这些工具在后面的章节中会反复用到,尤其是当我们开始讲具体的轨迹优化算法时——比如用拉格朗日乘子法处理动力学约束,用KKT条件判断约束的活跃性。到时候你会发现,今天花时间理解这些概念,绝对值。


公众号:蓝海资料掘金营,微信deep3321