MPC模型预测控制的数学定义与工程化
文章目录
- 一 MPC的数学定义与基本原理
- 二 自动驾驶中的工程实现形式
- 三 计算数学求解方法
- 四 模型约化技术
- 五 Python实现案例
一 MPC的数学定义与基本原理
模型预测控制 (MPC) 是一种基于滚动优化和反馈校正的预测控制策略, 其核心思想是通过系统模型预测未来状态, 并在有限时间窗口内求解最优控制输入. 以下是其数学定义的核心要素:
-
系统模型
采用离散时间状态空间模型描述系统动态, 如:
x k + 1 = A x k + B u k y k = C x k x_{k+1} = A x_k + B u_k \\ y_k = C x_k xk+1=Axk+Bukyk=Cxk其中 x k x_k xk 为状态向量, u k u_k uk 为控制输入, A , B , C A, B, C A,B,C 为系统矩阵, y k y_k yk 是系统 k k k 时刻的输出控制.
-
优化目标函数
目标函数通常为二次型, 包含状态跟踪误差, 控制量及其增量的加权和:
J = ∑ i = 0 H p − 1 ( ∥ x k + i − x ref ∥ Q 2 + ∥ u k + i ∥ R 2 ) + ∥ x k + H p − x ref ∥ P 2 J = \sum_{i=0}^{H_p-1} \left( \|x_{k+i} - x_{\text{ref}}\|_{Q}^2 + \|u_{k+i}\|_{R}^2 \right) + \|x_{k+H_p} - x_{\text{ref}}\|_{P}^2 J=i=0∑Hp−1(∥xk+i−xref∥Q2+∥uk+i∥R2)+∥xk+Hp−xref∥P2其中 Q , R , P Q, R, P Q,R,P 为权重矩阵, H p H_p Hp 为预测时域.
-
约束条件
包括控制量幅值约束, 状态约束和动力学方程约束:
u min ≤ u k ≤ u max , x min ≤ x k ≤ x max u_{\min} \leq u_k \leq u_{\max}, \quad x_{\min} \leq x_k \leq x_{\max} umin≤uk≤umax,xmin≤xk≤xmax
二 自动驾驶中的工程实现形式
在智驾领域, MPC的工程实现需结合车辆动力学模型和实时性需求:
-
车辆动力学模型
-
运动学模型 (Bicycle Model) : 适用于低速场景, 忽略轮胎侧偏特性:
{ x ˙ = v cos ( θ ) y ˙ = v sin ( θ ) θ ˙ = v tan ( δ ) L \begin{cases} \dot{x} = v \cos(\theta) \\ \dot{y} = v \sin(\theta) \\ \dot{\theta} = \frac{v \tan(\delta)}{L} \end{cases} ⎩ ⎨ ⎧x˙=vcos(θ)y˙=vsin(θ)θ˙=Lvtan(δ)L L L 为轴距, δ \delta δ 为前轮转角.
-
动力学模型 (2-DOF Model) : 考虑侧向力和横摆运动:
{ m y ¨ = F y f + F y r I z ψ ¨ = a F y f − b F y r \begin{cases} m \ddot{y} = F_{yf} + F_{yr} \\ I_z \ddot{\psi} = a F_{yf} - b F_{yr} \end{cases} {my¨=Fyf+FyrIzψ¨=aFyf−bFyrF y f , F y r F_{yf}, F_{yr} Fyf,Fyr 为前后轴侧向力.
-
-
控制架构
- 横向控制: 通过MPC调节前轮转角, 使车辆跟踪参考路径.
- 纵向控制: 调节加速度, 维持安全跟车距离.
- 分布式MPC: 降低计算复杂度, 适用于多车协同场景.
三 计算数学求解方法
MPC的求解本质是带约束的优化问题, 常用方法如下:
-
二次规划 (QP)
将线性MPC问题转换为标准QP形式:
min U 1 2 U T H U + f T U s.t. A ineq U ≤ b ineq \min_{U} \frac{1}{2} U^T H U + f^T U \quad \text{s.t.} \quad A_{\text{ineq}} U \leq b_{\text{ineq}} Umin21UTHU+fTUs.t.AineqU≤bineq其中 H = diag ( Q , R ) H = \text{diag}(Q, R) H=diag(Q,R), f f f 由参考轨迹生成.
Python示例 (cvxpy库):import cvxpy as cp U = cp.Variable((N, 1)) cost = cp.quad_form(U, H) + f.T @ U constraints = [A_ineq @ U <= b_ineq] prob = cp.Problem(cp.Minimize(cost), constraints) prob.solve(solver=cp.OSQP)
-
序列二次规划 (SQP)
用于非线性MPC, 通过迭代QP逼近最优解.
四 模型约化技术
为降低计算复杂度, 可采用以下约化方案:
-
时域压缩
缩短预测时域 H p H_p Hp 和控制时域 H c H_c Hc. -
线性化与降阶
- 泰勒展开线性化: 在参考轨迹附近对非线性模型线性化.
- 平衡截断法: 保留主导模态, 减少状态维度.
-
显式MPC
离线计算控制律, 在线查表.
五 Python实现案例
以车辆横向跟踪为例, 展示MPC实现流程:
import numpy as np
import casadi as ca
# 定义车辆模型 (Bicycle Model)
def bicycle_model(x, u, L=2.5, dt=0.1):
theta = x[2]
v = x[3]
delta = u[0]
dx = ca.vertcat(
v * ca.cos(theta),
v * ca.sin(theta),
v * ca.tan(delta) / L,
u[1] # 假设加速度为控制输入
)
return x + dx * dt
# MPC参数
N = 10 # 预测时域
Q = np.diag([10, 10, 1, 1]) # 状态权重
R = np.diag([1, 0.1]) # 控制量权重
# 构建优化问题
opti = ca.Opti()
X = opti.variable(4, N+1) # 状态变量
U = opti.variable(2, N) # 控制变量
x_ref = opti.parameter(4, N+1) # 参考轨迹
# 目标函数与约束
cost = 0
for i in range(N):
cost += ca.mtimes([(X[:,i]-x_ref[:,i]).T, Q, (X[:,i]-x_ref[:,i])])
cost += ca.mtimes([U[:,i].T, R, U[:,i]])
opti.subject_to(X[:,i+1] == bicycle_model(X[:,i], U[:,i]))
# 求解
opti.minimize(cost)
opts = {'ipopt.print_level': 0, 'print_time': 0}
opti.solver('ipopt', opts)
sol = opti.solve()