robot_control_tutorial

第9章:模型预测控制基础

模型预测控制(Model Predictive Control, MPC)已成为现代机器人控制的基石技术。不同于传统的反馈控制器,MPC通过在线求解有限时域优化问题,能够系统性地处理约束、预见未来行为,并实现多目标优化。本章将深入探讨MPC的核心概念,从问题表述到稳定性保证,并通过自动驾驶车辆的案例展示其实际应用。

9.1 MPC问题表述与求解

9.1.1 预测模型与状态预测

MPC的核心是基于系统模型对未来状态进行预测。考虑离散时间系统:

\[\mathbf{x}_{k+1} = f(\mathbf{x}_k, \mathbf{u}_k)\]

其中 $\mathbf{x}_k \in \mathbb{R}^n$ 为状态向量,$\mathbf{u}_k \in \mathbb{R}^m$ 为控制输入。

对于预测时域 $N$,我们构建状态预测序列:

\[\mathbf{x}_{k+i|k} = f(\mathbf{x}_{k+i-1|k}, \mathbf{u}_{k+i-1|k}), \quad i = 1, \ldots, N\]
其中 $\mathbf{x}_{k+i k}$ 表示在时刻 $k$ 对时刻 $k+i$ 状态的预测。
时刻 k:
    |
    v
[x_k] --u_k--> [x_{k+1|k}] --u_{k+1|k}--> ... --u_{k+N-1|k}--> [x_{k+N|k}]
    ^                                                               ^
    |                                                               |
  当前状态                                                      终端状态

模型类型与选择:

在机器人控制中,常见的预测模型包括:

  1. 线性时不变(LTI)模型: \(\mathbf{x}_{k+1} = \mathbf{A}\mathbf{x}_k + \mathbf{B}\mathbf{u}_k\) 适用于工作点附近的小信号控制,计算效率高,但精度受限于线性化误差。

  2. 线性时变(LTV)模型: \(\mathbf{x}_{k+1} = \mathbf{A}_k\mathbf{x}_k + \mathbf{B}_k\mathbf{u}_k\) 通过沿参考轨迹线性化获得,能够处理大范围运动,是轨迹跟踪MPC的标准选择。

  3. 非线性模型: 保留系统的完整非线性动态,精度最高但计算代价大。对于机器人系统,通常包含:

    • 刚体动力学:$\mathbf{M}(\mathbf{q})\ddot{\mathbf{q}} + \mathbf{C}(\mathbf{q}, \dot{\mathbf{q}})\dot{\mathbf{q}} + \mathbf{g}(\mathbf{q}) = \boldsymbol{\tau}$
    • 接触动力学:互补性约束、摩擦锥约束
    • 执行器动力学:电机模型、液压系统模型

离散化方法:

连续时间模型 $\dot{\mathbf{x}} = f_c(\mathbf{x}, \mathbf{u})$ 的离散化直接影响预测精度:

  1. 欧拉前向法(一阶精度): \(\mathbf{x}_{k+1} = \mathbf{x}_k + T_s f_c(\mathbf{x}_k, \mathbf{u}_k)\) 简单但精度低,需要小采样时间。

  2. 零阶保持(ZOH)精确离散化: 对线性系统 $\dot{\mathbf{x}} = \mathbf{A}_c\mathbf{x} + \mathbf{B}_c\mathbf{u}$: \(\mathbf{A} = e^{\mathbf{A}_c T_s}, \quad \mathbf{B} = \int_0^{T_s} e^{\mathbf{A}_c \tau} d\tau \cdot \mathbf{B}_c\) 精确但仅适用于线性系统。

  3. Runge-Kutta方法(高阶精度): RK4提供四阶精度,是非线性MPC的常用选择: \(\mathbf{x}_{k+1} = \mathbf{x}_k + \frac{T_s}{6}(\mathbf{k}_1 + 2\mathbf{k}_2 + 2\mathbf{k}_3 + \mathbf{k}_4)\) 其中 $\mathbf{k}_i$ 为中间导数评估。

预测误差累积:

预测误差随时域增长而累积,主要来源包括:

误差传播分析: \(\mathbf{e}_{k+i|k} = \prod_{j=0}^{i-1}\left(\mathbf{I} + T_s\frac{\partial f}{\partial \mathbf{x}}\bigg|_{j}\right)\mathbf{e}_{k|k} + \sum_{j=0}^{i-1}\boldsymbol{\delta}_{k+j}\)

其中 $\mathbf{e}$ 为预测误差,$\boldsymbol{\delta}$ 为单步误差。这解释了为什么MPC需要滚动时域策略来不断纠正累积误差。

9.1.2 代价函数设计

MPC的优化目标通常采用二次型代价函数:

\[J = \sum_{i=0}^{N-1} \left[ (\mathbf{x}_{k+i|k} - \mathbf{x}_{\text{ref}})^T \mathbf{Q} (\mathbf{x}_{k+i|k} - \mathbf{x}_{\text{ref}}) + \mathbf{u}_{k+i|k}^T \mathbf{R} \mathbf{u}_{k+i|k} \right] + (\mathbf{x}_{k+N|k} - \mathbf{x}_{\text{ref}})^T \mathbf{P} (\mathbf{x}_{k+N|k} - \mathbf{x}_{\text{ref}})\]

其中:

权重矩阵的选择直接影响控制性能:

扩展代价函数形式:

实际机器人控制中,常需要更复杂的代价函数:

  1. 增量控制代价(减少控制抖动): \(J_{\Delta u} = \sum_{i=0}^{N-2} (\mathbf{u}_{k+i+1|k} - \mathbf{u}_{k+i|k})^T \mathbf{R}_{\Delta} (\mathbf{u}_{k+i+1|k} - \mathbf{u}_{k+i|k})\) 这在机械系统中特别重要,可以减少执行器磨损和能量消耗。

  2. 输出跟踪代价: 当只关心特定输出 $\mathbf{y} = \mathbf{C}\mathbf{x}$ 时: \(J_y = \sum_{i=0}^{N-1} (\mathbf{y}_{k+i|k} - \mathbf{y}_{\text{ref}})^T \mathbf{Q}_y (\mathbf{y}_{k+i|k} - \mathbf{y}_{\text{ref}})\) 例如,只跟踪末端执行器位置而不约束关节角度。

  3. 经济代价函数: 直接优化经济指标而非跟踪误差: \(J_{\text{econ}} = \sum_{i=0}^{N-1} c(\mathbf{x}_{k+i|k}, \mathbf{u}_{k+i|k})\) 其中 $c(\cdot)$ 可能表示能量消耗、生产率等。注意经济MPC可能不存在稳态工作点。

  4. 鲁棒代价(最坏情况优化): \(J_{\text{robust}} = \max_{\mathbf{w} \in \mathcal{W}} J(\mathbf{x}, \mathbf{u}, \mathbf{w})\) 其中 $\mathbf{w}$ 为有界扰动,$\mathcal{W}$ 为不确定性集合。

