📁 Sunhao's Log
工程与算法

微分动态规划算法推导与最优轨迹控制

从贝尔曼方程到 DDP 反向传播与倒立摆实战全景

深入剖析机器人与非线性最优控制核心算法 DDP:从贝尔曼最优性原理的维度灾难,到名义轨迹二阶泰勒展开、前馈反馈增益求解、回溯线搜索及倒立摆控制实战。

#微分动态规划 #DDP #最优控制 #轨迹优化 #动态规划 #机器人学 #强化学习 #深度批注

DDP 在倒立摆起摆轨迹优化中的迭代收敛过程

🎨 图例色彩导航: 原始理论与核心推导(灰白底) 数学物理与工程实现批注(琥珀金) 2026 现代人形机器人与 MPC 前沿(青蓝卡)
🟡 编者导读 · 最优控制史上的传世经典

微分动态规划(Differential Dynamic Programming, 简称 DDP) 是最优控制与轨迹优化领域最古老、也最强大的算法之一。它由控制理论宗师 David Mayne 于 1965 年首次提出
经典动态规划(DP)因全状态空间的“维度灾难”而在连续高维系统中难以应用;而 DDP 另辟蹊径,仅在一条当前名义轨迹(Nominal Trajectory)的局部邻域内进行二阶泰勒展开,通过反复交替进行“反向传播(Backward Pass)”与“正向模拟(Forward Pass)”,以极高的二阶收敛速度逼近非线性系统的局部最优解。
近年来,Todorov 等学者将其简化为 iLQR(迭代线性二次调节器),并广泛应用于波士顿动力、MIT Cheetah 以及各类复杂四足/双足人形机器人的全身动态运动控制(WBC/MPC)中。本文对 DDP 进行端到端的全量数学推导与实验解构。


📌 一、最优控制问题(The Optimal Control Problem)的形式化定义

🔘 原始内容 · 连续与离散动力学系统建模

考虑一个连续时间动力学系统,状态向量为 $\mathbf{x}(t) \in \mathbb{R}^N$,控制输入向量为 $\mathbf{u}(t) \in \mathbb{R}^M$,其状态转移微分方程为:

$$\frac{d\mathbf{x}}{dt} = f(\mathbf{x}(t), \mathbf{u}(t), t)$$

我们的优化目标是最小化累积代价泛函(Cost Function):

$$J(\mathbf{x}(t_0), \pi) = \underbrace{h(\mathbf{x}(t_f), t_f)}_{\text{终端代价 (Terminal Cost)}} + \int_{t_0}^{t_f} \underbrace{g(\mathbf{x}(t), \mathbf{u}(t), t)}_{\text{运行阶段代价 (Cost-to-go)}} dt$$

最优控制问题即为寻找最优策略 $\pi^*$,使得从初始状态 $\mathbf{x}(t_0)$ 出发的总代价最小:

$$\pi^* = \arg \min_\pi J(\mathbf{x}(t_0), \pi)$$

时间离散化形式

假设系统时不变(Time-invariant),设定总时域步长为 $N$,采样时间间隔 $\Delta t = \frac{t_f - t_0}{N}$。采用一阶欧拉积分对连续动力学进行离散化:

$$\mathbf{x}_{k+1} = \mathbf{x}_k + \Delta t \, f(\mathbf{x}_k, \mathbf{u}_k)$$

对应的离散化总代价函数为:

$$J(\mathbf{x}_0, \mathbf{U}) = h(\mathbf{x}_N) + \sum_{k=0}^{N-1} g(\mathbf{x}_k, \mathbf{u}_k)$$

其中 $\mathbf{U} = [\mathbf{u}_0, \mathbf{u}_1, \dots, \mathbf{u}_{N-1}]$ 为离散控制序列,$\mathbf{X} = [\mathbf{x}_0, \mathbf{x}_1, \dots, \mathbf{x}_N]$ 为对应的状态轨迹。


🧭 二、经典动态规划(DP)与其致命痛点:维度灾难

