MPC模型预测控制

次浏览

概述

MPC(Model Predictive Control,模型预测控制)是一种先进的过程控制方法,通过在线求解优化问题来计算控制输入。它的核心思想是:在每个采样时刻,利用系统模型预测未来有限时域内的系统行为,求解一个带约束的优化问题,得到最优控制序列,然后只执行第一个控制输入,在下一个时刻重复此过程。


一、基本原理

1.1 滚动时域控制

MPC的核心是滚动时域优化(Receding Horizon Control):

1
2
3
4
5
6
在时刻 k:
1. 获取当前状态 x(k)
2. 利用模型预测未来 N 步的状态
3. 求解优化问题,得到控制序列 u(k), u(k+1), ..., u(k+N-1)
4. 只执行第一个控制 u(k)
5. 等待下一个采样时刻,重复以上步骤

1.2 优势

  • 处理约束:显式考虑输入、状态约束
  • 多变量控制:天然支持MIMO系统
  • 预见性:利用未来参考信息
  • 灵活性:可处理非线性系统

二、离散时间MPC

2.1 系统模型

考虑离散线性系统:

$$ x_{k+1} = Ax_k + Bu_k $$$$ y_k = Cx_k $$

2.2 预测模型

在时刻 $k$,预测未来 $N$ 步状态:

$$ \hat{x}(k+1|k) = Ax_k + Bu_k $$$$ \hat{x}(k+2|k) = A\hat{x}(k+1|k) + Bu_{k+1} = A^2x_k + ABu_k + Bu_{k+1} $$

一般形式:

$$ \hat{x}(k+i|k) = A^ix_k + \sum_{j=0}^{i-1}A^{i-1-j}Bu_{k+j} $$

2.3 紧凑矩阵形式

定义预测状态向量:

$$ X = \begin{bmatrix} x(k+1|k) \\ x(k+2|k) \\ \vdots \\ x(k+N|k) \end{bmatrix} $$

控制输入向量:

$$ U = \begin{bmatrix} u_k \\ u_{k+1} \\ \vdots \\ u_{k+N-1} \end{bmatrix} $$

预测方程:

$$ X = \Phi x_k + \Gamma U $$

其中:

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

三、优化问题

3.1 目标函数

$$ J = \sum_{i=1}^{N} \|x_{k+i} - x_{ref}\|_Q^2 + \sum_{i=0}^{N-1} \|u_{k+i} - u_{ref}\|_R^2 + \|x_{k+N} - x_{ref}\|_P^2 $$

其中:

  • $Q$:状态跟踪权重
  • $R$:控制输入权重
  • $P$:终端权重
  • $N$:预测时域

3.2 约束条件

$$ x_{min} \leq x_{k+i} \leq x_{max}, \quad i = 1, \ldots, N $$$$ u_{min} \leq u_{k+i} \leq u_{max}, \quad i = 0, \ldots, N-1 $$$$ \Delta u_{min} \leq \Delta u_{k+i} \leq \Delta u_{max} $$

3.3 标准QP形式

将优化问题转化为标准二次规划:

$$ \min_U \quad \frac{1}{2}U^T H U + f^T U $$$$ \text{s.t.} \quad G U \leq h $$

其中:

$$ H = 2(\Gamma^T \bar{Q} \Gamma + \bar{R}) $$$$ f = 2\Gamma^T \bar{Q} \Phi x_k - 2(\Gamma^T \bar{Q} X_{ref} + \bar{R} U_{ref}) $$

四、求解方法

4.1 二次规划求解器

常用求解器:

求解器 特点
qpOASES 热启动快,适合嵌入式
OSQP 开源,高效
Gurobi 商业,功能强大
CVXGEN 代码生成,适合小型问题

4.2 显式MPC

对于小型问题,可以离线计算控制律:

$$ u(x) = K_i x + k_i, \quad x \in \mathcal{P}_i $$

不同状态区域对应不同线性控制律。

优点:

  • 在线计算量小
  • 适合高速控制

缺点:

  • 预计算复杂
  • 维度受限

4.3 计算复杂度

QP问题复杂度:$O(n^3)$

$n$ 为决策变量数量($n = N \times m$)


五、稳定性分析

5.1 终端约束方法

添加终端约束确保稳定性:

$$ x(k+N) \in \mathcal{X}_f $$

终端集 $\mathcal{X}_f$ 是控制不变集。

5.2 终端代价方法

选择终端权重 $P$ 满足Lyapunov方程:

$$ A^TPA - P + Q + K^TRK = 0 $$

5.3 无穷时域MPC

当 $N \to \infty$ 时,MPC渐近稳定。


六、Python实现示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import numpy as np
from scipy.optimize import minimize