权重选择策略:

  1. 基于物理尺度归一化: \(q_{ii} = \frac{1}{\sigma_i^2}, \quad r_{jj} = \frac{1}{\rho_j^2}\) 其中 $\sigma_i$ 为状态 $i$ 的可接受偏差,$\rho_j$ 为控制 $j$ 的典型范围。

  2. 基于频域分析: 通过期望的闭环带宽 $\omega_b$ 设计: \(\frac{\mathbf{Q}}{\mathbf{R}} \approx \omega_b^2\)

  3. LQR反向设计: 从期望的闭环极点出发,通过逆Riccati方程求解权重。

  4. 多目标帕累托优化: 系统地探索不同权重组合,生成帕累托前沿:

    性能
     ^
     |  o  <- 激进控制
     | o o
     |o o o  <- 帕累托前沿  
     |o o o o
     +--------> 能量消耗
          ^ 保守控制
    

时变权重策略:

根据任务阶段调整权重可以改善性能:

\[\mathbf{Q}_i = \begin{cases} \mathbf{Q}_{\text{approach}} & \text{if } \|\mathbf{e}\| > \epsilon_{\text{far}} \\ \mathbf{Q}_{\text{track}} & \text{if } \epsilon_{\text{near}} < \|\mathbf{e}\| \leq \epsilon_{\text{far}} \\ \mathbf{Q}_{\text{precise}} & \text{if } \|\mathbf{e}\| \leq \epsilon_{\text{near}} \end{cases}\]

这允许系统在远离目标时快速接近,在接近目标时精确控制。

9.1.3 约束处理

MPC的一大优势是能够显式处理各种约束:

状态约束: \(\mathbf{x}_{\min} \leq \mathbf{x}_{k+i|k} \leq \mathbf{x}_{\max}, \quad i = 1, \ldots, N\)

输入约束: \(\mathbf{u}_{\min} \leq \mathbf{u}_{k+i|k} \leq \mathbf{u}_{\max}, \quad i = 0, \ldots, N-1\)

输入变化率约束: \(\Delta\mathbf{u}_{\min} \leq \mathbf{u}_{k+i|k} - \mathbf{u}_{k+i-1|k} \leq \Delta\mathbf{u}_{\max}\)

混合约束: \(\mathbf{G}\mathbf{x}_{k+i|k} + \mathbf{H}\mathbf{u}_{k+i|k} \leq \mathbf{g}\)

机器人特定约束:

  1. 关节限位与速度限制: \(\mathbf{q}_{\min} \leq \mathbf{q} \leq \mathbf{q}_{\max}, \quad \dot{\mathbf{q}}_{\min} \leq \dot{\mathbf{q}} \leq \dot{\mathbf{q}}_{\max}\) 保护机械结构,避免碰撞和过载。

  2. 扭矩/力矩约束: \(\boldsymbol{\tau}_{\min} \leq \boldsymbol{\tau} \leq \boldsymbol{\tau}_{\max}\) 反映执行器能力限制。对于冗余机器人,还需考虑零空间投影。

  3. 工作空间约束: 末端执行器位置约束: \(\mathbf{p}_{\text{ee}} = \mathbf{f}_{\text{kin}}(\mathbf{q}) \in \mathcal{W}_{\text{safe}}\) 其中 $\mathcal{W}_{\text{safe}}$ 为安全工作空间。

  4. 接触力约束(摩擦锥): \(\mathbf{f}_{\text{contact}} \in \mathcal{FC}(\mu) = \{\mathbf{f} : f_z \geq 0, \sqrt{f_x^2 + f_y^2} \leq \mu f_z\}\) 确保接触稳定,防止滑动。

  5. ZMP约束(双足机器人): \(\mathbf{p}_{\text{ZMP}} \in \mathcal{P}_{\text{support}}\) 零力矩点必须在支撑多边形内以保持平衡。

  6. 碰撞避免约束: \(d(\mathbf{p}_i, \mathcal{O}_j) \geq d_{\text{safe}}, \quad \forall i \in \text{links}, j \in \text{obstacles}\) 其中 $d(\cdot)$ 为距离函数,可用有符号距离场(SDF)高效计算。

约束优先级与软化:

实际系统中,并非所有约束都同等重要:

  1. 硬约束(必须满足):
    • 关节限位(物理极限)
    • 碰撞避免(安全)
    • 执行器饱和(物理能力)
  2. 软约束(可以违反但有惩罚):
    • 舒适性约束(加速度限制)
    • 能效约束
    • 路径偏差

软约束实现: \(\min J + \sum_{i} \rho_i \|\mathbf{s}_i\|_p\) \(\text{s.t.} \quad \mathbf{g}_i(\mathbf{x}, \mathbf{u}) \leq \mathbf{s}_i, \quad \mathbf{s}_i \geq 0\)

其中 $\mathbf{s}_i$ 为松弛变量,$\rho_i$ 为惩罚权重,$p \in {1, 2, \infty}$ 决定惩罚类型。

非凸约束处理:

