手写求导公式,让轨迹优化性能飞升,150ms变成9ms

摘要

本次更新为 AL-iLQR 求解器引入了完整的解析求导能力 ,覆盖动力学 Jacobian、所有代价函数的梯度/Hessian、以及全部约束(PolygonCollisionConstraint 除外)的 Jacobian。用户可通过 UI 界面实时切换数值差分与解析求导模式,便于对比验证。

性能提升

指标 数值差分(旧) 解析求导(新) 提升倍数
单次规划耗时 ~150 ms ~9.6 ms 15.6×

一、为什么快了这么多?

1.1 旧方案的瓶颈:中心差分的 O(n2)O(n^2)O(n2) 调用量

旧版对每个时间步的每个求导项都使用中心差分,以 n=4n=4n=4(状态维度)、m=2m=2m=2(控制维度)计算:

求导项 每步差分调用次数
A=∂f/∂xA = \partial f/\partial xA=∂f/∂x 2n=82n = 82n=8 次 NextState
B=∂f/∂uB = \partial f/\partial uB=∂f/∂u 2m=42m = 42m=4 次 NextState
ℓxx\ell_{xx}ℓxx(Hessian) 4n2=644n^2 = 644n2=64 次 StageCost
ℓuu\ell_{uu}ℓuu 4m2=164m^2 = 164m2=16 次 StageCost
ℓux\ell_{ux}ℓux(交叉项) 4nm=324nm = 324nm=32 次 StageCost
ℓx,ℓu\ell_x, \ell_uℓx,ℓu(梯度) 2(n+m)=122(n+m) = 122(n+m)=12 次 StageCost

每步合计 :12 次动力学 + 124 次代价函数(每次代价函数内部还会遍历所有约束的 Evaluate)。80 步时域下,每次 iLQR 迭代约需 10,000+ 次函数调用

1.2 新方案:零差分调用

解析求导直接通过闭式公式计算所有导数,无循环差分、无重复函数调用。特别是:

  • 代价 Hessian :从 4n2=644n^2 = 644n2=64 次函数调用 → 1 次矩阵外积运算
  • 约束 AL 项 :从隐式标量差分 → 显式 J⊤diag⁡(μ) JJ^\top \operatorname{diag}(\mu)\, JJ⊤diag(μ)J Gauss-Newton 近似
  • 动力学 Jacobian :从 12 次 NextState → 1 次三角函数计算

二、架构设计:可切换的求导模式

2.1 DerivativeMode 枚举

cpp 复制代码
enum class DerivativeMode {
  kFiniteDifference,   // 保留原有中心差分(兜底/对照)
  kAnalytical,         // 解析求导(新增)
};

ILQROptions 中新增 derivative_mode 字段,默认为 kFiniteDifference(向后兼容)。

2.2 三层可选接口

DynamicsModelCostFunctionConstraintFunction 三个基类中统一新增可选的解析求导虚方法:
动力学模型 --- DynamicsModel

cpp 复制代码
virtual bool HasAnalyticalJacobian() const { return false; }
virtual Matrix JacobianState(const Vector& state, const Vector& control, double dt) const;
virtual Matrix JacobianControl(const Vector& state, const Vector& control, double dt) const;

代价函数 --- CostFunction

cpp 复制代码
virtual bool HasAnalyticalDerivatives() const { return false; }
virtual CostExpansion AnalyticalStageCostExpansion(const Vector& state, const Vector& control) const;
virtual std::pair<Vector, Matrix> AnalyticalTerminalCostExpansion(const Vector& state) const;

约束函数 --- ConstraintFunction

cpp 复制代码
virtual bool HasAnalyticalJacobian() const { return false; }
virtual Matrix JacobianState(const Vector& state, const Vector& control) const;
virtual Matrix JacobianControl(const Vector& state, const Vector& control) const;

2.3 ILQRSolver 自动分派

ILQRSolver 在计算导数时检查 derivative_mode 和对应组件的 HasAnalytical*() 标志:

  • 若模式为 kAnalytical 组件支持解析求导 → 调用解析方法
  • 否则 → 回退到中心差分

这意味着即使某个约束(如 PolygonCollisionConstraint)没有实现解析 Jacobian,系统仍能正常工作------对该约束对应的 AL 代价项仍使用差分。

2.4 AL 罚项解析展开

AugmentedLagrangianKnotCost 直接利用约束的解析 Jacobian 组装 AL 项的梯度和 Hessian,避免了对标量 AL 代价的全维度差分:
不等式约束展开(Gauss-Newton 近似):

∂φ∂x=Jx⊤max⁡ ⁣(0,  λ+μ⊙c) \frac{\partial \varphi}{\partial x} = J_x^\top \max\!\bigl(0,\;\lambda + \mu \odot c\bigr) ∂x∂φ=Jx⊤max(0,λ+μ⊙c)
∂2φ∂x2≈Jx⊤diag⁡(Iactive⊙μ) Jx \frac{\partial^2 \varphi}{\partial x^2} \approx J_x^\top \operatorname{diag}(I_{\text{active}} \odot \mu)\, J_x ∂x2∂2φ≈Jx⊤diag(Iactive⊙μ)Jx

2.5 UI 实时切换

在 ImGui 前端的 Planning Config 面板中新增 Derivative Mode 下拉框,用户可实时在 Finite DifferenceAnalytical 之间切换,立即对比求解耗时和轨迹质量。

三、已实现解析求导的组件清单

组件 解析求导 说明
KinematicBicycleModel A, B sin/cos/tan 闭式
QuadraticCost 全部 二次型闭式
LaneTrackingCost 全部 外积分解
GuidanceTrackingCost 全部 含纵向投影终端
ControlRateCost 全部 仅控制量项
ControlBoxConstraint Jacobian 常数矩阵
SpeedLimitConstraint Jacobian 一个非零元素
RoadBoundaryConstraint Jacobian 参考线航向
CircularObstacleConstraint Jacobian 距离对位置的偏导
MultiCircleRoadBoundary Jacobian 刚体变换链式法则
MultiCircleVehicleObs Jacobian 刚体变换链式法则
LSEPolygonObstacle Jacobian softmax 梯度
TerminalGoalConstraint Jacobian 单位矩阵
PolygonCollisionConstraint 回退差分 GJK 距离不可微
相关推荐
renhongxia15 分钟前
WAIC 2026闭幕:机器人从跳舞变成拧螺丝
机器人
陕西企来客7 分钟前
生成式引擎优化(GEO)行业白皮书:从流量分配到认知占有的战略跃迁
人工智能·算法·机器学习·技术好geo优化
小园子的小菜9 分钟前
Java 并发编程:线程安全队列全解 —— 阻塞与非阻塞实现原理及源码深度剖析
java·开发语言
学无止境_永不停歇17 分钟前
9. 缓冲区
linux·服务器·c++
武子康18 分钟前
VLA 已经能输出动作,为什么机器人仍需要多时间尺度闭环
人工智能·机器人·agent
清泓y19 分钟前
深度学习算法
算法·ai·语言模型·面试
Y38153266229 分钟前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php
m沐沐39 分钟前
【深度学习】循环神经网络RNN——结构、原理与长期依赖问题解析
人工智能·pytorch·python·rnn·深度学习·算法·机器学习
Wang's Blog41 分钟前
Go-Zero项目开发38:深入限流器实现与应用
开发语言·golang·go-zero
古道青阳41 分钟前
Duilib 技术全景剖析
c++·windows