GL Robotics
首页博客教程实践项目Motion Planning Simulator

关于我们

按照主题,分享学习心得。

快速链接

  • 博客
  • 教程
  • 关于我们

联系我们

公众号:哎嗨人生

邮箱:ahrs365@outlook.com

关注我的自媒体

小红书:哎嗨人
小红书:哎嗨人
微信公众号:哎嗨人生
公众号:哎嗨人生
视频号:ahrs365
视频号:ahrs365

© 2026 GL Robotics. 保留所有权利.

沪ICP备2022016268号-1

    al-ilqr-starter

    边学边跑代码

    AL-iLQR 轨迹优化入门项目

    配套代码实践
    1. 首页
    2. /
    3. 教程
    4. /
    5. 时空联合规划
    6. /
    7. AL-iLQR实践指南6:解析求导后求解耗时150ms降到9ms

    AL-iLQR实践指南6:解析求导后求解耗时150ms降到9ms

    时空联合规划
    预计阅读时间:14 分钟
    2026年4月12日

    将求导方式从数值差分,改进为解析求导后,al-ilqr求解耗时从150ms降低到9ms,提升惊人

    planningilqr时空联合规划

    日期:2026-04-12 | 类别:性能优化 · 核心架构升级

    摘要

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

    性能提升

    指标数值差分(旧)解析求导(新)提升倍数
    单次规划耗时~150 ms~9.6 ms15.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/∂x2n=82n = 82n=8 次 NextState
    B=∂f/∂uB = \partial f/\partial uB=∂f/∂u2m=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 枚举

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

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

    2.2 三层可选接口

    在 DynamicsModel、CostFunction、ConstraintFunction 三个基类中统一新增可选的解析求导虚方法: 动力学模型 — DynamicsModel:

    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:

    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:

    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 Difference 和 Analytical 之间切换,立即对比求解耗时和轨迹质量。

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

    组件解析求导说明
    KinematicBicycleModelA, Bsin/cos/tan 闭式
    QuadraticCost全部二次型闭式
    LaneTrackingCost全部外积分解
    GuidanceTrackingCost全部含纵向投影终端
    ControlRateCost全部仅控制量项
    ControlBoxConstraintJacobian常数矩阵
    SpeedLimitConstraintJacobian一个非零元素
    RoadBoundaryConstraintJacobian参考线航向
    CircularObstacleConstraintJacobian距离对位置的偏导
    MultiCircleRoadBoundaryJacobian刚体变换链式法则
    MultiCircleVehicleObsJacobian刚体变换链式法则
    LSEPolygonObstacleJacobiansoftmax 梯度
    TerminalGoalConstraintJacobian单位矩阵
    PolygonCollisionConstraint回退差分GJK 距离不可微

    3.1 动力学模型

    组件解析公式说明
    KinematicBicycleModelA (4×4), B (4×2)前向欧拉离散化后的 Jacobian,含 sin/cos/tan

    3.2 代价函数

    组件解析项说明
    QuadraticCostlx, lu, lxx, luu, lux二次型闭式解
    LaneTrackingCostlx, lu, lxx, luu, lux + 终端横向/航向/速度误差的外积分解
    GuidanceTrackingCostlx, lxx + 终端含纵向投影终端模式
    ControlRateCostlu, luu仅控制量差分项
    CompositeCostFunction聚合子项自动聚合所有子代价的解析展开

    3.3 约束函数

    组件Jacobian 维度说明
    ControlBoxConstraint(4×4), (4×2)常数矩阵 ±I
    SpeedLimitConstraint(2×4), (2×2)仅 v 分量非零
    TerminalGoalConstraint(n×n)单位矩阵
    RoadBoundaryConstraint(2×4), (2×2)依赖参考线航向 h
    CircularObstacleConstraint(1×4), (1×2)-2[dx, dy, 0, 0]
    MultiCircleRoadBoundaryConstraint(2k×4), (2k×2)含刚体变换 Jacobian
    MultiCircleVehicleObstacleConstraint(k×4), (k×2)距离对圆心 + 刚体变换链式法则
    LSEPolygonObstacleConstraint(k×4), (k×2)LSE softmax 梯度 + 刚体变换

    3.4 未实现解析求导的组件

    组件原因
    PolygonCollisionConstraint基于 GJK 的凸多边形精确距离在顶点/边切换处不可微

    该约束在 kAnalytical 模式下会自动回退到中心差分。


    四、代码变更文件清单

    新增文件

    文件用途
    src/dynamics/dynamics_model.cpp基类默认实现(抛异常兜底)
    src/cost/cost_function.cpp基类默认实现
    guide/derivative_architecture.md求导架构分析与公式推导文档

    修改文件

    接口层(新增虚方法):

    • include/dynamics/dynamics_model.hpp
    • include/cost/cost_function.hpp — 含新增 CostExpansion 结构体
    • include/constraints/constraint_function.hpp
    • include/ilqr/ilqr_solver.hpp — 新增 DerivativeMode 枚举

    动力学解析 Jacobian:

    • include/dynamics/kinematic_bicycle_model.hpp
    • src/dynamics/kinematic_bicycle_model.cpp

    代价函数解析求导:

    • include/cost/quadratic_cost.hpp / src/cost/quadratic_cost.cpp
    • include/cost/composite_cost_function.hpp / src/cost/composite_cost_function.cpp
    • include/autodrive/lane_tracking_cost.hpp / src/autodrive/lane_tracking_cost.cpp
    • include/autodrive/guidance_tracking_cost.hpp / src/autodrive/guidance_tracking_cost.cpp
    • include/autodrive/control_rate_cost.hpp / src/autodrive/control_rate_cost.cpp

    约束解析 Jacobian:

    • include/constraints/control_box_constraint.hpp / src/constraints/control_box_constraint.cpp
    • include/constraints/terminal_goal_constraint.hpp / src/constraints/terminal_goal_constraint.cpp
    • include/autodrive/speed_limit_constraint.hpp / src/autodrive/speed_limit_constraint.cpp
    • include/autodrive/road_boundary_constraint.hpp / src/autodrive/road_boundary_constraint.cpp
    • include/autodrive/circular_obstacle_constraint.hpp / src/autodrive/circular_obstacle_constraint.cpp
    • include/autodrive/multi_circle_road_boundary_constraint.hpp / src/autodrive/multi_circle_road_boundary_constraint.cpp
    • include/autodrive/multi_circle_vehicle_obstacle_constraint.hpp / src/autodrive/multi_circle_vehicle_obstacle_constraint.cpp
    • include/autodrive/lse_polygon_obstacle_constraint.hpp / src/autodrive/lse_polygon_obstacle_constraint.cpp
    • include/autodrive/convex_polygon.hpp / src/autodrive/convex_polygon.cpp — 新增 LogSumExpGradient

    AL 层解析展开:

    • include/al/augmented_lagrangian_cost.hpp / src/al/augmented_lagrangian_cost.cpp

    求解器分派逻辑:

    • src/ilqr/ilqr_solver.cpp

    场景配置与 UI:

    • include/autodrive/demo_scenario.hpp — StaticObstacleScenarioConfig 新增 derivative_mode
    • src/autodrive/demo_scenario.cpp — 传递到 solver_options
    • apps/rerun_imgui_frontend.cpp — Planning Config 面板新增 Derivative Mode 下拉框

    构建系统:

    • CMakeLists.txt — 新增 dynamics_model.cpp、cost_function.cpp

    五、解析求导公式推导

    以下对除 PolygonCollisionConstraint 外的所有组件给出解析导数公式。 状态定义 x=[px,  py,  θ,  v]⊤\mathbf{x} = [p_x,\; p_y,\; \theta,\; v]^\topx=[px​,py​,θ,v]⊤,控制定义 u=[a,  δ]⊤\mathbf{u} = [a,\; \delta]^\topu=[a,δ]⊤(加速度、前轮转角)。 参考线航向 hhh、原点 (ox,oy)(o_x, o_y)(ox​,oy​)、轮距 LLL。

    5.1 KinematicBicycleModel — Jacobian A, B

    动力学方程(前向欧拉):

    f0=px+Δt⋅vcos⁡θf1=py+Δt⋅vsin⁡θf2=θ+Δt⋅vtan⁡δLf3=v+Δt⋅a \begin{aligned} f_0 &= p_x + \Delta t \cdot v \cos\theta \\ f_1 &= p_y + \Delta t \cdot v \sin\theta \\ f_2 &= \theta + \Delta t \cdot \frac{v \tan\delta}{L} \\ f_3 &= v + \Delta t \cdot a \end{aligned} f0​f1​f2​f3​​=px​+Δt⋅vcosθ=py​+Δt⋅vsinθ=θ+Δt⋅Lvtanδ​=v+Δt⋅a​

    A=∂f∂xA = \dfrac{\partial f}{\partial x}A=∂x∂f​(4×44 \times 44×4):

    A=[10−Δt vsin⁡θΔtcos⁡θ01Δt vcos⁡θΔtsin⁡θ001Δttan⁡δL0001] A = \begin{bmatrix} 1 & 0 & -\Delta t\, v \sin\theta & \Delta t \cos\theta \\ 0 & 1 & \Delta t\, v \cos\theta & \Delta t \sin\theta \\ 0 & 0 & 1 & \dfrac{\Delta t \tan\delta}{L} \\ 0 & 0 & 0 & 1 \end{bmatrix} A=​1000​0100​−ΔtvsinθΔtvcosθ10​ΔtcosθΔtsinθLΔttanδ​1​​

    B=∂f∂uB = \dfrac{\partial f}{\partial u}B=∂u∂f​(4×24 \times 24×2):

    B=[00000Δt vLcos⁡2δΔt0] B = \begin{bmatrix} 0 & 0 \\ 0 & 0 \\ 0 & \dfrac{\Delta t\, v}{L \cos^2\delta} \\ \Delta t & 0 \end{bmatrix} B=​000Δt​00Lcos2δΔtv​0​​

    5.2 QuadraticCost

    Stage cost:

    ℓ=12(x−xr)⊤Q (x−xr)+12(u−ur)⊤R (u−ur) \ell = \tfrac{1}{2}(x - x_r)^\top Q\,(x - x_r) + \tfrac{1}{2}(u - u_r)^\top R\,(u - u_r) ℓ=21​(x−xr​)⊤Q(x−xr​)+21​(u−ur​)⊤R(u−ur​) ℓx=Q(x−xr),ℓu=R(u−ur),ℓxx=Q,ℓuu=R,ℓux=0 \ell_x = Q(x - x_r),\quad \ell_u = R(u - u_r),\quad \ell_{xx} = Q,\quad \ell_{uu} = R,\quad \ell_{ux} = 0 ℓx​=Q(x−xr​),ℓu​=R(u−ur​),ℓxx​=Q,ℓuu​=R,ℓux​=0

    Terminal cost:

    ℓf=12(x−xr)⊤Qf (x−xr) \ell_f = \tfrac{1}{2}(x - x_r)^\top Q_f\,(x - x_r) ℓf​=21​(x−xr​)⊤Qf​(x−xr​) ℓx=Qf(x−xr),ℓxx=Qf \ell_x = Q_f(x - x_r),\quad \ell_{xx} = Q_f ℓx​=Qf​(x−xr​),ℓxx​=Qf​

    5.3 LaneTrackingCost

    定义中间变量:

    elat=−sin⁡h⋅(px−ox)+cos⁡h⋅(py−oy)ehdg=θ−h(归一化到[−π,π])espd=v−vtarget \begin{aligned} e_{\text{lat}} &= -\sin h \cdot (p_x - o_x) + \cos h \cdot (p_y - o_y) \\ e_{\text{hdg}} &= \theta - h \quad (\text{归一化到} [-\pi,\pi]) \\ e_{\text{spd}} &= v - v_{\text{target}} \end{aligned} elat​ehdg​espd​​=−sinh⋅(px​−ox​)+cosh⋅(py​−oy​)=θ−h(归一化到[−π,π])=v−vtarget​​

    对状态的 Jacobian:

    ∂elat∂x=[−sin⁡hcos⁡h00],∂ehdg∂x=[0010],∂espd∂x=[0001] \frac{\partial e_{\text{lat}}}{\partial x} = \begin{bmatrix} -\sin h & \cos h & 0 & 0 \end{bmatrix}, \quad \frac{\partial e_{\text{hdg}}}{\partial x} = \begin{bmatrix} 0 & 0 & 1 & 0 \end{bmatrix}, \quad \frac{\partial e_{\text{spd}}}{\partial x} = \begin{bmatrix} 0 & 0 & 0 & 1 \end{bmatrix} ∂x∂elat​​=[−sinh​cosh​0​0​],∂x∂ehdg​​=[0​0​1​0​],∂x∂espd​​=[0​0​0​1​]

    Stage cost:

    ℓ=12wl elat2+12wh ehdg2+12ws espd2+12wa a2+12wδ δ2 \ell = \tfrac{1}{2} w_l\, e_{\text{lat}}^2 + \tfrac{1}{2} w_h\, e_{\text{hdg}}^2 + \tfrac{1}{2} w_s\, e_{\text{spd}}^2 + \tfrac{1}{2} w_a\, a^2 + \tfrac{1}{2} w_\delta\, \delta^2 ℓ=21​wl​elat2​+21​wh​ehdg2​+21​ws​espd2​+21​wa​a2+21​wδ​δ2 ℓx=wl elat∂elat∂x+wh ehdg∂ehdg∂x+ws espd∂espd∂x \ell_x = w_l\, e_{\text{lat}} \frac{\partial e_{\text{lat}}}{\partial x} + w_h\, e_{\text{hdg}} \frac{\partial e_{\text{hdg}}}{\partial x} + w_s\, e_{\text{spd}} \frac{\partial e_{\text{spd}}}{\partial x} ℓx​=wl​elat​∂x∂elat​​+wh​ehdg​∂x∂ehdg​​+ws​espd​∂x∂espd​​ ℓu=[wa awδ δ] \ell_u = \begin{bmatrix} w_a\, a \\ w_\delta\, \delta \end{bmatrix} ℓu​=[wa​awδ​δ​] ℓxx=wl(∂elat∂x)⊤∂elat∂x+wh(∂ehdg∂x)⊤∂ehdg∂x+ws(∂espd∂x)⊤∂espd∂x \ell_{xx} = w_l \left(\frac{\partial e_{\text{lat}}}{\partial x}\right)^\top \frac{\partial e_{\text{lat}}}{\partial x} + w_h \left(\frac{\partial e_{\text{hdg}}}{\partial x}\right)^\top \frac{\partial e_{\text{hdg}}}{\partial x} + w_s \left(\frac{\partial e_{\text{spd}}}{\partial x}\right)^\top \frac{\partial e_{\text{spd}}}{\partial x} ℓxx​=wl​(∂x∂elat​​)⊤∂x∂elat​​+wh​(∂x∂ehdg​​)⊤∂x∂ehdg​​+ws​(∂x∂espd​​)⊤∂x∂espd​​ ℓuu=diag⁡(wa,  wδ),ℓux=0 \ell_{uu} = \operatorname{diag}(w_a,\; w_\delta), \quad \ell_{ux} = 0 ℓuu​=diag(wa​,wδ​),ℓux​=0

    即 ℓxx\ell_{xx}ℓxx​ 为三个秩1矩阵之和(每个是外积加权)。

    Terminal cost: 增加纵向偏差项:

    elon=cos⁡h⋅(px−ox)+sin⁡h⋅(py−oy)−starget,∂elon∂x=[cos⁡hsin⁡h00] e_{\text{lon}} = \cos h \cdot (p_x - o_x) + \sin h \cdot (p_y - o_y) - s_{\text{target}}, \quad \frac{\partial e_{\text{lon}}}{\partial x} = \begin{bmatrix} \cos h & \sin h & 0 & 0 \end{bmatrix} elon​=cosh⋅(px​−ox​)+sinh⋅(py​−oy​)−starget​,∂x∂elon​​=[cosh​sinh​0​0​] ℓx=wltelon∂elon∂x+wlattelat∂elat∂x+whtehdg∂ehdg∂x+wstespd∂espd∂x \ell_x = w_{l}^t e_{\text{lon}} \frac{\partial e_{\text{lon}}}{\partial x} + w_{\text{lat}}^t e_{\text{lat}} \frac{\partial e_{\text{lat}}}{\partial x} + w_{h}^t e_{\text{hdg}} \frac{\partial e_{\text{hdg}}}{\partial x} + w_{s}^t e_{\text{spd}} \frac{\partial e_{\text{spd}}}{\partial x} ℓx​=wlt​elon​∂x∂elon​​+wlatt​elat​∂x∂elat​​+wht​ehdg​∂x∂ehdg​​+wst​espd​∂x∂espd​​ ℓxx=wlt(∂elon∂x)⊤∂elon∂x+wlatt(∂elat∂x)⊤∂elat∂x+wht(∂ehdg∂x)⊤∂ehdg∂x+wst(∂espd∂x)⊤∂espd∂x \ell_{xx} = w_{l}^t \left(\frac{\partial e_{\text{lon}}}{\partial x}\right)^\top \frac{\partial e_{\text{lon}}}{\partial x} + w_{\text{lat}}^t \left(\frac{\partial e_{\text{lat}}}{\partial x}\right)^\top \frac{\partial e_{\text{lat}}}{\partial x} + w_{h}^t \left(\frac{\partial e_{\text{hdg}}}{\partial x}\right)^\top \frac{\partial e_{\text{hdg}}}{\partial x} + w_{s}^t \left(\frac{\partial e_{\text{spd}}}{\partial x}\right)^\top \frac{\partial e_{\text{spd}}}{\partial x} ℓxx​=wlt​(∂x∂elon​​)⊤∂x∂elon​​+wlatt​(∂x∂elat​​)⊤∂x∂elat​​+wht​(∂x∂ehdg​​)⊤∂x∂ehdg​​+wst​(∂x∂espd​​)⊤∂x∂espd​​

    5.4 GuidanceTrackingCost

    Stage cost(非 terminal_mode):

    ℓ=12wp(Δx2+Δy2)+12wh ehdg2+12ws espd2 \ell = \tfrac{1}{2} w_p (\Delta x^2 + \Delta y^2) + \tfrac{1}{2} w_h\, e_{\text{hdg}}^2 + \tfrac{1}{2} w_s\, e_{\text{spd}}^2 ℓ=21​wp​(Δx2+Δy2)+21​wh​ehdg2​+21​ws​espd2​

    其中 Δx=px−rx\Delta x = p_x - r_xΔx=px​−rx​,Δy=py−ry\Delta y = p_y - r_yΔy=py​−ry​,ehdg=NormalizeAngle(θ−ryaw)e_{\text{hdg}} = \text{NormalizeAngle}(\theta - r_{\text{yaw}})ehdg​=NormalizeAngle(θ−ryaw​),espd=v−rspeede_{\text{spd}} = v - r_{\text{speed}}espd​=v−rspeed​。

    ℓx=[wpΔxwpΔywhehdgwsespd],ℓu=0,ℓxx=diag⁡(wp,  wp,  wh,  ws),ℓuu=0,ℓux=0 \ell_x = \begin{bmatrix} w_p \Delta x \\ w_p \Delta y \\ w_h e_{\text{hdg}} \\ w_s e_{\text{spd}} \end{bmatrix}, \quad \ell_u = \mathbf{0}, \quad \ell_{xx} = \operatorname{diag}(w_p,\; w_p,\; w_h,\; w_s), \quad \ell_{uu} = 0, \quad \ell_{ux} = 0 ℓx​=​wp​Δxwp​Δywh​ehdg​ws​espd​​​,ℓu​=0,ℓxx​=diag(wp​,wp​,wh​,ws​),ℓuu​=0,ℓux​=0

    Terminal cost(terminal_longitudinal_only 模式):

    elon=cos⁡h⋅(px−rx)+sin⁡h⋅(py−ry),∂elon∂x=[cos⁡hsin⁡h00] e_{\text{lon}} = \cos h \cdot (p_x - r_x) + \sin h \cdot (p_y - r_y), \quad \frac{\partial e_{\text{lon}}}{\partial x} = \begin{bmatrix} \cos h & \sin h & 0 & 0 \end{bmatrix} elon​=cosh⋅(px​−rx​)+sinh⋅(py​−ry​),∂x∂elon​​=[cosh​sinh​0​0​] ℓx=wp elon∂elon∂x,ℓxx=wp(∂elon∂x)⊤∂elon∂x \ell_x = w_p\, e_{\text{lon}} \frac{\partial e_{\text{lon}}}{\partial x}, \quad \ell_{xx} = w_p \left(\frac{\partial e_{\text{lon}}}{\partial x}\right)^\top \frac{\partial e_{\text{lon}}}{\partial x} ℓx​=wp​elon​∂x∂elon​​,ℓxx​=wp​(∂x∂elon​​)⊤∂x∂elon​​

    5.5 ControlRateCost

    ℓ=12wj(a−aprev)2+12wsr(δ−δprev)2 \ell = \tfrac{1}{2} w_j (a - a_{\text{prev}})^2 + \tfrac{1}{2} w_{sr} (\delta - \delta_{\text{prev}})^2 ℓ=21​wj​(a−aprev​)2+21​wsr​(δ−δprev​)2 ℓx=0,ℓu=[wj(a−aprev)wsr(δ−δprev)],ℓxx=0,ℓuu=diag⁡(wj,  wsr),ℓux=0 \ell_x = 0, \quad \ell_u = \begin{bmatrix} w_j(a - a_{\text{prev}}) \\ w_{sr}(\delta - \delta_{\text{prev}}) \end{bmatrix}, \quad \ell_{xx} = 0, \quad \ell_{uu} = \operatorname{diag}(w_j,\; w_{sr}), \quad \ell_{ux} = 0 ℓx​=0,ℓu​=[wj​(a−aprev​)wsr​(δ−δprev​)​],ℓxx​=0,ℓuu​=diag(wj​,wsr​),ℓux​=0

    5.6 ControlBoxConstraint — Jacobian

    c=[umin⁡−uu−umax⁡]∈R2m c = \begin{bmatrix} u_{\min} - u \\ u - u_{\max} \end{bmatrix} \in \mathbb{R}^{2m} c=[umin​−uu−umax​​]∈R2m ∂c∂x=02m×n,∂c∂u=[−ImIm] \frac{\partial c}{\partial x} = 0_{2m \times n}, \qquad \frac{\partial c}{\partial u} = \begin{bmatrix} -I_m \\ I_m \end{bmatrix} ∂x∂c​=02m×n​,∂u∂c​=[−Im​Im​​]

    5.7 SpeedLimitConstraint — Jacobian

    c=[vmin⁡−vv−vmax⁡]∈R2 c = \begin{bmatrix} v_{\min} - v \\ v - v_{\max} \end{bmatrix} \in \mathbb{R}^{2} c=[vmin​−vv−vmax​​]∈R2 ∂c∂x=[000−10001],∂c∂u=02×2 \frac{\partial c}{\partial x} = \begin{bmatrix} 0 & 0 & 0 & -1 \\ 0 & 0 & 0 & 1 \end{bmatrix}, \qquad \frac{\partial c}{\partial u} = 0_{2 \times 2} ∂x∂c​=[00​00​00​−11​],∂u∂c​=02×2​

    5.8 TerminalGoalConstraint — Jacobian

    c=x−xtarget∈Rn c = x - x_{\text{target}} \in \mathbb{R}^{n} c=x−xtarget​∈Rn ∂c∂x=In \frac{\partial c}{\partial x} = I_n ∂x∂c​=In​

    ∂c/∂u\partial c / \partial u∂c/∂u 不适用(终端无控制)。

    5.9 RoadBoundaryConstraint — Jacobian

    elat=−sin⁡h⋅(px−ox)+cos⁡h⋅(py−oy) e_{\text{lat}} = -\sin h \cdot (p_x - o_x) + \cos h \cdot (p_y - o_y) elat​=−sinh⋅(px​−ox​)+cosh⋅(py​−oy​) c=[dlb−elatelat−dub],∂elat∂x=[−sin⁡hcos⁡h00] c = \begin{bmatrix} d_{\text{lb}} - e_{\text{lat}} \\ e_{\text{lat}} - d_{\text{ub}} \end{bmatrix}, \qquad \frac{\partial e_{\text{lat}}}{\partial x} = \begin{bmatrix} -\sin h & \cos h & 0 & 0 \end{bmatrix} c=[dlb​−elat​elat​−dub​​],∂x∂elat​​=[−sinh​cosh​0​0​] ∂c∂x=[sin⁡h−cos⁡h00−sin⁡hcos⁡h00],∂c∂u=02×2 \frac{\partial c}{\partial x} = \begin{bmatrix} \sin h & -\cos h & 0 & 0 \\ -\sin h & \cos h & 0 & 0 \end{bmatrix}, \qquad \frac{\partial c}{\partial u} = 0_{2 \times 2} ∂x∂c​=[sinh−sinh​−coshcosh​00​00​],∂u∂c​=02×2​

    5.10 CircularObstacleConstraint — Jacobian

    Δx=px−cx,Δy=py−cy,c=r2−(Δx2+Δy2) \Delta x = p_x - c_x, \quad \Delta y = p_y - c_y, \quad c = r^2 - (\Delta x^2 + \Delta y^2) Δx=px​−cx​,Δy=py​−cy​,c=r2−(Δx2+Δy2) ∂c∂x=[−2Δx−2Δy00],∂c∂u=01×2 \frac{\partial c}{\partial x} = \begin{bmatrix} -2\Delta x & -2\Delta y & 0 & 0 \end{bmatrix}, \qquad \frac{\partial c}{\partial u} = 0_{1 \times 2} ∂x∂c​=[−2Δx​−2Δy​0​0​],∂u∂c​=01×2​

    5.11 MultiCircleRoadBoundaryConstraint — Jacobian

    车身覆盖圆 jjj 的体坐标偏移 (bxj,0)(b_{x_j}, 0)(bxj​​,0)(by=0b_y = 0by​=0,圆心在纵轴上)。 刚体变换及其 Jacobian(公共子式):

    pj=[px+cos⁡θ⋅bxjpy+sin⁡θ⋅bxj] \mathbf{p}_j = \begin{bmatrix} p_x + \cos\theta \cdot b_{x_j} \\ p_y + \sin\theta \cdot b_{x_j} \end{bmatrix} pj​=[px​+cosθ⋅bxj​​py​+sinθ⋅bxj​​​] ∂pj,x∂x=[10−sin⁡θ⋅bxj0],∂pj,y∂x=[01cos⁡θ⋅bxj0] \frac{\partial p_{j,x}}{\partial x} = \begin{bmatrix} 1 & 0 & -\sin\theta \cdot b_{x_j} & 0 \end{bmatrix}, \quad \frac{\partial p_{j,y}}{\partial x} = \begin{bmatrix} 0 & 1 & \cos\theta \cdot b_{x_j} & 0 \end{bmatrix} ∂x∂pj,x​​=[1​0​−sinθ⋅bxj​​​0​],∂x∂pj,y​​=[0​1​cosθ⋅bxj​​​0​]

    横向偏差(参考线坐标系下):

    latj=−sin⁡h⋅(pj,x−ox)+cos⁡h⋅(pj,y−oy) \text{lat}_j = -\sin h \cdot (p_{j,x} - o_x) + \cos h \cdot (p_{j,y} - o_y) latj​=−sinh⋅(pj,x​−ox​)+cosh⋅(pj,y​−oy​) ∂latj∂x=−sin⁡h⋅∂pj,x∂x+cos⁡h⋅∂pj,y∂x=[−sin⁡hcos⁡hbxjcos⁡(θ−h)0] \frac{\partial \text{lat}_j}{\partial x} = -\sin h \cdot \frac{\partial p_{j,x}}{\partial x} + \cos h \cdot \frac{\partial p_{j,y}}{\partial x} = \begin{bmatrix} -\sin h & \cos h & b_{x_j} \cos(\theta - h) & 0 \end{bmatrix} ∂x∂latj​​=−sinh⋅∂x∂pj,x​​+cosh⋅∂x∂pj,y​​=[−sinh​cosh​bxj​​cos(θ−h)​0​]

    约束输出:

    c2j=(dlb+rj)−latj,c2j+1=latj−(dub−rj) c_{2j} = (d_{\text{lb}} + r_j) - \text{lat}_j, \qquad c_{2j+1} = \text{lat}_j - (d_{\text{ub}} - r_j) c2j​=(dlb​+rj​)−latj​,c2j+1​=latj​−(dub​−rj​) ∂c2j∂x=−∂latj∂x=[sin⁡h−cos⁡h−bxjcos⁡(θ−h)0] \frac{\partial c_{2j}}{\partial x} = -\frac{\partial \text{lat}_j}{\partial x} = \begin{bmatrix} \sin h & -\cos h & -b_{x_j}\cos(\theta-h) & 0 \end{bmatrix} ∂x∂c2j​​=−∂x∂latj​​=[sinh​−cosh​−bxj​​cos(θ−h)​0​] ∂c2j+1∂x=∂latj∂x,∂c∂u=0 \frac{\partial c_{2j+1}}{\partial x} = \frac{\partial \text{lat}_j}{\partial x}, \qquad \frac{\partial c}{\partial u} = 0 ∂x∂c2j+1​​=∂x∂latj​​,∂u∂c​=0

    5.12 MultiCircleVehicleObstacleConstraint — Jacobian

    pj=[px+cos⁡θ⋅bxjpy+sin⁡θ⋅bxj],Δxj=pj,x−ocx,Δyj=pj,y−ocy \mathbf{p}_j = \begin{bmatrix} p_x + \cos\theta \cdot b_{x_j} \\ p_y + \sin\theta \cdot b_{x_j} \end{bmatrix}, \quad \Delta x_j = p_{j,x} - o_{cx}, \quad \Delta y_j = p_{j,y} - o_{cy} pj​=[px​+cosθ⋅bxj​​py​+sinθ⋅bxj​​​],Δxj​=pj,x​−ocx​,Δyj​=pj,y​−ocy​ cj=(robs+rj)2−(Δxj2+Δyj2) c_j = (r_{\text{obs}} + r_j)^2 - (\Delta x_j^2 + \Delta y_j^2) cj​=(robs​+rj​)2−(Δxj2​+Δyj2​) ∂cj∂x=[−2Δxj−2Δyj2 bxj(Δxjsin⁡θ−Δyjcos⁡θ)0],∂cj∂u=0 \frac{\partial c_j}{\partial x} = \begin{bmatrix} -2\Delta x_j & -2\Delta y_j & 2\, b_{x_j}(\Delta x_j \sin\theta - \Delta y_j \cos\theta) & 0 \end{bmatrix}, \qquad \frac{\partial c_j}{\partial u} = 0 ∂x∂cj​​=[−2Δxj​​−2Δyj​​2bxj​​(Δxj​sinθ−Δyj​cosθ)​0​],∂u∂cj​​=0

    5.13 LSEPolygonObstacleConstraint — Jacobian

    LSE 函数对点 p\mathbf{p}p 的梯度:

    LSE(p)=hmax⁡+1αln⁡∑iexp⁡ ⁣(α(hi−hmax⁡)) \text{LSE}(\mathbf{p}) = h_{\max} + \frac{1}{\alpha} \ln \sum_{i} \exp\!\bigl(\alpha (h_i - h_{\max})\bigr) LSE(p)=hmax​+α1​lni∑​exp(α(hi​−hmax​))

    其中 hi=ni⊤p−bih_i = \mathbf{n}_i^\top \mathbf{p} - b_ihi​=ni⊤​p−bi​,hmax⁡=max⁡ihih_{\max} = \max_i h_ihmax​=maxi​hi​。

    softmax 权重:

    wi=exp⁡ ⁣(α(hi−hmax⁡))∑kexp⁡ ⁣(α(hk−hmax⁡)) w_i = \frac{\exp\!\bigl(\alpha (h_i - h_{\max})\bigr)}{\sum_{k} \exp\!\bigl(\alpha (h_k - h_{\max})\bigr)} wi​=∑k​exp(α(hk​−hmax​))exp(α(hi​−hmax​))​ ∂ LSE∂p=∑iwi ni(法向量的加权平均) \frac{\partial\, \text{LSE}}{\partial \mathbf{p}} = \sum_i w_i \, \mathbf{n}_i \quad \text{(法向量的加权平均)} ∂p∂LSE​=i∑​wi​ni​(法向量的加权平均)

    约束输出:

    cj=rj−LSE(pj) c_j = r_j - \text{LSE}(\mathbf{p}_j) cj​=rj​−LSE(pj​) ∂cj∂p=−∂ LSE∂p=−∑iwi ni \frac{\partial c_j}{\partial \mathbf{p}} = -\frac{\partial\, \text{LSE}}{\partial \mathbf{p}} = -\sum_i w_i \, \mathbf{n}_i ∂p∂cj​​=−∂p∂LSE​=−i∑​wi​ni​ ∂cj∂x=(∂cj∂p)⊤∂pj∂x(1×4) \frac{\partial c_j}{\partial x} = \left(\frac{\partial c_j}{\partial \mathbf{p}}\right)^\top \frac{\partial \mathbf{p}_j}{\partial x} \quad (1 \times 4) ∂x∂cj​​=(∂p∂cj​​)⊤∂x∂pj​​(1×4)

    其中:

    ∂pj∂x=[10−sin⁡θ⋅bxj001cos⁡θ⋅bxj0],∂cj∂u=0 \frac{\partial \mathbf{p}_j}{\partial x} = \begin{bmatrix} 1 & 0 & -\sin\theta \cdot b_{x_j} & 0 \\ 0 & 1 & \cos\theta \cdot b_{x_j} & 0 \end{bmatrix}, \qquad \frac{\partial c_j}{\partial u} = 0 ∂x∂pj​​=[10​01​−sinθ⋅bxj​​cosθ⋅bxj​​​00​],∂u∂cj​​=0

    5.14 增广拉格朗日(AL)罚项展开公式

    给定约束 c(x,u)∈Rpc(x,u) \in \mathbb{R}^pc(x,u)∈Rp,其 Jacobian 为 Jx=∂c∂x∈Rp×nJ_x = \frac{\partial c}{\partial x} \in \mathbb{R}^{p \times n}Jx​=∂x∂c​∈Rp×n,Ju=∂c∂u∈Rp×mJ_u = \frac{\partial c}{\partial u} \in \mathbb{R}^{p \times m}Ju​=∂u∂c​∈Rp×m。 等式约束 AL 项:

    φ=∑j[λjcj+μj2cj2] \varphi = \sum_j \left[\lambda_j c_j + \frac{\mu_j}{2} c_j^2\right] φ=j∑​[λj​cj​+2μj​​cj2​] ∂φ∂x=Jx⊤(λ+μ⊙c),∂φ∂u=Ju⊤(λ+μ⊙c) \frac{\partial \varphi}{\partial x} = J_x^\top (\lambda + \mu \odot c), \qquad \frac{\partial \varphi}{\partial u} = J_u^\top (\lambda + \mu \odot c) ∂x∂φ​=Jx⊤​(λ+μ⊙c),∂u∂φ​=Ju⊤​(λ+μ⊙c) ∂2φ∂x2≈Jx⊤diag⁡(μ) Jx,∂2φ∂u2≈Ju⊤diag⁡(μ) Ju,∂2φ∂u∂x≈Ju⊤diag⁡(μ) Jx \frac{\partial^2 \varphi}{\partial x^2} \approx J_x^\top \operatorname{diag}(\mu)\, J_x, \qquad \frac{\partial^2 \varphi}{\partial u^2} \approx J_u^\top \operatorname{diag}(\mu)\, J_u, \qquad \frac{\partial^2 \varphi}{\partial u \partial x} \approx J_u^\top \operatorname{diag}(\mu)\, J_x ∂x2∂2φ​≈Jx⊤​diag(μ)Jx​,∂u2∂2φ​≈Ju⊤​diag(μ)Ju​,∂u∂x∂2φ​≈Ju⊤​diag(μ)Jx​

    以上 Hessian 使用 Gauss-Newton 近似,忽略二阶约束项 ∑j(λj+μjcj)∇2cj\sum_j (\lambda_j + \mu_j c_j) \nabla^2 c_j∑j​(λj​+μj​cj​)∇2cj​ 。

    不等式约束 AL 项:

    φ=∑j[max⁡(0,  λj+μjcj)]2−λj22μj \varphi = \sum_j \frac{\bigl[\max(0,\;\lambda_j + \mu_j c_j)\bigr]^2 - \lambda_j^2}{2\mu_j} φ=j∑​2μj​[max(0,λj​+μj​cj​)]2−λj2​​

    定义活跃指示 Ij=1[λj+μjcj>0]\mathcal{I}_j = \mathbb{1}[\lambda_j + \mu_j c_j > 0]Ij​=1[λj​+μj​cj​>0],投影值 p^j=max⁡(0,  λj+μjcj)\hat{p}_j = \max(0,\;\lambda_j + \mu_j c_j)p^​j​=max(0,λj​+μj​cj​)。

    ∂φ∂x=Jx⊤(I⊙p^),∂φ∂u=Ju⊤(I⊙p^) \frac{\partial \varphi}{\partial x} = J_x^\top (\mathcal{I} \odot \hat{p}), \qquad \frac{\partial \varphi}{\partial u} = J_u^\top (\mathcal{I} \odot \hat{p}) ∂x∂φ​=Jx⊤​(I⊙p^​),∂u∂φ​=Ju⊤​(I⊙p^​) ∂2φ∂x2≈Jx⊤diag⁡(I⊙μ) Jx,∂2φ∂u2≈Ju⊤diag⁡(I⊙μ) Ju,∂2φ∂u∂x≈Ju⊤diag⁡(I⊙μ) Jx \frac{\partial^2 \varphi}{\partial x^2} \approx J_x^\top \operatorname{diag}(\mathcal{I} \odot \mu)\, J_x, \qquad \frac{\partial^2 \varphi}{\partial u^2} \approx J_u^\top \operatorname{diag}(\mathcal{I} \odot \mu)\, J_u, \qquad \frac{\partial^2 \varphi}{\partial u \partial x} \approx J_u^\top \operatorname{diag}(\mathcal{I} \odot \mu)\, J_x ∂x2∂2φ​≈Jx⊤​diag(I⊙μ)Jx​,∂u2∂2φ​≈Ju⊤​diag(I⊙μ)Ju​,∂u∂x∂2φ​≈Ju⊤​diag(I⊙μ)Jx​

    总的 AL 代价展开:

    总展开=基础代价展开+∑i第 i 个约束 AL 项展开 \boxed{\text{总展开} = \text{基础代价展开} + \sum_i \text{第}\,i\,\text{个约束 AL 项展开}} 总展开=基础代价展开+i∑​第i个约束 AL 项展开​

    六、验证方法

    1. UI 对比:在 Derivative Mode 下拉框中切换 Finite Difference ↔ Analytical,观察:    - 规划耗时变化(Solver 面板)    - 轨迹是否一致(场景视图叠加对比)    - 收敛行为是否一致(违约度、代价历史)
    2. 数值一致性:在相同场景下,两种模式应产生相同或极接近的轨迹(解析模式精度更高,微小差异源于差分截断误差)。
    3. 回退安全性:当使用 PolygonCollisionConstraint(kPolygonExact 模式)时,即使选择 Analytical,该约束会自动回退到差分,不影响求解正确性。
    上一章AL-iLQR实践指南 5:增广拉格朗日与 AL-iLQR 求解器
    已是最后一章

    评论

    加入讨论

    登录或注册后即可发表评论,与其他学习者交流

    登录免费注册

    0 条评论

    加载评论中...