机器人系统常遇到非凸约束:

  1. 障碍物避免(非凸): 原始形式:$|\mathbf{p} - \mathbf{p}{\text{obs}}| \geq r{\text{safe}}$

    线性化近似(在当前点 $\mathbf{p}0$): \(\mathbf{n}^T(\mathbf{p} - \mathbf{p}_{\text{obs}}) \geq r_{\text{safe}}\) 其中 $\mathbf{n} = (\mathbf{p}_0 - \mathbf{p}{\text{obs}})/|\mathbf{p}0 - \mathbf{p}{\text{obs}}|$。

  2. 混合整数表示: 使用二进制变量 $b_i \in {0, 1}$ 选择约束: \(\mathbf{g}_i(\mathbf{x}) \leq M(1 - b_i), \quad \sum_i b_i = 1\) 其中 $M$ 为大数。这将问题转换为混合整数规划(MIP)。

  3. 序列凸优化(SCvx): 迭代线性化非凸约束,添加信任域: \(\|\mathbf{x} - \mathbf{x}^{(k)}\| \leq \delta^{(k)}\) 随迭代收缩信任域半径 $\delta$。

约束激活与去激活:

约束激活模式:
时间 →
约束1: ----[激活]----[非激活]----
约束2: [非激活]----[激活]----[激活]
约束3: ----[非激活]----[激活]----
        ↑            ↑            ↑
      自由运动   避障模式   接触模式

不同模式下的约束集合变化需要平滑过渡,避免控制跳变。

9.1.4 滚动时域原理

MPC采用滚动时域(Receding Horizon)策略:

  1. 在每个采样时刻 $k$,测量当前状态 $\mathbf{x}_k$
  2. 求解有限时域优化问题: \(\min_{\mathbf{U}_k} J(\mathbf{x}_k, \mathbf{U}_k) \quad \text{s.t.} \quad \text{约束条件}\) 其中 $\mathbf{U}k = [\mathbf{u}{k|k}, \mathbf{u}{k+1|k}, \ldots, \mathbf{u}{k+N-1|k}]$
  3. 应用优化序列的第一个控制输入:$\mathbf{u}k = \mathbf{u}{k k}^*$
  4. 时域向前滚动,重复步骤1-3
时刻 k:   [========预测时域========]
          u_k^*  u_{k+1}  ...  u_{k+N-1}
             ↓
时刻 k+1:      [========预测时域========]
               u_{k+1}^*  u_{k+2}  ...  u_{k+N}

这种策略提供了反馈机制,能够补偿模型误差和外部扰动。

滚动时域的本质优势:

  1. 隐式反馈控制: 虽然MPC求解开环优化问题,但通过不断更新初始条件并重新优化,实现了闭环控制: \(\mathbf{u}_k = \kappa_{\text{MPC}}(\mathbf{x}_k; \mathbf{x}_{\text{ref}}, \mathcal{C})\) 其中 $\kappa_{\text{MPC}}$ 是隐式定义的非线性反馈律。

  2. 扰动抑制: 考虑带扰动的系统 $\mathbf{x}_{k+1} = f(\mathbf{x}_k, \mathbf{u}_k) + \mathbf{w}_k$:
    • 传统开环:扰动累积导致偏差增大
    • MPC滚动时域:每步测量实际状态,自动补偿累积误差

    扰动抑制能力取决于重新规划频率与系统动态的时间尺度匹配。

  3. 时变系统适应: 对于时变参考轨迹或约束,MPC自然地在每个时刻考虑最新信息: \(J_k = \sum_{i=0}^{N-1} l(\mathbf{x}_{k+i|k}, \mathbf{u}_{k+i|k}, \mathbf{r}_{k+i|k})\) 其中 $\mathbf{r}_{k+i|k}$ 是在时刻 $k$ 已知的未来参考轨迹。

预测时域长度选择:

预测时域 $N$ 的选择至关重要:

  1. 覆盖主要动态: \(N \cdot T_s \geq (2-3) \cdot T_{\text{settling}}\) 其中 $T_{\text{settling}}$ 是系统调节时间。

  2. 考虑约束激活: 时域应足够长以”看到”约束的影响:
    • 速度约束:需要看到加速和减速过程
    • 障碍物:需要看到绕行路径
    • 终端约束:需要足够时间到达目标
  3. 计算复杂度权衡:
    • 线性MPC:$O(N^3)$ 用于QP求解
    • 非线性MPC:$O(N \cdot n_{\text{iter}})$ 用于NLP迭代
    • 实时约束:$N \cdot T_s$ 计算时间 < $T_s$ 采样时间
  4. 变时域策略:
    近期密集,远期稀疏:
    [Δt][Δt][Δt][2Δt][2Δt][4Δt][4Δt]
    └─近期控制─┘└─中期预测─┘└远期趋势┘
    

    这种策略在保持计算效率的同时增加预见性。

控制时域与预测时域:

引入控制时域 $M \leq N$ 可以降低优化变量维度:

\[\mathbf{u}_{k+i|k} = \begin{cases} \text{优化变量} & i = 0, \ldots, M-1 \\ \mathbf{u}_{k+M-1|k} & i = M, \ldots, N-1 \quad \text{(保持常值)} \end{cases}\]

或使用终端控制律: \(\mathbf{u}_{k+i|k} = \mathbf{K}(\mathbf{x}_{k+i|k} - \mathbf{x}_{\text{ref}}), \quad i \geq M\)

这减少了优化变量从 $m \times N$ 到 $m \times M$,显著降低计算负担。

初始猜测与热启动:

良好的初始猜测加速收敛:

  1. 平移策略(最常用): \(\mathbf{U}_k^{(0)} = [\mathbf{u}_{k+1|k-1}^*, \ldots, \mathbf{u}_{k+N-1|k-1}^*, \mathbf{u}_{k+N-1|k-1}^*]\) 使用上一时刻的解平移一步。

  2. 轨迹库: 根据当前状态从预计算的轨迹库中选择最接近的作为初始猜测。

  3. 学习预测: 使用神经网络预测良好初始解: \(\mathbf{U}_k^{(0)} = \mathcal{NN}(\mathbf{x}_k, \mathbf{x}_{\text{ref}})\)

9.2 线性MPC与QP求解器

9.2.1 线性化与二次规划转换

对于线性系统或线性化后的系统:

\[\mathbf{x}_{k+1} = \mathbf{A}\mathbf{x}_k + \mathbf{B}\mathbf{u}_k\]

可以将预测方程写成紧凑形式:

\[\mathbf{X} = \mathbf{\Phi}\mathbf{x}_k + \mathbf{\Gamma}\mathbf{U}\]

其中: \(\mathbf{X} = \begin{bmatrix} \mathbf{x}_{k+1|k} \\ \mathbf{x}_{k+2|k} \\ \vdots \\ \mathbf{x}_{k+N|k} \end{bmatrix}, \quad \mathbf{U} = \begin{bmatrix} \mathbf{u}_{k|k} \\ \mathbf{u}_{k+1|k} \\ \vdots \\ \mathbf{u}_{k+N-1|k} \end{bmatrix}\)

\[\mathbf{\Phi} = \begin{bmatrix} \mathbf{A} \\ \mathbf{A}^2 \\ \vdots \\ \mathbf{A}^N \end{bmatrix}, \quad \mathbf{\Gamma} = \begin{bmatrix} \mathbf{B} & \mathbf{0} & \cdots & \mathbf{0} \\ \mathbf{AB} & \mathbf{B} & \cdots & \mathbf{0} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{A}^{N-1}\mathbf{B} & \mathbf{A}^{N-2}\mathbf{B} & \cdots & \mathbf{B} \end{bmatrix}\]

代价函数转换为标准QP形式:

\[J = \frac{1}{2}\mathbf{U}^T\mathbf{H}\mathbf{U} + \mathbf{f}^T\mathbf{U} + c\]

其中:

稠密vs稀疏形式:

上述为稠密形式,消除了状态变量。稀疏形式保留状态作为优化变量:

$$\min_{\mathbf{X}, \mathbf{U}} \sum_{i=0}^{N-1} [\mathbf{x}_{k+i k}^T\mathbf{Q}\mathbf{x}_{k+i k} + \mathbf{u}_{k+i k}^T\mathbf{R}\mathbf{u}_{k+i k}] + \mathbf{x}_{k+N k}^T\mathbf{P}\mathbf{x}_{k+N k}$$
$$\text{s.t.} \quad \mathbf{x}_{k+i+1 k} = \mathbf{A}\mathbf{x}_{k+i k} + \mathbf{B}\mathbf{u}_{k+i k}$$      

稀疏形式的优势:

线性时变(LTV)系统处理:

对于沿轨迹线性化的系统: \(\mathbf{x}_{k+1} = \mathbf{A}_k\mathbf{x}_k + \mathbf{B}_k\mathbf{u}_k + \mathbf{c}_k\)

其中 $\mathbf{c}_k$ 为线性化偏移项。预测矩阵变为:

\[\mathbf{\Phi} = \begin{bmatrix} \mathbf{A}_0 \\ \mathbf{A}_1\mathbf{A}_0 \\ \vdots \\ \prod_{i=0}^{N-1}\mathbf{A}_i \end{bmatrix}, \quad \mathbf{\Gamma} = \begin{bmatrix} \mathbf{B}_0 & 0 & \cdots \\ \mathbf{A}_1\mathbf{B}_0 & \mathbf{B}_1 & \cdots \\ \vdots & \vdots & \ddots \end{bmatrix}\]

需要在每个MPC周期重新计算这些矩阵,计算复杂度 $O(N^2n^2m)$。

约束的矩阵表示:

将所有约束整理为统一形式: \(\mathbf{A}_{\text{ineq}}\mathbf{U} \leq \mathbf{b}_{\text{ineq}}\)

包含:

  1. 输入约束:$\mathbf{u}{\min} \leq \mathbf{u}_i \leq \mathbf{u}{\max}$
  2. 状态约束(通过预测方程消除):$\mathbf{x}{\min} \leq \mathbf{\Gamma}\mathbf{U} + \mathbf{\Phi}\mathbf{x}_0 \leq \mathbf{x}{\max}$
  3. 输入变化率:$\Delta\mathbf{u}{\min} \leq \mathbf{D}\mathbf{U} \leq \Delta\mathbf{u}{\max}$

其中差分矩阵: \(\mathbf{D} = \begin{bmatrix} \mathbf{I} & 0 & \cdots & 0 \\ -\mathbf{I} & \mathbf{I} & \cdots & 0 \\ \vdots & \ddots & \ddots & \vdots \\ 0 & \cdots & -\mathbf{I} & \mathbf{I} \end{bmatrix}\)

数值调理与缩放:

QP问题的数值性质影响求解效率:

  1. Hessian矩阵条件数: \(\kappa(\mathbf{H}) = \frac{\lambda_{\max}(\mathbf{H})}{\lambda_{\min}(\mathbf{H})}\) 目标:$\kappa < 10^6$,否则需要预调理。

  2. 变量缩放: \(\tilde{\mathbf{u}} = \mathbf{S}_u\mathbf{u}, \quad \tilde{\mathbf{x}} = \mathbf{S}_x\mathbf{x}\) 选择 $\mathbf{S}_u, \mathbf{S}_x$ 使变量在 $[-1, 1]$ 范围。

  3. 约束归一化: 将约束除以其典型值,使所有约束具有相似的数量级。

  4. Cholesky因子化预计算: 对于固定的 $\mathbf{H}$,预计算 $\mathbf{H} = \mathbf{L}\mathbf{L}^T$,加速求解。

9.2.2 主动集法与内点法

主动集法(Active Set Method):

主动集法通过迭代识别活跃约束来求解QP:

  1. 初始化工作集 $\mathcal{W}_0$(活跃约束集合)
  2. 求解等式约束子问题
  3. 检查KKT条件:
    • 如果满足,得到最优解
    • 否则,更新工作集:添加违反约束或移除非活跃约束
  4. 重复步骤2-3

优点:

缺点:

内点法(Interior Point Method):

内点法通过障碍函数将约束优化转换为无约束优化:

\[\min_{\mathbf{U}} J(\mathbf{U}) - \mu \sum_i \log(s_i)\]

其中 $s_i$ 为松弛变量,$\mu$ 为障碍参数。

通过牛顿法求解KKT系统: \(\begin{bmatrix} \mathbf{H} & \mathbf{A}^T \\ \mathbf{A} & -\mathbf{S}\mathbf{Z}^{-1} \end{bmatrix} \begin{bmatrix} \Delta\mathbf{U} \\ \Delta\mathbf{\lambda} \end{bmatrix} = - \begin{bmatrix} \nabla J + \mathbf{A}^T\mathbf{\lambda} \\ \mathbf{A}\mathbf{U} - \mathbf{b} + \mathbf{s} \end{bmatrix}\)