class MPC:
    def __init__(self, A, B, N, Q, R, umin, umax):
        """
        MPC控制器
        
        参数:
            A, B: 系统矩阵
            N: 预测时域
            Q: 状态权重
            R: 控制权重
            umin, umax: 控制约束
        """
        self.A = A
        self.B = B
        self.N = N
        self.Q = Q
        self.R = R
        self.umin = umin
        self.umax = umax
        
        self.nx = A.shape[0]  # 状态维度
        self.nu = B.shape[1]  # 输入维度
    
    def predict(self, x0, U):
        """预测未来状态"""
        X = np.zeros((self.N + 1, self.nx))
        X[0] = x0
        for i in range(self.N):
            X[i + 1] = self.A @ X[i] + self.B @ U[i]
        return X
    
    def cost(self, U, x0, xref):
        """目标函数"""
        U = U.reshape(self.N, self.nu)
        X = self.predict(x0, U)
        
        # 状态代价
        state_cost = 0
        for i in range(1, self.N + 1):
            state_cost += (X[i] - xref).T @ self.Q @ (X[i] - xref)
        
        # 控制代价
        control_cost = 0
        for i in range(self.N):
            control_cost += U[i].T @ self.R @ U[i]
        
        return state_cost + control_cost
    
    def solve(self, x0, xref):
        """求解MPC问题"""
        # 初始猜测
        U0 = np.zeros(self.N * self.nu)
        
        # 控制约束
        bounds = [(self.umin, self.umax)] * self.N * self.nu
        
        # 求解优化问题
        result = minimize(
            self.cost, U0, args=(x0, xref),
            bounds=bounds, method='SLSQP'
        )
        
        # 返回第一个控制输入
        U_opt = result.x.reshape(self.N, self.nu)
        return U_opt[0]


# 示例:双积分器系统
A = np.array([[1, 0.1], [0, 1]])
B = np.array([[0], [0.1]])

# MPC参数
N = 10
Q = np.eye(2)
R = np.array([[0.1]])
umin, umax = -1, 1

# 创建MPC控制器
mpc = MPC(A, B, N, Q, R, umin, umax)

# 模拟
x = np.array([2, 0])  # 初始状态
xref = np.array([0, 0])  # 目标状态

print("时间 | 位置 | 速度 | 控制输入")
for t in range(30):
    u = mpc.solve(x, xref)
    print(f"{t:4d} | {x[0]:.3f} | {x[1]:.3f} | {u[0]:.3f}")
    x = A @ x + B @ u

七、非线性MPC(NMPC)

7.1 非线性系统

$$ x_{k+1} = f(x_k, u_k) $$

7.2 非线性优化

问题变为非线性规划(NLP):

$$ \min_U \quad J(x_0, U) $$$$ \text{s.t.} \quad x_{k+i+1} = f(x_{k+i}, u_{k+i}) $$$$ g(x_{k+i}, u_{k+i}) \leq 0 $$

7.3 求解方法

  • 序列二次规划(SQP)
  • 内点法
  • 实时迭代(RTI)

7.4 常用工具

工具 特点
CasADi 自动微分,符号计算
ACADO 代码生成,嵌入式
do-mpc Python接口,易用

八、MPC变体

8.1 鲁棒MPC

考虑模型不确定性:

$$ x_{k+1} = Ax_k + Bu_k + w_k, \quad w_k \in \mathcal{W} $$

方法:

  • Tube-based MPC
  • Min-max MPC

8.2 随机MPC

考虑随机扰动:

$$ x_{k+1} = Ax_k + Bu_k + w_k, \quad w_k \sim \mathcal{N}(0, \Sigma) $$

目标:最小化期望代价或保证概率约束。

8.3 分布式MPC

多个子系统协同控制:

  • 每个子系统求解局部MPC
  • 通过通信协调
  • 适用于大规模系统

8.4 经济MPC

目标不是调节到设定点,而是优化经济性能:

$$ J = \sum_{i=0}^{N-1} l_e(x_{k+i}, u_{k+i}) $$

九、应用领域

9.1 过程工业

  • 化工过程控制
  • 石油炼制
  • 造纸工业

9.2 汽车领域

  • 自适应巡航(ACC)
  • 自动泊车
  • 发动机控制

9.3 机器人

  • 轨迹跟踪
  • 步态规划
  • 抓取控制

9.4 航空航天

  • 着陆控制
  • 轨迹优化
  • 姿态控制

十、MPC vs LQR

特性 MPC LQR
约束处理 ✅ 显式处理 ❌ 无法处理
计算复杂度 高(在线优化) 低(离线计算)
预见性 ✅ 可利用未来参考 ❌ 无预见性
非线性系统 ✅ 可扩展 ❌ 仅线性
实现难度 中等 简单
适用场景 有约束、多变量 无约束、快速控制

十一、实际应用考虑

11.1 预测时域选择

  • 太短:无法充分预测,性能差
  • 太长:计算量大,预测不准确

经验法则:覆盖系统主要动态

11.2 模型精度

  • 模型误差影响预测准确性
  • 可结合在线辨识/自适应

11.3 计算资源

  • 实时性要求高时需考虑
  • 嵌入式平台选择合适求解器

总结

MPC是一种强大的控制方法:

优点:

  • 显式处理约束
  • 多变量协调
  • 利用未来信息
  • 适用非线性系统

挑战:

  • 计算复杂度
  • 模型依赖
  • 参数调节

选择建议:

  • 有约束 → MPC
  • 快速控制 + 无约束 → LQR
  • 复杂系统 + 有约束 → MPC

参考资料


🚀 MPC是工业控制的主力军,理解它对于现代控制系统设计至关重要!

使用 Hugo 构建
主题 StackJimmy 设计