动态规划图搜索示例

🔘 原始内容 · 贝尔曼最优性原理

为了直观理解动态规划,我们将其视作在有向图上寻找从起点到目标点的最小代价路径。每个节点代表状态 $\mathbf{x}$,拥有一个值函数(Value Function)$V(\mathbf{x})$,表示从当前状态到达目标状态的剩余最小代价:

根据理查德·贝尔曼(Richard Bellman)的贝尔曼最优性原理(Bellman Optimality Principle):任意状态的最优价值等于当前单步代价与后续下一状态最优价值之和的最小值:

$$V^*(\mathbf{x}) = \min_{\mathbf{u}} \Big[ g(\mathbf{x}, \mathbf{u}) + V^*(\mathbf{x}') \Big]$$

其中 $\mathbf{x}' = f(\mathbf{x}, \mathbf{u})$。

由于目标状态没有后续决策,其终端价值已知:$V^*(\mathbf{x}_{\text{goal}}) = h(\mathbf{x}_{\text{goal}}) = 0$。因此,我们可以从终点反向倒推(Backward Induction),逐层计算出全图所有状态的真值!

动态规划反向计算值函数动图

动态规划算法流程

🟡 痛点批注 · 为什么经典 DP 无法用于机器人控制?

经典 DP 在离散小规模网格中非常有效,但在连续高维控制问题中面临毁灭性的维度灾难(Curse of Dimensionality)
如果一个机器人的状态维度为 12(如四足机器人的位置、姿态及各自速度),将每个维度离散化 100 个网格,状态空间总量将达到 $100^{12} = 10^{24}$ 个节点,即便耗尽全球算力也无法进行网格遍历。


⚡ 三、微分动态规划(DDP):局部二阶泰勒展开与反向传播

DDP 的精妙之处在于:放弃对全局全状态空间的穷举,而是围绕一条初始名义轨迹(Nominal Trajectory)$(\bar{\mathbf{x}}_k, \bar{\mathbf{u}}_k)$,在局部邻域内进行二阶泰勒展开!

二阶泰勒展开逼近

1. 动作价值函数(Action-Value Function / Q-Function)的二阶展开

🔘 原始内容 · Q 函数的局部扰动展开

定义状态扰动 $\delta \mathbf{x}_k = \mathbf{x}_k - \bar{\mathbf{x}}_k$,控制扰动 $\delta \mathbf{u}_k = \mathbf{u}_k - \bar{\mathbf{u}}_k$。在第 $k$ 步,考虑采取控制扰动后引起的未来总代价变化量(Q 函数):

$$Q(\delta \mathbf{x}_k, \delta \mathbf{u}_k) = g(\bar{\mathbf{x}}_k + \delta \mathbf{x}_k, \bar{\mathbf{u}}_k + \delta \mathbf{u}_k) + V(\bar{\mathbf{x}}_{k+1} + \delta \mathbf{x}_{k+1}) - V(\bar{\mathbf{x}}_k)$$

对 $Q$ 函数关于 $(\delta \mathbf{x}_k, \delta \mathbf{u}_k)$ 进行二阶泰勒级数展开:

$$Q(\delta \mathbf{x}_k, \delta \mathbf{u}_k) \approx Q_0 + \mathbf{Q}_x^T \delta \mathbf{x}_k + \mathbf{Q}_u^T \delta \mathbf{u}_k + \frac{1}{2} \begin{bmatrix} \delta \mathbf{x}_k \\ \delta \mathbf{u}_k \end{bmatrix}^T \begin{bmatrix} \mathbf{Q}_{xx} & \mathbf{Q}_{xu} \\ \mathbf{Q}_{ux} & \mathbf{Q}_{uu} \end{bmatrix} \begin{bmatrix} \delta \mathbf{x}_k \\ \delta \mathbf{u}_k \end{bmatrix}$$

根据链式求导法则,展开系数由当前阶段代价 $g$ 与下一时刻值函数 $V_{k+1}$ 的梯度和 Hessian 矩阵复合而成:

$$\mathbf{Q}_x = \mathbf{g}_x + \mathbf{f}_x^T \mathbf{V}_x'$$ $$\mathbf{Q}_u = \mathbf{g}_u + \mathbf{f}_u^T \mathbf{V}_x'$$ $$\mathbf{Q}_{xx} = \mathbf{g}_{xx} + \mathbf{f}_x^T \mathbf{V}_{xx}' \mathbf{f}_x + \mathbf{V}_x' \cdot \mathbf{f}_{xx}$$ $$\mathbf{Q}_{uu} = \mathbf{g}_{uu} + \mathbf{f}_u^T \mathbf{V}_{xx}' \mathbf{f}_u + \mathbf{V}_x' \cdot \mathbf{f}_{uu}$$ $$\mathbf{Q}_{ux} = \mathbf{g}_{ux} + \mathbf{f}_u^T \mathbf{V}_{xx}' \mathbf{f}_x + \mathbf{V}_x' \cdot \mathbf{f}_{ux}$$

(注:在著名的 iLQR 算法中,通常忽略系统动力学的二阶项 $\mathbf{f}_{xx}, \mathbf{f}_{uu}, \mathbf{f}_{ux}$,仅保留动力学一阶导数,从而极大降低求导开销)。

2. 反向传播(Backwards Pass):前馈与反馈控制律的解析解

🔘 原始内容 · 最优控制增量的推导

为了使当前局部的代价变化最小,对 $Q(\delta \mathbf{x}_k, \delta \mathbf{u}_k)$ 关于控制扰动 $\delta \mathbf{u}_k$ 求极值:

$$\frac{\partial Q}{\partial \delta \mathbf{u}_k} = \mathbf{Q}_u + \mathbf{Q}_{uu} \delta \mathbf{u}_k + \mathbf{Q}_{ux} \delta \mathbf{x}_k = 0$$

若 $\mathbf{Q}_{uu} > 0$(正定矩阵),可直接解出最优控制增量 $\delta \mathbf{u}_k^*$:

$$\delta \mathbf{u}_k^* = \underbrace{-\mathbf{Q}_{uu}^{-1} \mathbf{Q}_u}_{\mathbf{k}_k \text{ (开环前馈增益)}} + \underbrace{-\mathbf{Q}_{uu}^{-1} \mathbf{Q}_{ux}}_{\mathbf{K}_k \text{ (闭环状态反馈增益)}} \delta \mathbf{x}_k$$ $$\delta \mathbf{u}_k^* = \mathbf{k}_k + \mathbf{K}_k \delta \mathbf{x}_k$$

将最优控制增量代回二次型中,即可反向递推更新当前时刻的值函数梯度与 Hessian 矩阵:

$$\Delta V_k = -\frac{1}{2} \mathbf{k}_k^T \mathbf{Q}_{uu} \mathbf{k}_k$$ $$\mathbf{V}_x(k) = \mathbf{Q}_x - \mathbf{K}_k^T \mathbf{Q}_{uu} \mathbf{k}_k = \mathbf{Q}_x + \mathbf{K}_k^T \mathbf{Q}_u$$ $$\mathbf{V}_{xx}(k) = \mathbf{Q}_{xx} - \mathbf{K}_k^T \mathbf{Q}_{uu} \mathbf{K}_k$$

回溯线搜索与发散示例

🔘 原始内容 · 沿新策略前向推进

在反向传播计算出全时域的前馈增益序列 $\{\mathbf{k}_k\}$ 与反馈增益序列 $\{\mathbf{K}_k\}$ 后,进入正向模拟阶段(Forward Pass)

从初始状态 $\mathbf{x}_0$ 出发,使用带有步长缩放因子 $\alpha \in (0, 1]$ 的控制律前向积分生成新轨迹:

$$\hat{\mathbf{x}}_0 = \mathbf{x}_0$$ $$\hat{\mathbf{u}}_k = \bar{\mathbf{u}}_k + \alpha \, \mathbf{k}_k + \mathbf{K}_k (\hat{\mathbf{x}}_k - \bar{\mathbf{x}}_k)$$ $$\hat{\mathbf{x}}_{k+1} = f(\hat{\mathbf{x}}_k, \hat{\mathbf{u}}_k)$$

Armijo 回溯线搜索(Backtracking Line Search)

由于二阶泰勒展开仅在局部邻域内有效,直接采用全步长 $\alpha=1$ 容易引起非线性系统的剧烈超调甚至轨迹发散。通过 Armijo 条件动态回退步长:

$$J(\hat{\mathbf{X}}, \hat{\mathbf{U}}) \le J(\bar{\mathbf{X}}, \bar{\mathbf{U}}) + c_1 \alpha \sum_{k=0}^{N-1} \mathbf{k}_k^T \mathbf{Q}_u$$

每次若代价未充分下降,则令 $\alpha \leftarrow \beta \alpha$(通常 $\beta = 0.5$),直到找到满足充分下降的新轨迹。

带回溯线搜索的 DDP 完整算法


🤖 五、经典机器人控制实战基准

1. 倒立摆(Inverted Pendulum)摇摆起摆任务

倒立摆模型

  • 任务目标:摆杆从竖直向下悬垂的静止状态 $[\theta, \dot{\theta}] = [\pi, 0]$,在有限时间内通过电机力矩将其摇摆向上升起,并最终稳定在直立平衡点 $[\theta, \dot{\theta}] = [0, 0]$。
  • DDP 表现:仅需 5 ~ 8 次外层正反向迭代,DDP 便能自动发现“先反向借力荡秋千、蓄积动能后一跃直立”的高度非线性最优控制策略!

倒立摆收敛优化过程

2. 小车倒立摆(Cartpole)平衡控制

小车倒立摆 DDP 轨迹优化结果

  • 任务目标:小车在水平轨道上移动,同时控制上方自由旋转的摆杆从任意初始角度平稳摆起并在指定坐标处保持静止。

🚀 六、2026 现代前沿进阶:从 DDP 到四足/人形机器人 MPC

🔵 2026 深度增补 · 现代实时轨迹优化演进

1. 约束 DDP (Box-FDDP / Crocoddyl 框架)

传统的 DDP 无法直接显式处理控制输入与状态边界约束(如电机力矩上限、关节软限位)。现代开源框架(如法国 LAAS 的 Crocoddyl)引入接触动力学约束与投影二次规划(Box-QP),实现了四足机器人(如 ANYmal、Unitree B2)与人形机器人的全身多刚体接触轨迹优化。

2. 实时非线性 MPC (NMPC) 闭环运行

借助 GPU 并行计算与高效 C++ 代码生成(如 Pinocchio + CasADi),DDP / iLQR 已经可以在 50 Hz ~ 100 Hz 的超高频率下进行滚动时域(Receding Horizon)在线重规划,赋予机器人在突发外界推搡碰撞下的强大瞬态抗扰平衡能力。

3. 引导策略搜索 (Guided Policy Search, GPS)

在强化学习(RL)领域,Sergey Levine 等学者将 DDP 作为“专家教师算法”:先利用 DDP 在多个局部任务中快速求解出高精度最优轨迹与反馈增益,再通过模仿学习(Behavior Cloning / DAgger)将控制经验蒸馏进全局神经网络 Policy 中,实现了物理模型与深度学习的完美结合!


📚 资料出处与致谢

  • 原文参考Ignat Georgiev 个人学术博客 · 《Deriving Differential Dynamic Programming》
  • 官方开源代码库imgeorgiev/ddp (GitHub)
  • 学术原著文献:Mayne, David. “A second-order gradient method for optimising non-linear dynamical systems.” International Journal of Control (1966);Tassa et al. “Synthesis and stabilization of complex behaviors through online trajectory optimization.” IROS (2012).
  • 全量数学推导与 2026 现代前沿扩展:Jenny Zhang · Jenny’s Space(工程与算法专栏)