1. 约束最优控制的困境与 CDDP 核心动机
在经典机器人运控与航天器制导中,轨迹优化器不仅需要寻找能耗最低、时间最短的动态可行路径,还必须严格满足以下三类严苛物理约束:
- 执行器物理边界 (Control Bounds):电机最大峰值力矩、油门开度限制、四旋翼电机推力非负性($u_i \ge 0$);
- 状态安全走廊与几何避碰 (State Obstacle Avoidance):三维非凸障碍物避碰($r_{obs}^2 - \|\boldsymbol{p}_k - \boldsymbol{p}_{obs}\|^2 \le 0$)、道路边界、对接安全锥与视场角走廊;
- 状态-控制耦合动力学约束 (Coupled Constraints):足式机器人地面接触摩擦锥、车辆侧向附着力极限。
1.1 传统约束处理机制的瓶颈对比
| 约束处理范式 | 代表算法 | 核心数学机制 | 核心优势 | 严重物理/数值缺陷 |
|---|---|---|---|---|
| 罚函数与对数障碍法 | Log-Barrier DDP, Penalty DDP | 在代价中添加 $-t \sum \log(-g_i)$ 或 $\rho \|\max(0, g)\|^2$ | 可复用无约束 DDP 代码框架 | 边界处 Hessian 严重病态,极易卡在较差局部极小,中间迭代不可行 |
| 控制受限投影法 | Box-QP iLQR (Tassa 2014) | 反向传递单步求解边界控制 QP,行截断 | 计算微秒级,天然适合电机扭矩 | 完全无法处理状态不等式约束 $g(\boldsymbol{x})\le 0$ 与耦合约束 |
| 全轨迹直接配点法 | Direct Collocation + SNOPT / IPOPT | 时域变量全部离散化,求解巨型稀疏 NLP | 通用处理任意非线性硬约束 | KKT 矩阵规模大,开销随 $N$ 激增,不输出闭环时变反馈增益 $\boldsymbol{K}_k$ |
| 约束 DDP (CDDP) | Xie 2017 CDDP | 活跃集反向灵敏度解析求解 + 前向阶段 QP 滚动与信赖域重算 | 严格可行收敛、保持 $\mathcal{O}(N)$ 复杂度、天然伴生受约束反馈增益 | 需可行初值热启动,反向要求 $Q_{\boldsymbol{u}\boldsymbol{u}}$ 正定 |
1.2 CDDP 的核心设计哲学
Zhaoming Xie, C. Karen Liu 与 Kris Hauser 在 2017 年提出的 CDDP (Constrained DDP) 在算法架构上实现了完美的理论解耦与平衡:
1. 反向传播 (Backward Pass):识别近活跃(Near-Active)约束,通过局部一阶泰勒线性化建立阶段等式约束 QP,应用 KKT 投影条件解析推导出受约束的开环前馈控制增量 $\boldsymbol{k}_k$ 与闭环状态反馈增益 $\boldsymbol{K}_k$,并利用对偶乘子符号检验释放非活跃约束;
2. 前向回放 (Forward Pass):针对真实非线性约束的几何曲率,在每步求解极小规模(仅 $n_u$ 维变量)的阶段凸二次规划(Stage-wise QP),并配合自适应盒式信赖域管理与不可行回退机制;
3. 严格可行性保障:算法从一条可行(但次优)的名义轨迹出发,在外层迭代中只接受既严格满足物理硬约束、又实现性能指标单调下降的新轨迹,彻底克服了障碍函数法的发散与边界振荡。
2. 标准非线性约束轨迹优化问题表述
依循全库统一符号标准化规范(DDP_Optimal_Control_Kinematics_and_Dynamics_Standardization_Specification.md),考虑有限时域离散时间非线性动力学系统:
其中状态向量 $\boldsymbol{x}_k \in \mathbb{R}^{n_x}$,控制输入向量 $\boldsymbol{u}_k \in \mathbb{R}^{n_u}$,状态转移映射 $\boldsymbol{f}: \mathbb{R}^{n_x} \times \mathbb{R}^{n_u} \to \mathbb{R}^{n_x}$ 为二次连续可微函数。
全时域性能指标泛函(Cost Functional)由各步运行代价 $\ell_k$ 与终端代价 $\phi(\boldsymbol{x}_N)$ 构成:
$$\mathcal{J}(\boldsymbol{x}_0, \boldsymbol{U}) = \sum_{k=0}^{N-1} \ell_k(\boldsymbol{x}_k, \boldsymbol{u}_k) + \phi(\boldsymbol{x}_N) \tag{2-2}$$系统面临通用的可微非线性向量不等式约束:
$$\boldsymbol{g}_k(\boldsymbol{x}_k, \boldsymbol{u}_k) \le \boldsymbol{0}, \quad k = 0, 1, \dots, N-1 \tag{2-3}$$以及终端约束 $\boldsymbol{g}_N(\boldsymbol{x}_N) \le \boldsymbol{0}$(或目标等式约束 $\boldsymbol{h}_N(\boldsymbol{x}_N) = \boldsymbol{0}$)。这里 $\boldsymbol{g}_k: \mathbb{R}^{n_x} \times \mathbb{R}^{n_u} \to \mathbb{R}^{p_k}$ 包含了任意可微状态不等式(如避碰安全距离)、控制限幅及耦合约束。
从时刻 $k$、状态 $\boldsymbol{x}$ 出发到时域终点的最优剩余代价定义为值函数(Value Function):
$$V_k(\boldsymbol{x}) \triangleq \min_{\{\boldsymbol{u}_j\}_{j=k}^{N-1}} \left[ \sum_{j=k}^{N-1} \ell_j(\boldsymbol{x}_j, \boldsymbol{u}_j) + \phi(\boldsymbol{x}_N) \right] \quad \text{s.t.} \quad \boldsymbol{g}_j(\boldsymbol{x}_j, \boldsymbol{u}_j) \le \boldsymbol{0}, \;\; \boldsymbol{x}_{j+1} = \boldsymbol{f}(\boldsymbol{x}_j, \boldsymbol{u}_j) \tag{2-4}$$Bellman 离散最优性递推方程为:
$$V_k(\boldsymbol{x}) = \min_{\boldsymbol{u}} \left[ \ell_k(\boldsymbol{x}, \boldsymbol{u}) + V_{k+1}(\boldsymbol{f}(\boldsymbol{x}, \boldsymbol{u})) \right] \quad \text{s.t.} \quad \boldsymbol{g}_k(\boldsymbol{x}, \boldsymbol{u}) \le \boldsymbol{0} \tag{2-5}$$定义连续状态-动作价值函数(Action-Value / Q-function):
$$Q_k(\boldsymbol{x}, \boldsymbol{u}) \triangleq \ell_k(\boldsymbol{x}, \boldsymbol{u}) + V_{k+1}(\boldsymbol{f}(\boldsymbol{x}, \boldsymbol{u})) \tag{2-6}$$则阶段最优控制子问题等价于:
$$\boldsymbol{u}_k^*(\boldsymbol{x}) = \arg\min_{\boldsymbol{u}} Q_k(\boldsymbol{x}, \boldsymbol{u}) \quad \text{s.t.} \quad \boldsymbol{g}_k(\boldsymbol{x}, \boldsymbol{u}) \le \boldsymbol{0}, \qquad V_k(\boldsymbol{x}) = Q_k(\boldsymbol{x}, \boldsymbol{u}_k^*(\boldsymbol{x})) \tag{2-7}$$3. 活跃约束对 Bellman 局部模型的拓扑剪裁
在无约束 DDP 中,我们在当前名义轨迹 $(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k)$ 周围对 $Q_k$ 做二阶泰勒展开。由于控制量可以在全空间无障碍自由变化,一阶无约束最优性条件 $\nabla_{\delta \boldsymbol{u}} Q_k = \boldsymbol{0}$ 能够解析导出控制增量是状态偏差的纯仿射函数:
$$\delta \boldsymbol{u}_k^* = -Q_{\boldsymbol{u}\boldsymbol{u}}^{-1} Q_{\boldsymbol{u}} - Q_{\boldsymbol{u}\boldsymbol{u}}^{-1} Q_{\boldsymbol{u}\boldsymbol{x}} \delta \boldsymbol{x}_k$$当系统状态处于约束边界(例如飞行器紧贴障碍物球面、或电机输出达到最大扭矩边界)时,上游状态发生微小扰动 $\delta \boldsymbol{x}_k$,下游最优控制 $\delta \boldsymbol{u}_k$ 绝不能沿任意无约束梯度方向自由变化!它必须受制于约束切平面的投影流动,被强制约束在可行域边界切空间内。
因此,反向传播的核心就在于:解析推导在活跃约束切空间投影下的局部最优解对于状态偏差 $\delta \boldsymbol{x}_k$ 的一阶灵敏度矩阵(Sensitivity Gain)!
4. 受约束反向传播 (Constrained Backward Pass) 严格数学推导
设当前拥有一条可行的名义轨迹 $(\bar{\boldsymbol{X}}, \bar{\boldsymbol{U}})$。定义状态与控制扰动偏差量:
$$\delta \boldsymbol{x}_k \triangleq \boldsymbol{x}_k - \bar{\boldsymbol{x}}_k, \qquad \delta \boldsymbol{u}_k \triangleq \boldsymbol{u}_k - \bar{\boldsymbol{u}}_k \tag{4-1}$$在名义点处将 $Q_k$ 二阶多元泰勒展开:
$$Q_k(\bar{\boldsymbol{x}}_k + \delta \boldsymbol{x}_k, \bar{\boldsymbol{u}}_k + \delta \boldsymbol{u}_k) \approx Q_k(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k) + Q_{\boldsymbol{x}}^\top \delta \boldsymbol{x}_k + Q_{\boldsymbol{u}}^\top \delta \boldsymbol{u}_k + \frac{1}{2}\delta \boldsymbol{x}_k^\top Q_{\boldsymbol{x}\boldsymbol{x}} \delta \boldsymbol{x}_k + \frac{1}{2}\delta \boldsymbol{u}_k^\top Q_{\boldsymbol{u}\boldsymbol{u}} \delta \boldsymbol{u}_k + \delta \boldsymbol{u}_k^\top Q_{\boldsymbol{u}\boldsymbol{x}} \delta \boldsymbol{x}_k \tag{4-2}$$其中一阶与二阶展开梯度与 Hessian 为(利用复合求导链式法则,上标撇号表示在 $k+1$ 步处评估):
$$Q_{\boldsymbol{x}} = \ell_{\boldsymbol{x}} + \boldsymbol{f}_{\boldsymbol{x}}^\top V_{\boldsymbol{x}}', \qquad Q_{\boldsymbol{u}} = \ell_{\boldsymbol{u}} + \boldsymbol{f}_{\boldsymbol{u}}^\top V_{\boldsymbol{x}}' \tag{4-3}$$ $$Q_{\boldsymbol{x}\boldsymbol{x}} = \ell_{\boldsymbol{x}\boldsymbol{x}} + \boldsymbol{f}_{\boldsymbol{x}}^\top V_{\boldsymbol{x}\boldsymbol{x}}' \boldsymbol{f}_{\boldsymbol{x}} + V_{\boldsymbol{x}}' \cdot \boldsymbol{f}_{\boldsymbol{x}\boldsymbol{x}} \tag{4-4}$$ $$Q_{\boldsymbol{u}\boldsymbol{u}} = \ell_{\boldsymbol{u}\boldsymbol{u}} + \boldsymbol{f}_{\boldsymbol{u}}^\top V_{\boldsymbol{x}\boldsymbol{x}}' \boldsymbol{f}_{\boldsymbol{u}} + V_{\boldsymbol{x}}' \cdot \boldsymbol{f}_{\boldsymbol{u}\boldsymbol{u}} \tag{4-5}$$ $$Q_{\boldsymbol{u}\boldsymbol{x}} = \ell_{\boldsymbol{u}\boldsymbol{x}} + \boldsymbol{f}_{\boldsymbol{u}}^\top V_{\boldsymbol{x}\boldsymbol{x}}' \boldsymbol{f}_{\boldsymbol{x}} + V_{\boldsymbol{x}}' \cdot \boldsymbol{f}_{\boldsymbol{u}\boldsymbol{x}} \tag{4-6}$$4.1 候选活跃集选取与局部线性化
在时刻 $k$,对于不等式约束向量 $\boldsymbol{g}_k(\boldsymbol{x}, \boldsymbol{u}) \le \boldsymbol{0}$,我们选取处于“近活跃”状态的分量。设定容差 $\epsilon > 0$(例如 $\epsilon = 10^{-3}$),定义候选活跃集 $\hat{\boldsymbol{g}}_k$:
$$\hat{\boldsymbol{g}}_k \triangleq \left\{ g_{k, i}(\boldsymbol{x}_k, \boldsymbol{u}_k) \;\middle|\; g_{k, i}(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k) \ge -\epsilon \right\} \tag{4-7}$$将候选活跃约束在名义点一阶线性化:
$$\hat{\boldsymbol{g}}_k(\bar{\boldsymbol{x}}_k + \delta \boldsymbol{x}_k, \bar{\boldsymbol{u}}_k + \delta \boldsymbol{u}_k) \approx \hat{\boldsymbol{g}}_k(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k) + \hat{\boldsymbol{g}}_{\boldsymbol{x}, k} \delta \boldsymbol{x}_k + \hat{\boldsymbol{g}}_{\boldsymbol{u}, k} \delta \boldsymbol{u}_k \le \boldsymbol{0} \tag{4-8}$$对于紧贴边界的活跃约束,其切平面演化等式可表述为:
$$\boldsymbol{C}_k \delta \boldsymbol{u}_k = \boldsymbol{D}_k \delta \boldsymbol{x}_k \tag{4-9}$$ $$\text{其中} \quad \boldsymbol{C}_k \triangleq \hat{\boldsymbol{g}}_{\boldsymbol{u}, k}(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k) \in \mathbb{R}^{\hat{p} \times n_u}, \qquad \boldsymbol{D}_k \triangleq -\hat{\boldsymbol{g}}_{\boldsymbol{x}, k}(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k) \in \mathbb{R}^{\hat{p} \times n_x} \tag{4-10}$$4.2 阶段等式约束 QP 与 KKT 线性系统
将阶段最优控制扰动求解建模为等式约束二次规划:
$$\min_{\delta \boldsymbol{u}_k} \quad \frac{1}{2} \delta \boldsymbol{u}_k^\top Q_{\boldsymbol{u}\boldsymbol{u}, k} \delta \boldsymbol{u}_k + \delta \boldsymbol{u}_k^\top Q_{\boldsymbol{u}\boldsymbol{x}, k} \delta \boldsymbol{x}_k + Q_{\boldsymbol{u}, k}^\top \delta \boldsymbol{u}_k \quad \text{s.t.} \quad \boldsymbol{C}_k \delta \boldsymbol{u}_k = \boldsymbol{D}_k \delta \boldsymbol{x}_k \tag{4-11}$$引入拉格朗日乘子 $\boldsymbol{\lambda}_k \in \mathbb{R}^{\hat{p}}$,一阶 KKT 最优性条件构成标准分块鞍点系统:
$$\begin{bmatrix} Q_{\boldsymbol{u}\boldsymbol{u}, k} & \boldsymbol{C}_k^\top \\ \boldsymbol{C}_k & \boldsymbol{0} \end{bmatrix} \begin{bmatrix} \delta \boldsymbol{u}_k \\ \boldsymbol{\lambda}_k \end{bmatrix} = \begin{bmatrix} -Q_{\boldsymbol{u}\boldsymbol{x}, k} \delta \boldsymbol{x}_k - Q_{\boldsymbol{u}, k} \\ \boldsymbol{D}_k \delta \boldsymbol{x}_k \end{bmatrix} \tag{4-12}$$4.3 对偶乘子符号判定与非活跃约束释放机制
对于不等式约束 $g_i \le 0$,KKT 条件要求其对偶乘子必须非负 $\lambda_i \ge 0$。若某个候选约束解出的 $\lambda_i < 0$,说明梯度下降方向指向可行域内部,强制锁定该约束将阻碍目标函数进一步下降!
1. 在 $\delta \boldsymbol{x}_k = \boldsymbol{0}$ 处求解名义对偶乘子:
$$\bar{\boldsymbol{\lambda}}_k = - \left( \boldsymbol{C}_k Q_{\boldsymbol{u}\boldsymbol{u}, k}^{-1} \boldsymbol{C}_k^\top \right)^{-1} \boldsymbol{C}_k Q_{\boldsymbol{u}\boldsymbol{u}, k}^{-1} Q_{\boldsymbol{u}, k} \tag{4-13}$$2. 剔除所有满足 $\bar{\lambda}_{k, i} < 0$ 的不等式行(约束释放);
3. 保留严格正乘子行与等式约束,得到约化矩阵 $\hat{\boldsymbol{C}}_k$ 与 $\hat{\boldsymbol{D}}_k$。
4.4 受约束前馈步长与反馈增益闭式解
定义受约束投影算子与权重矩阵:
$$\boldsymbol{W}_k \triangleq \left( \hat{\boldsymbol{C}}_k Q_{\boldsymbol{u}\boldsymbol{u}, k}^{-1} \hat{\boldsymbol{C}}_k^\top \right)^{-1} \hat{\boldsymbol{C}}_k Q_{\boldsymbol{u}\boldsymbol{u}, k}^{-1} \in \mathbb{R}^{p \times n_u} \tag{4-14}$$ $$\boldsymbol{H}_k \triangleq Q_{\boldsymbol{u}\boldsymbol{u}, k}^{-1} \left( \boldsymbol{I}_{n_u} - \hat{\boldsymbol{C}}_k^\top \boldsymbol{W}_k \right) \in \mathbb{R}^{n_u \times n_u} \tag{4-15}$$求解 KKT 系统,得到受约束最优控制律闭式解:
$$\delta \boldsymbol{u}_k^*(\delta \boldsymbol{x}_k) = \boldsymbol{k}_k + \boldsymbol{K}_k \delta \boldsymbol{x}_k \tag{4-16}$$ $$\boldsymbol{k}_k = -\boldsymbol{H}_k Q_{\boldsymbol{u}, k} \quad (\text{前馈控制修正量 Feedforward Gain}) \tag{4-17}$$ $$\boldsymbol{K}_k = -\boldsymbol{H}_k Q_{\boldsymbol{u}\boldsymbol{x}, k} + \boldsymbol{W}_k^\top \hat{\boldsymbol{D}}_k \quad (\text{状态反馈增益矩阵 Feedback Gain}) \tag{4-18}$$反馈增益 $\boldsymbol{K}_k$ 由两个互补的物理部分完美构成:
1. 切平面投影项 $-\boldsymbol{H}_k Q_{\boldsymbol{u}\boldsymbol{x}, k}$:沿着未被约束锁定的自由子空间进行性能指标的极小化调节;
2. 法向几何恢复项 $\boldsymbol{W}_k^\top \hat{\boldsymbol{D}}_k$:当上游状态发生偏离 $\delta \boldsymbol{x}_k$ 导致系统有冲出约束边界的风险时,该项产生精确的法向控制反冲,将轨迹强制拉回约束可行曲面上!
4.5 受约束值函数二阶模型逆向更新
将式 (4-16) 代入局部二次模型,得到值函数一阶导数与二阶 Hessian 的逆向递推方程:
$$V_{\boldsymbol{x}}(k) = Q_{\boldsymbol{x}} + \boldsymbol{K}_k^\top Q_{\boldsymbol{u}} + \boldsymbol{K}_k^\top Q_{\boldsymbol{u}\boldsymbol{u}} \boldsymbol{k}_k + Q_{\boldsymbol{u}\boldsymbol{x}}^\top \boldsymbol{k}_k \tag{4-19}$$ $$V_{\boldsymbol{x}\boldsymbol{x}}(k) = Q_{\boldsymbol{x}\boldsymbol{x}} + \boldsymbol{K}_k^\top Q_{\boldsymbol{u}\boldsymbol{u}} \boldsymbol{K}_k + \boldsymbol{K}_k^\top Q_{\boldsymbol{u}\boldsymbol{x}} + Q_{\boldsymbol{u}\boldsymbol{x}}^\top \boldsymbol{K}_k \tag{4-20}$$终端初始化为 $V_{\boldsymbol{x}}(N) = \nabla_{\boldsymbol{x}} \phi(\bar{\boldsymbol{x}}_N), \;\; V_{\boldsymbol{x}\boldsymbol{x}}(N) = \nabla_{\boldsymbol{x}\boldsymbol{x}}^2 \phi(\bar{\boldsymbol{x}}_N)$,从 $k = N-1$ 逐级递归至 $k=0$。
5. 受约束前向回放 (Constrained Forward Pass) 与信赖域管理
5.1 为什么线性回放会失效?阶段 QP 的必要性
在标准无约束 DDP 中,前向传播只需简单执行前向仿真 $\boldsymbol{u}_k^{\mathrm{new}} = \bar{\boldsymbol{u}}_k + \alpha \boldsymbol{k}_k + \boldsymbol{K}_k (\boldsymbol{x}_k^{\mathrm{new}} - \bar{\boldsymbol{x}}_k)$。但在非线性约束下,纯线性回放会引发严重问题:
- 真实非线性障碍物曲面(如三维球体)具有二阶几何曲率,线性切平面反馈无法阻挡弯曲超曲面带来的越界;
- 累积动力学扰动会导致控制指令超出硬约束边界;
- 中间某步越界会导致后续轨迹严重失真与发散。
5.2 阶段 QP 形式与自适应盒式信赖域
在前向仿真的每一个时刻 $k$,基于当前已传播达到的实际状态 $\boldsymbol{x}_k^{\mathrm{temp}}$,求解极小维度的阶段凸 QP:
$$\min_{\delta \boldsymbol{u}} \quad \frac{1}{2} \delta \boldsymbol{u}^\top Q_{\boldsymbol{u}\boldsymbol{u}, k} \delta \boldsymbol{u} + \delta \boldsymbol{u}^\top Q_{\boldsymbol{u}\boldsymbol{x}, k} \delta \boldsymbol{x}_k + Q_{\boldsymbol{u}, k}^\top \delta \boldsymbol{u} \tag{5-1}$$ $$\text{s.t.} \quad \boldsymbol{g}_k(\bar{\boldsymbol{x}}_k, \bar{\boldsymbol{u}}_k) + \nabla_{\boldsymbol{x}} \boldsymbol{g}_k \delta \boldsymbol{x}_k + \nabla_{\boldsymbol{u}} \boldsymbol{g}_k \delta \boldsymbol{u} \le \boldsymbol{0} \tag{5-2}$$ $$-e \le \delta \boldsymbol{u} \le e \quad (\text{盒式信赖域 Box Trust Region}) \tag{5-3}$$其中 $e > 0$ 为自适应盒式信赖域边界。解出 $\delta \boldsymbol{u}^*$ 后,推进一步非线性动力学:$\boldsymbol{u}_k^{\mathrm{temp}} = \bar{\boldsymbol{u}}_k + \delta \boldsymbol{u}^*, \;\; \boldsymbol{x}_{k+1}^{\mathrm{temp}} = \boldsymbol{f}(\boldsymbol{x}_k^{\mathrm{temp}}, \boldsymbol{u}_k^{\mathrm{temp}})$。
5.3 不可行回退重启与单调代价接受准则
1. 不可行回退与信赖域收缩:若某步 QP 不可行或非线性积分后出现约束违背,说明当前信赖域 $e$ 过大,立即中止前向仿真,将信赖域缩小 $e \leftarrow \alpha e$($\alpha = 0.5$),完全重置回 $k=0$ 从头重新仿真;
2. 单调代价改善准则:成功推至终点 $N$ 且全程可行后,若 $\mathcal{J}_{\mathrm{temp}} < \mathcal{J}_{\mathrm{init}}$,接受新轨迹并衰减正则化阻尼 $\mu$;否则拒绝新轨迹并放大正则化阻尼。
6. 正则化策略与动力学离散化避坑工程指南
6.1 状态与控制双重 LM 阻尼正则化
为确保 $Q_{\boldsymbol{u}\boldsymbol{u}}$ 严格正定可逆并约束状态漂移,CDDP 采纳双重 Levenberg-Marquardt 阻尼格式:
$$Q_{\boldsymbol{x}\boldsymbol{x}, k} = \ell_{\boldsymbol{x}\boldsymbol{x}, k} + \boldsymbol{f}_{\boldsymbol{x}}^\top (V_{\boldsymbol{x}\boldsymbol{x}, k+1} + \mu_1 \boldsymbol{I}_{n_x}) \boldsymbol{f}_{\boldsymbol{x}} + V_{\boldsymbol{x}, k+1}' \cdot \boldsymbol{f}_{\boldsymbol{x}\boldsymbol{x}} \tag{6-1}$$ $$Q_{\boldsymbol{u}\boldsymbol{u}, k} = \ell_{\boldsymbol{u}\boldsymbol{u}, k} + \boldsymbol{f}_{\boldsymbol{u}}^\top (V_{\boldsymbol{x}\boldsymbol{x}, k+1} + \mu_1 \boldsymbol{I}_{n_x}) \boldsymbol{f}_{\boldsymbol{u}} + V_{\boldsymbol{x}, k+1}' \cdot \boldsymbol{f}_{\boldsymbol{u}\boldsymbol{u}} + \mu_2 \boldsymbol{I}_{n_u} \tag{6-2}$$ $$Q_{\boldsymbol{u}\boldsymbol{x}, k} = \ell_{\boldsymbol{u}\boldsymbol{x}, k} + \boldsymbol{f}_{\boldsymbol{u}}^\top (V_{\boldsymbol{x}\boldsymbol{x}, k+1} + \mu_1 \boldsymbol{I}_{n_x}) \boldsymbol{f}_{\boldsymbol{x}} + V_{\boldsymbol{x}, k+1}' \cdot \boldsymbol{f}_{\boldsymbol{u}\boldsymbol{x}} \tag{6-3}$$6.2 动力学相对度(Relative Degree)与离散化陷阱
在质点与机器人系统中,控制量通常为加速度 $\boldsymbol{a}_k$,而避障约束是关于几何位置 $\boldsymbol{p}_k$ 的函数 $g(\boldsymbol{p}_k) \le 0$。
若采用标准显式欧拉法 $\boldsymbol{p}_{k+1} = \boldsymbol{p}_k + h \boldsymbol{v}_k, \boldsymbol{v}_{k+1} = \boldsymbol{v}_k + h \boldsymbol{a}_k$,位置 $\boldsymbol{p}_k$ 对当步控制 $\boldsymbol{a}_k$ 的一阶偏导 $\partial \boldsymbol{p}_k / \partial \boldsymbol{a}_k \equiv \boldsymbol{0}$,导致约束雅可比 $\boldsymbol{C}_k = \hat{\boldsymbol{g}}_{\boldsymbol{u}, k} \equiv \boldsymbol{0}$,求解器在控制空间彻底“失明”!
✅ 解决方案:使用具有二阶精度的零阶保持器 (ZOH) 或中点法 (Midpoint RK2):
$$\boldsymbol{p}_{k+1} = \boldsymbol{p}_k + h \boldsymbol{v}_k + \frac{1}{2}h^2 \boldsymbol{a}_k \implies \frac{\partial \boldsymbol{p}_{k+1}}{\partial \boldsymbol{a}_k} = \frac{1}{2}h^2 \boldsymbol{I} \neq \boldsymbol{0}$$ 以 $\boldsymbol{x}_{k+1} = \boldsymbol{f}(\boldsymbol{x}_k, \boldsymbol{u}_k)$ 作为状态安全转移约束,从而赋予 $\boldsymbol{C}_k$ 明确的非零控制灵敏度!
7. 三大经典基准物理系统实验深度剖析
7.1 二维质点避障(Point Mass Double Integrator)
4 状态 2 控制系统,测试单圆形障碍与双圆形窄通道障碍。CDDP 在 300 步时域下迅速收敛到平滑切线绕行最优轨迹。
7.2 二维非完整约束车辆动态避障(2D Car with Kinematic Constraints)
车辆面临转向角速度硬约束 $u^\theta \in [-\pi/2, \pi/2]$ 与匀速横切的动态圆形障碍物。CDDP 自主演化出“先行减速等待、待动态障碍物横穿路口后急加速通过”的高阶时空博弈策略。
7.3 三维十二状态四旋翼飞行器(3D Quadcopter 6-DOF Dynamics)
12 维欠驱动强耦合非线性动力学,控制输入推力非负 $u_i \ge 0$,同时避让两个三维移动球体(一个垂直下坠、一个横向平移)。CDDP 在 5 秒计算预算内实现高精度避碰。
7.4 CDDP vs 对数障碍 DDP vs SNOPT/IPOPT 全景横向评测
| 测试算例与时域参数 | CDDP (本文方法) | 对数障碍 DDP (Log-Barrier) | 直接 SQP (SNOPT) | 核心机理与实验剖析 |
|---|---|---|---|---|
| 质点,单圆障碍 ($h=0.05, N=300$) | 0.065 | 0.042 | 0.073 | 短时域简单凸障碍,三者均能平稳收敛 |
| 质点,双圆障碍 ($h=0.05, N=300$) | 0.28 | 0.64 | 0.43 | 对数障碍在窄通道出现边界振荡与局部较差解 |
| 车辆,动态圆障碍 ($h=0.05, N=200$) | 0.10 | 0.32 | 0.08 | CDDP 成功捕捉“减速等待-加速突破”非凸时空机动 |
| 质点,单圆障碍 ($h=0.03, N=500$) | 0.071 | 18.30 | 0.32 | 长时域下对数障碍彻底发散;SNOPT 求解变慢 |
| 车辆,动态圆障碍 ($h=0.02, N=500$) | 0.21 | 4.80 | 86.00 | SNOPT 在巨型稀疏 NLP 下陷入局部停滞 |
| 四旋翼,固定球 ($h=0.01, N=400$) | 53.69 | 635.53 | 98.28 | CDDP 收敛速度明显超越 SNOPT,终值代价低 45% |
| 四旋翼,双动态球 ($h=0.01, N=400$) | 52.45 | 182.01 | 49.12 | CDDP 在高维欠驱动系统中展现出卓越的约束解算鲁棒性 |
8. 完整 Python / JAX 算法实战架构
以下为严格依循 Xie 2017 经典论文公式与全库标准化规范实现的自包含 CDDP 求解器核心架构:
▶
🐍 非线性约束 DDP (CDDP) 完整 Python 算法实战架构源码
Python 3.9+ · 190 lines
import numpy as np
class ConstrainedDDPSolver:
"""
非线性约束微分动态规划 (Nonlinear CDDP) 求解器
依据 Zhaoming Xie et al. (ICRA 2017 / IEEE TRO) 核心理论推导实现
"""
def __init__(self, dynamics, cost, constraint, nx, nu, horizon):
self.dynamics = dynamics # f(x, u), fx, fu, fxx, fuu, fux
self.cost = cost # l(x, u), lx, lu, lxx, luu, lux, lf, lfx, lfxx
self.constraint = constraint # g(x, u) <= 0, gx, gu
self.nx = nx
self.nu = nu
self.N = horizon
# 正则化参数与信赖域超参数
self.mu1 = 1e-3 # 状态空间 LM 阻尼
self.mu2 = 1e-3 # 控制空间 LM 阻尼
self.beta1 = 0.95
self.beta2 = 0.95
self.alpha1 = 1.05
self.alpha2 = 1.05
self.trust_region_init = 1.0 # 初始信赖域半径 e
self.alpha_trust = 0.8 # 信赖域缩放系数
self.eps_active = 1e-3 # 活跃约束判据公差阈值
def solve(self, x0, u_init, max_iters=50, tol=1e-4):
"""
CDDP 主优化循环 (严格执行可行性正向线搜索与反向 Riccati 扫描)
"""
x_nom, u_nom = self._rollout_initial(x0, u_init)
current_cost = self._calc_total_cost(x_nom, u_nom)
for iteration in range(max_iters):
# 1. 反向通道 (Backward Pass)
k_seq, K_seq, success = self._backward_pass(x_nom, u_nom)
if not success:
# 增大控制阻尼以应对不正定性
self.mu2 *= self.alpha2
continue
# 2. 前向通道 (Forward Pass 带阶段 QP 信赖域与约束可行性守恒)
x_new, u_new, new_cost, step_accepted = self._forward_pass(
x_nom, u_nom, k_seq, K_seq, current_cost
)
if step_accepted:
# 步长接受,收敛阻尼
self.mu1 *= self.beta1
self.mu2 *= self.beta2
d_cost = current_cost - new_cost
current_cost = new_cost
x_nom, u_nom = x_new, u_new
if d_cost < tol:
print(f"CDDP 成功收敛于第 {iteration} 代,最终代价值: {current_cost:.5e}")
break
else:
# 步长拒绝,扩大阻尼
self.mu1 *= self.alpha1
self.mu2 *= self.alpha2
return x_nom, u_nom, current_cost
def _rollout_initial(self, x0, u_init):
x_nom = np.zeros((self.N + 1, self.nx))
x_nom[0] = x0
for k in range(self.N):
x_nom[k + 1] = self.dynamics.f(x_nom[k], u_init[k])
return x_nom, u_init.copy()
def _backward_pass(self, x_nom, u_nom):
k_seq = [None] * self.N
K_seq = [None] * self.N
# 终端价值函数展开
xN = x_nom[self.N]
Vx = self.cost.lfx(xN)
Vxx = self.cost.lfxx(xN) + self.mu1 * np.eye(self.nx)
for k in reversed(range(self.N)):
xk, uk = x_nom[k], u_nom[k]
fx, fu = self.dynamics.fx(xk, uk), self.dynamics.fu(xk, uk)
# 展开 Q 矩阵并注入状态/控制 LM 阻尼
Qx = self.cost.lx(xk, uk) + fx.T @ Vx
Qu = self.cost.lu(xk, uk) + fu.T @ Vx
Qxx = self.cost.lxx(xk, uk) + fx.T @ (Vxx + self.mu1 * np.eye(self.nx)) @ fx
Quu = self.cost.luu(xk, uk) + fu.T @ (Vxx + self.mu1 * np.eye(self.nx)) @ fu + self.mu2 * np.eye(self.nu)
Qux = self.cost.lux(xk, uk) + fu.T @ (Vxx + self.mu1 * np.eye(self.nx)) @ fx
try:
Quu_inv = np.linalg.inv(Quu)
except np.linalg.LinAlgError:
return None, None, False
# 判定候选活跃约束 g_i(x, u) >= -eps
g_val = self.constraint.g(xk, uk)
gx = self.constraint.gx(xk, uk)
gu = self.constraint.gu(xk, uk)
active_idx = np.where(g_val >= -self.eps_active)[0]
if len(active_idx) == 0:
# 无活跃约束:退化为经典标准 iLQR / DDP
k_k = -Quu_inv @ Qu
K_k = -Quu_inv @ Qux
else:
# 存在活跃约束:求解 KKT 鞍点系统与投影增益
gu_act = gu[active_idx, :]
gx_act = gx[active_idx, :]
g_act_val = g_val[active_idx]
# 舒尔补矩阵 S = G_u * Q_uu^{-1} * G_u^T
S = gu_act @ Quu_inv @ gu_act.T
try:
S_inv = np.linalg.inv(S)
except np.linalg.LinAlgError:
return None, None, False
# 投影矩阵 P
P = Quu_inv - Quu_inv @ gu_act.T @ S_inv @ gu_act @ Quu_inv
# 计算灵敏度增益矩阵
K_k = -P @ Qux - Quu_inv @ gu_act.T @ S_inv @ gx_act
k_k = -P @ Qu - Quu_inv @ gu_act.T @ S_inv @ g_act_val
k_seq[k] = k_k
K_seq[k] = K_k
# 更新下一阶段价值函数灵敏度 V_x 与 V_xx
Vx = Qx + K_k.T @ Quu @ k_k + Qux.T @ k_k + K_k.T @ Qu
Vxx = Qxx + K_k.T @ Quu @ K_k + Qux.T @ K_k + K_k.T @ Qux
return k_seq, K_seq, True
def _forward_pass(self, x_nom, u_nom, k_seq, K_seq, current_cost):
e = self.trust_region_init
max_retries = 8
for _ in range(max_retries):
x_temp = np.zeros_like(x_nom)
u_temp = np.zeros_like(u_nom)
x_temp[0] = x_nom[0]
rollout_feasible = True
for k in range(self.N):
dx = x_temp[k] - x_nom[k]
delta_u = k_seq[k] + K_seq[k] @ dx
# 应用盒式信赖域截断
delta_u = np.clip(delta_u, -e, e)
u_temp[k] = u_nom[k] + delta_u
x_temp[k + 1] = self.dynamics.f(x_temp[k], u_temp[k])
# 校验非线性物理约束是否被违背
if np.any(self.constraint.g(x_temp[k + 1], u_temp[k]) > 1e-4):
rollout_feasible = False
break
if not rollout_feasible:
# 缩小信赖域重试
e *= self.alpha_trust
continue
new_cost = self._calc_total_cost(x_temp, u_temp)
if new_cost < current_cost:
return x_temp, u_temp, new_cost, True
else:
return None, None, current_cost, False
return None, None, current_cost, False
def _calc_total_cost(self, x, u):
total = self.cost.lf(x[self.N])
for k in range(self.N):
total += self.cost.l(x[k], u[k])
return total
9. 约束 DDP 流派前沿演进与选型全景决策树
自 Xie 2017 奠定非线性约束 DDP 理论基石以来,学术界围绕非凸收敛性、不可行初值稳健性、李群几何流形与高频实时 MPC 演化出了数个重磅学术流派:
- 若仅有控制量上下限(Box Bounds) $\to$ Box-QP iLQR (Tassa 2014):微秒级极速解析截断,工业落地首选;
- 若面临复杂非线性避障与状态约束,且易获取可行初值 $\to$ Xie 2017 CDDP:活跃集灵敏度解析求解,单调严格保可行性;
- 若系统运行在非欧几何流形 $\mathrm{SO}(3)/\mathrm{SE}(3)$ 上 $\to$ Alcan 2023 / Boutselis 2018:李群切空间流形约束 DDP;
- 若初始初值不可行或存在复杂多接触碰撞 $\to$ Howell 2019 ALTRO / Jallet 2022 PROX-DDP:增广拉格朗日多重打靶与主-对偶近端乘子法;
- 若面临极端非凸迷宫障碍、极易死锁 $\to$ Kim 2024 MPPI-IPDDP:GPU 并行采样全局粗搜 + 原对偶内点法局部二次精修。
10. 权威参考文献与延伸阅读
-
[1]
Zhaoming Xie, C. Karen Liu, Kris Hauser. "Differential dynamic programming with nonlinear constraints." IEEE International Conference on Robotics and Automation (ICRA), pp. 695–702, 2017. (本文核心奠基文献)
-
[2]
David Q. Mayne. "A second-order gradient method for determining optimal trajectories of non-linear discrete-time systems." International Journal of Control, 3(1):85–95, 1966.
-
[3]
David H. Jacobson, David Q. Mayne. Differential Dynamic Programming. Elsevier, 1970.
-
[4]
Yuval Tassa, Nicolas Mansard, Emanuel Todorov. "Control-limited differential dynamic programming." IEEE International Conference on Robotics and Automation (ICRA), pp. 1168–1175, 2014.
-
[5]
Taylor A. Howell, Brian E. Jackson, Zachary Manchester. "ALTRO: A fast solver for constrained trajectory optimization." IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), pp. 7674–7681, 2019.
-
[6]
Andrei Pavlov, Iman Shames, Chris Manzie. "Interior point differential dynamic programming." IEEE Transactions on Robotics (T-RO), 37(6):2105–2120, 2021.
-
[7]
Wilson Jallet, Nicolas Mansard, Emanuel Todorov. "PROX-DDP: Proximal constrained differential dynamic programming." IEEE International Conference on Robotics and Automation (ICRA), 2022.
-
[8]
Gokhan Alcan, Martino Risiglione, Brian E. Jackson, Taylor A. Howell. "Constrained differential dynamic programming on manifolds." IEEE Transactions on Robotics (T-RO), 2023.
-
[9]
Beomjoon Kim, David Fan, Jongeun Choi. "MPPI-IPDDP: Real-time nonlinear model predictive control via sample-based and gradient-based optimization." IEEE Robotics and Automation Letters (RA-L), 2024.