优点:

缺点:

9.2.3 快速QP求解器

OSQP(Operator Splitting Quadratic Program):

OSQP基于交替方向乘子法(ADMM),特别适合嵌入式系统:

算法流程:

  1. 将QP转换为标准形式
  2. 应用ADMM迭代: \(\mathbf{x}^{k+1} = (\mathbf{P} + \sigma\mathbf{I})^{-1}(\mathbf{q} + \sigma(\mathbf{z}^k - \mathbf{y}^k))\) \(\mathbf{z}^{k+1} = \Pi_{\mathcal{C}}(\mathbf{A}\mathbf{x}^{k+1} + \mathbf{y}^k)\) \(\mathbf{y}^{k+1} = \mathbf{y}^k + \mathbf{A}\mathbf{x}^{k+1} - \mathbf{z}^{k+1}\)

其中 $\Pi_{\mathcal{C}}$ 为投影算子,$\sigma$ 为惩罚参数。

特点:

qpOASES:

qpOASES采用在线主动集策略,专为MPC设计:

核心特性:

热启动策略:
时刻 k:   活跃集 W_k → 最优解 U_k*
            ↓ (传递)
时刻 k+1: 初始活跃集 W_{k+1}^0 ≈ W_k → 快速收敛到 U_{k+1}*

求解器选择指南:

特性 OSQP qpOASES 内点法求解器
问题规模 中小
精度要求
热启动 最好 一般
内存占用
适用场景 嵌入式MPC 快速MPC 离线计算

9.3 稳定性与递归可行性

9.3.1 终端约束与终端代价

为保证闭环稳定性,MPC通常采用以下策略之一:

策略1:终端等式约束

强制终端状态到达平衡点: \(\mathbf{x}_{k+N|k} = \mathbf{x}_{\text{eq}}\)

优点:稳定性证明简单 缺点:可行域可能很小

策略2:终端不等式约束

终端状态必须进入终端集 $\mathcal{X}_f$: \(\mathbf{x}_{k+N|k} \in \mathcal{X}_f\)

其中 $\mathcal{X}_f$ 为正不变集。

策略3:终端代价函数

选择终端代价 $V_f(\mathbf{x})$ 满足:

  1. $V_f(\mathbf{A}\mathbf{x} + \mathbf{B}\kappa(\mathbf{x})) - V_f(\mathbf{x}) \leq -l(\mathbf{x}, \kappa(\mathbf{x}))$
  2. $V_f(\mathbf{x}) \geq \alpha|\mathbf{x}|^2$

其中 $\kappa(\mathbf{x})$ 为局部控制律,$l(\cdot)$ 为阶段代价。

常用选择:$V_f(\mathbf{x}) = \mathbf{x}^T\mathbf{P}\mathbf{x}$,其中 $\mathbf{P}$ 满足离散Lyapunov方程: \((\mathbf{A} + \mathbf{B}\mathbf{K})^T\mathbf{P}(\mathbf{A} + \mathbf{B}\mathbf{K}) - \mathbf{P} = -(\mathbf{Q} + \mathbf{K}^T\mathbf{R}\mathbf{K})\)

9.3.2 Lyapunov稳定性分析

定理(MPC稳定性):

考虑MPC问题,如果:

  1. 优化问题在 $k=0$ 时可行
  2. 采用合适的终端约束/代价
  3. 系统模型准确

则闭环系统渐近稳定,且最优值函数 $V^*(\mathbf{x})$ 是Lyapunov函数。

证明思路:

设 $\mathbf{U}k^* = [\mathbf{u}{k k}^*, \ldots, \mathbf{u}_{k+N-1 k}^*]$ 为时刻 $k$ 的最优解。

构造候选解: \(\tilde{\mathbf{U}}_{k+1} = [\mathbf{u}_{k+1|k}^*, \ldots, \mathbf{u}_{k+N-1|k}^*, \kappa(\mathbf{x}_{k+N|k}^*)]\)

其中 $\kappa(\cdot)$ 为终端控制律。

由于终端约束设计,$\tilde{\mathbf{U}}_{k+1}$ 可行,且: \(V^*(\mathbf{x}_{k+1}) \leq J(\mathbf{x}_{k+1}, \tilde{\mathbf{U}}_{k+1}) \leq V^*(\mathbf{x}_k) - l(\mathbf{x}_k, \mathbf{u}_k^*)\)

因此 $V^*$ 单调递减,系统稳定。

9.3.3 不变集理论

最大输出可许集(Maximal Output Admissible Set):

定义: \(\mathcal{O}_{\infty} = \{\mathbf{x} \in \mathbb{R}^n : \mathbf{A}^i\mathbf{x} \in \mathcal{X}, \forall i \geq 0\}\)

其中 $\mathcal{X}$ 为状态约束集。

计算算法:

  1. 初始化 $\Omega_0 = \mathcal{X}$
  2. 迭代:$\Omega_{k+1} = \mathcal{X} \cap {\mathbf{x} : \mathbf{A}\mathbf{x} \in \Omega_k}$
  3. 当 $\Omega_{k+1} = \Omega_k$ 时,$\mathcal{O}_{\infty} = \Omega_k$

控制不变集(Control Invariant Set):

集合 $\mathcal{C}$ 是控制不变的,如果: \(\forall \mathbf{x} \in \mathcal{C}, \exists \mathbf{u} \in \mathcal{U} : f(\mathbf{x}, \mathbf{u}) \in \mathcal{C}\)

不变集示意图:
     ╱────────╲
   ╱            ╲
  │   x(t) →    │  ← 轨迹始终在集合内
  │      ↘      │
  │    x(t+1)   │
   ╲            ╱
     ╲────────╱
      不变集 C

递归可行性保证:

如果:

  1. 初始状态 $\mathbf{x}_0 \in \mathcal{F}_N$(N步可行域)
  2. 终端集 $\mathcal{X}_f$ 是控制不变的
  3. $\mathcal{X}_f \subseteq \mathcal{F}_N$

则MPC问题递归可行,即若时刻 $k$ 可行,则时刻 $k+1$ 必可行。

9.4 案例研究:自动驾驶车辆的MPC实现

9.4.1 车辆动力学模型

考虑自动驾驶车辆的运动学自行车模型:

\[\begin{aligned} \dot{x} &= v \cos(\psi + \beta) \\ \dot{y} &= v \sin(\psi + \beta) \\ \dot{\psi} &= \frac{v}{l_r} \sin(\beta) \\ \dot{v} &= a \\ \beta &= \arctan\left(\frac{l_r}{l_f + l_r} \tan(\delta)\right) \end{aligned}\]

其中:

车辆模型示意图:
        前轮
         ↑ δ
    ┌────┴────┐
    │    ●    │ ← 质心
    │  ↙ β    │
    └─────────┘
        后轮

离散化模型(采样时间 $T_s = 0.1$秒): \(\mathbf{x}_{k+1} = \mathbf{x}_k + T_s \cdot f(\mathbf{x}_k, \mathbf{u}_k)\)

9.4.2 MPC控制器设计

状态向量: \(\mathbf{x} = [x, y, \psi, v]^T\)

控制输入: \(\mathbf{u} = [\delta, a]^T\)

约束条件:

代价函数设计:

\[J = \sum_{i=0}^{N-1} \left[ w_e e_{i}^2 + w_{\psi} e_{\psi,i}^2 + w_v (v_i - v_{\text{ref}})^2 + w_{\delta} \delta_i^2 + w_a a_i^2 + w_{\dot{\delta}} \dot{\delta}_i^2 + w_{\dot{a}} \dot{a}_i^2 \right]\]

其中:

9.4.3 实时实现策略

1. 线性化与QP转换:

在每个时刻,围绕参考轨迹线性化: \(\mathbf{A}_k = \frac{\partial f}{\partial \mathbf{x}}\bigg|_{\mathbf{x}_{\text{ref},k}, \mathbf{u}_{\text{ref},k}}, \quad \mathbf{B}_k = \frac{\partial f}{\partial \mathbf{u}}\bigg|_{\mathbf{x}_{\text{ref},k}, \mathbf{u}_{\text{ref},k}}\)

2. 预测时域选择:

3. 求解器配置(OSQP):

osqp_settings:
  - rho: 0.1          # ADMM步长
  - eps_abs: 1e-3     # 绝对精度
  - eps_rel: 1e-3     # 相对精度
  - max_iter: 100     # 最大迭代
  - warm_start: true  # 热启动
  - adaptive_rho: true # 自适应步长

9.4.4 性能分析

场景1:高速公路车道保持

条件:

性能指标:

场景2:紧急避障

条件:

性能指标:

9.4.5 实现要点

1. 坐标系转换:

将全局坐标转换到Frenet坐标系:

全局坐标系 (x, y)
     ↓
Frenet坐标系 (s, d)
s: 沿轨迹的纵向距离
d: 横向偏差

2. 参考轨迹生成:

使用五次多项式拟合: \(d(s) = a_0 + a_1s + a_2s^2 + a_3s^3 + a_4s^4 + a_5s^5\)

边界条件:

3. 延迟补偿:

考虑执行延迟 $\tau$(典型值20-50ms): \(\mathbf{x}_{\text{init}} = \mathbf{x}_{\text{current}} + \tau \cdot f(\mathbf{x}_{\text{current}}, \mathbf{u}_{\text{prev}})\)

4. 故障安全机制:

if solver_time > time_limit:
    use_backup_controller()  # PID备用控制器
elif not is_feasible(solution):
    apply_emergency_brake()   # 紧急制动
else:
    apply_mpc_control()       # 正常MPC控制

9.5 本章小结

本章系统介绍了模型预测控制的基础理论与实践:

核心概念:

关键公式:

  1. MPC优化问题: \(\min_{\mathbf{U}} \sum_{i=0}^{N-1} l(\mathbf{x}_{i|k}, \mathbf{u}_{i|k}) + V_f(\mathbf{x}_{N|k})\) \(\text{s.t.} \quad \mathbf{x}_{i+1|k} = f(\mathbf{x}_{i|k}, \mathbf{u}_{i|k}), \quad \text{约束条件}\)

  2. 线性MPC的QP形式: \(\min_{\mathbf{U}} \frac{1}{2}\mathbf{U}^T\mathbf{H}\mathbf{U} + \mathbf{f}^T\mathbf{U} \quad \text{s.t.} \quad \mathbf{A}_{\text{ineq}}\mathbf{U} \leq \mathbf{b}_{\text{ineq}}\)

  3. 稳定性条件:

    • 终端代价满足Lyapunov递减条件
    • 终端集为控制不变集
    • 优化问题递归可行

实现要点:

9.6 常见陷阱与错误

陷阱1:预测时域选择不当

错误表现:

解决方案:

陷阱2:权重矩阵调试困难

错误表现:

调试技巧:

  1. 从对角矩阵开始:$\mathbf{Q} = \text{diag}(q_1, q_2, \ldots)$
  2. 归一化权重:$q_i = 1/\sigma_i^2$,其中$\sigma_i$为可接受偏差
  3. 使用LQR设计初始权重

陷阱3:数值问题

常见问题:

解决方法:

# Hessian正则化
H = H + ε*I  # ε = 1e-6

# 约束预处理
remove_redundant_constraints()
scale_constraints()

# 使用相对误差终止准则
if ||r|| / ||b|| < tol:
    terminate()

陷阱4:不可行性处理

错误表现:

鲁棒策略:

  1. 软约束: 添加松弛变量 \(\min J + \rho\sum s_i^2 \quad \text{s.t.} \quad \mathbf{g}(\mathbf{x}) \leq \mathbf{s}\)
  2. 约束优先级: 关键约束硬化,次要约束软化
  3. 可行性恢复: 专门的恢复模式

陷阱5:实时性能问题

性能瓶颈:

优化技巧:

  1. 预分配内存:
    static double H[N*N];  // 避免动态分配
    static double g[N];
    
  2. 利用稀疏性:
    H矩阵结构:
    [Q+B'PB  -B'PA    0    ]
    [-A'PB   Q+A'PA  -A'PA ]
    [  0     -A'PA    Q+P  ]
    
  3. 代码生成: 使用ACADO、CasADi等工具生成优化代码

陷阱6:模型失配

表现:

应对策略:

  1. 鲁棒MPC: 考虑不确定性集合
  2. 自适应MPC: 在线参数估计
  3. 偏移补偿: 估计并补偿稳态偏差 \(\mathbf{x}_{k+1} = \mathbf{A}\mathbf{x}_k + \mathbf{B}\mathbf{u}_k + \mathbf{d}_k\) 其中 $\mathbf{d}_k$ 为估计的扰动

调试清单

调试MPC控制器时的检查项:

9.7 练习题

基础题

题目1:MPC与PID控制对比

考虑一阶系统 $\dot{x} = -x + u$,设计MPC控制器使系统从 $x_0 = 1$ 跟踪到 $x_{\text{ref}} = 0$,约束 $ u \leq 0.5$。与无约束PID控制器对比,分析两者的控制效果差异。

Hint: 考虑PID可能产生的控制量饱和问题,以及MPC如何预见并避免饱和。

参考答案 MPC控制器设计: - 离散化($T_s = 0.1$):$x_{k+1} = 0.9048x_k + 0.0952u_k$ - 预测时域 $N = 10$,权重 $Q = 1, R = 0.1$ - 约束:$|u_k| \leq 0.5$ 结果对比: 1. PID控制器:初始控制量可能超过0.5,触发饱和,导致积分饱和(windup) 2. MPC控制器:预见约束,优化控制序列,避免饱和 3. MPC到达时间约1.5秒,无超调;PID若有积分饱和,可能产生10-20%超调 4. MPC始终满足约束;PID需要anti-windup机制 关键差异:MPC的预见性使其能够在接近约束边界时提前减速,而PID只能被动响应。

题目2:QP问题构建

给定线性系统 $\mathbf{x}_{k+1} = \begin{bmatrix}1 & 0.1\0 & 1\end{bmatrix}\mathbf{x}_k + \begin{bmatrix}0\0.1\end{bmatrix}u_k$,预测时域 $N=3$,写出完整的QP问题矩阵形式。

Hint: 先构建预测矩阵 $\Phi$ 和 $\Gamma$,然后组装Hessian矩阵和梯度向量。

参考答案 预测矩阵: $$\Phi = \begin{bmatrix}\mathbf{A}\\\mathbf{A}^2\\\mathbf{A}^3\end{bmatrix}, \quad \Gamma = \begin{bmatrix}\mathbf{B} & 0 & 0\\\mathbf{AB} & \mathbf{B} & 0\\\mathbf{A}^2\mathbf{B} & \mathbf{AB} & \mathbf{B}\end{bmatrix}$$ 具体数值: $$\Gamma = \begin{bmatrix}0 & 0 & 0\\0.1 & 0 & 0\\0.01 & 0 & 0\\0.1 & 0.1 & 0\\0.02 & 0.01 & 0\\0.1 & 0.1 & 0.1\end{bmatrix}$$ QP形式: $$\mathbf{H} = 2(\Gamma^T\bar{\mathbf{Q}}\Gamma + \bar{\mathbf{R}})$$ $$\mathbf{f} = 2\Gamma^T\bar{\mathbf{Q}}(\Phi\mathbf{x}_0 - \mathbf{X}_{\text{ref}})$$ 其中 $\bar{\mathbf{Q}} = \mathbf{I}_6 \otimes \mathbf{Q}$,$\bar{\mathbf{R}} = \mathbf{I}_3 \otimes R$。

题目3:终端代价计算

对于系统 $x_{k+1} = 0.9x_k + u_k$,局部控制律 $u = -0.4x$,阶段代价 $l(x,u) = x^2 + 0.1u^2$。计算满足稳定性条件的终端代价 $V_f(x) = Px^2$ 中的 $P$ 值。

Hint: 使用离散Lyapunov方程求解。

参考答案 闭环系统:$x_{k+1} = (0.9 - 0.4)x_k = 0.5x_k$ Lyapunov方程: $$P = (0.5)^2 P + 1 + 0.1(0.4)^2$$ $$P = 0.25P + 1.016$$ $$P = \frac{1.016}{0.75} = 1.3547$$ 验证: - $V_f(0.5x) - V_f(x) = -0.75Px^2 < 0$ ✓ - $V_f(0.5x) - V_f(x) = -1.016x^2 = -l(x, -0.4x)$ ✓ 因此 $P = 1.3547$ 满足稳定性条件。

挑战题

题目4:软约束设计

某机械臂MPC控制器经常因为硬约束导致不可行。设计软约束方案,将关节角速度约束 $ \dot{q} \leq 1$ rad/s 软化。讨论软约束权重 $\rho$ 对系统性能的影响。

Hint: 引入松弛变量,修改目标函数和约束。

参考答案 软约束形式: $$\min J + \rho\sum_{i=0}^{N-1}(s_i^+ + s_i^-)$$ $$\text{s.t.} \quad -1 - s_i^- \leq \dot{q}_i \leq 1 + s_i^+$$ $$s_i^+, s_i^- \geq 0$$ 其中 $s_i^+, s_i^-$ 为正负方向的松弛变量。 权重影响分析: 1. $\rho$ 很小(如0.1):约束容易违反,系统响应快但可能超过物理极限 2. $\rho$ 适中(如100):偶尔违反约束,平衡性能和安全 3. $\rho$ 很大(如10000):接近硬约束,可能导致数值问题 实用选择: $$\rho = \alpha \cdot \max(\text{diag}(\mathbf{H}))$$ 其中 $\alpha \in [10, 1000]$ 根据约束重要性调整。 额外考虑: - 使用二次惩罚 $\rho(s_i^2)$ 提供更平滑的梯度 - 对不同约束使用不同权重 - 监控松弛变量大小,动态调整权重

题目5:多速率MPC设计

设计双速率MPC:快速内环(100Hz)处理执行器动态,慢速外环(10Hz)处理轨迹跟踪。推导两个MPC之间的接口设计。

Hint: 考虑时间尺度分离和信息传递。

参考答案 双速率架构: 外环MPC(10Hz): - 状态:位置、速度 - 输出:参考加速度序列 $\mathbf{a}_{\text{ref}}$ - 时域:$N_{\text{slow}} = 20$(2秒) 内环MPC(100Hz): - 状态:执行器状态 - 输入:来自外环的 $\mathbf{a}_{\text{ref}}$ - 输出:执行器命令 - 时域:$N_{\text{fast}} = 10$(0.1秒) 接口设计: 1. 外环输出10个采样点的参考轨迹 2. 内环插值得到100Hz参考 3. 内环反馈实际状态给外环 时间同步: ``` t=0.0s: 外环计算 → a_ref[0:0.1s] t=0.0s-0.09s: 内环跟踪 a_ref t=0.1s: 外环更新 → a_ref[0.1:0.2s] ``` 优势: - 降低计算复杂度:$O(N_{\text{slow}}^3) + 10 \cdot O(N_{\text{fast}}^3)$ vs $O((10N_{\text{slow}})^3)$ - 更好的数值条件 - 模块化设计

题目6:MPC参数自适应

设计自适应MPC策略,根据跟踪误差在线调整权重矩阵 $\mathbf{Q}$ 和 $\mathbf{R}$。给出自适应律和稳定性分析。

Hint: 使用性能指标触发权重更新。

参考答案 自适应策略: 性能指标: $$J_{\text{perf}} = \frac{1}{T_w}\int_{t-T_w}^{t} e^T e \, dt$$ 其中 $T_w$ 为时间窗口。 自适应律: ``` if J_perf > J_high: Q = min(γ_up * Q, Q_max) # 增加位置权重 R = max(R / γ_up, R_min) # 减少控制权重 elif J_perf < J_low: Q = max(Q / γ_down, Q_min) # 减少位置权重 R = min(γ_down * R, R_max) # 增加控制权重 ``` 其中 $\gamma_{\text{up}} = 1.2$,$\gamma_{\text{down}} = 1.1$。 稳定性保证: 1. 权重有界:$\mathbf{Q}_{\min} \preceq \mathbf{Q} \preceq \mathbf{Q}_{\max}$ 2. 更新频率限制:最快每10个采样周期更新一次 3. 保持终端代价一致性:重新计算 $\mathbf{P}$ 实现细节: - 使用滞后区间 $[J_{\text{low}}, J_{\text{high}}]$ 避免颤振 - 平滑过渡:$\mathbf{Q}_{\text{new}} = \alpha\mathbf{Q}_{\text{target}} + (1-\alpha)\mathbf{Q}_{\text{old}}$ - 监控闭环极点确保稳定域

题目7:分布式MPC协调

两个机器人协同搬运,每个机器人运行独立MPC。设计协调机制确保约束一致性和最优性。

Hint: 使用ADMM或协商策略。

参考答案 ADMM协调方案: 问题分解: - 机器人1:$\min J_1(\mathbf{u}_1) \text{ s.t. } \mathbf{C}_1\mathbf{u}_1 + \mathbf{D}_1\mathbf{u}_2 = \mathbf{b}$ - 机器人2:$\min J_2(\mathbf{u}_2) \text{ s.t. } \mathbf{C}_2\mathbf{u}_2 + \mathbf{D}_2\mathbf{u}_1 = \mathbf{b}$ 耦合约束:相对位置保持 ADMM迭代: 1. 机器人1求解: $$\mathbf{u}_1^{k+1} = \arg\min J_1 + \lambda^T(\mathbf{C}_1\mathbf{u}_1 + \mathbf{D}_1\mathbf{z}_2^k) + \frac{\rho}{2}\|\mathbf{C}_1\mathbf{u}_1 + \mathbf{D}_1\mathbf{z}_2^k - \mathbf{b}\|^2$$ 2. 机器人2求解(类似) 3. 对偶变量更新: $$\lambda^{k+1} = \lambda^k + \rho(\mathbf{C}_1\mathbf{u}_1^{k+1} + \mathbf{D}_1\mathbf{u}_2^{k+1} - \mathbf{b})$$ 通信协议: - 每个MPC周期交换3-5次 - 传输:预测轨迹前3个点 - 容错:超时使用上次可行解 收敛保证: - 凸问题保证收敛 - 收敛速率:$O(1/k)$ - 实践中3-5次迭代足够

题目8:学习增强MPC

设计结合神经网络的MPC,网络预测模型误差 $\Delta f$。讨论如何保证安全性和稳定性。

Hint: 考虑鲁棒性和约束收紧。

参考答案 学习增强MPC架构: 模型结构: $$\mathbf{x}_{k+1} = f_{\text{nom}}(\mathbf{x}_k, \mathbf{u}_k) + \Delta f_{\text{NN}}(\mathbf{x}_k, \mathbf{u}_k)$$ 其中 $f_{\text{nom}}$ 为标称模型,$\Delta f_{\text{NN}}$ 为神经网络补偿。 安全性保证: 1. **误差界估计:** 使用集成网络估计不确定性: $$|\Delta f_{\text{NN}}| \leq \bar{\Delta}(\mathbf{x}, \mathbf{u})$$ 2. **约束收紧:** $$\mathbf{x}_{\min} + \sum_{i=0}^{k}\bar{\Delta}_i \leq \mathbf{x}_k \leq \mathbf{x}_{\max} - \sum_{i=0}^{k}\bar{\Delta}_i$$ 3. **管道MPC(Tube MPC):** - 标称MPC:规划中心轨迹 - 辅助控制器:处理偏差 $$\mathbf{u} = \mathbf{u}_{\text{nom}} + \mathbf{K}(\mathbf{x} - \mathbf{x}_{\text{nom}})$$ 4. **安全过滤器:** ```python if is_safe(u_learned): return u_learned else: return project_to_safe_set(u_learned) ``` 训练策略: - 在线学习:使用最近数据更新 - 域限制:仅在已探索区域使用NN - 渐进信任:随数据增加放松约束 稳定性分析: - 使用Lyapunov理论证明鲁棒稳定性 - 输入状态稳定(ISS)框架 - 最坏情况分析确保有界性