1. MPC基础概念与核心思想模型预测控制Model Predictive Control, MPC本质上是一种基于动态模型的前馈-反馈复合控制策略。它的核心思想可以用三步走来概括预测未来、优化决策、滚动执行。想象你在驾驶汽车时会不断观察前方路况预测未来几秒车辆的轨迹然后调整方向盘和油门——这就是MPC的直观体现。与PID控制相比MPC最大的优势在于它能显式处理多变量耦合和硬性约束。比如控制化工反应器时既要维持温度在安全范围内又要保证压力不超限传统PID难以协调这些约束而MPC可以将其直接纳入优化问题求解。MPC的四大核心要素预测模型描述系统动态行为的数学表达式如状态空间方程滚动优化在每个控制周期求解有限时域的最优控制问题反馈校正用实际测量值修正模型预测误差参考轨迹期望系统跟随的理想路径典型的MPC控制流程如下图所示伪代码表示while 系统运行: 获取当前状态x(k) 基于模型预测未来P步的输出Y(k1|k)...Y(kP|k) 求解优化问题得到控制序列U(k)...U(kM-1) 执行第一个控制量U(k) 等待下一采样周期2. 线性系统建模与预测方程构建我们以一个经典的一阶线性系统——小车位置控制为例。设小车质量为m受到推力u受到摩擦力系数b其动力学方程可表示为m·ẍ(t) b·ẋ(t) u(t)将其离散化采样周期T后得到状态空间模型# 状态变量x1位置, x2速度 x(k1) A·x(k) B·u(k) y(k) C·x(k) 其中 A [[1, T], [0, 1-(b/m)*T]] B [[0], [T/m]] C [1, 0]预测方程的构建采用递推推导法。假设预测时域P3控制时域M2预测输出可表示为y(k1|k) C·A·x(k) C·B·u(k) y(k2|k) C·A²·x(k) C·A·B·u(k) C·B·u(k1) y(k3|k) C·A³·x(k) C·A²·B·u(k) C·A·B·u(k1)将其整理为矩阵形式Y Ψ·x(k) Φ·U 其中 Y [y(k1|k), y(k2|k), y(k3|k)]ᵀ U [u(k), u(k1)]ᵀ Ψ [C·A, C·A², C·A³]ᵀ Φ [[C·B, 0], [C·A·B, C·B], [C·A²·B, C·A·B]]实际工程中常会遇到计算延迟问题。解决方法是在预测时引入一步延迟补偿当前时刻k获取的状态x(k) → 用于计算k1时刻的控制u(k1|k) 执行时实际应用的是u(k) u(k|k-1)3. 滚动优化问题构建与求解滚动优化是MPC的核心计算环节。我们需要构造一个二次型代价函数通常包含跟踪误差和控制量变化两项J Σ [y(ki)-r(ki)]²·Q Σ Δu(ki)²·R其中Q和R是权重矩阵。对于小车位置控制示例将其转化为标准二次规划(QP)形式min 1/2·Uᵀ·H·U fᵀ·U s.t. U_min ≤ U ≤ U_max # 控制量约束 ΔU_min ≤ ΔU ≤ ΔU_max # 控制变化率约束其中H 2·(Φᵀ·Q·Φ R) f 2·Φᵀ·Q·(Ψ·x(k)-R)使用Python的CVXPY库求解该QP问题import cvxpy as cp U cp.Variable(M) # 优化变量 cost cp.quad_form(U, H) f.T U constraints [U U_min, U U_max] prob cp.Problem(cp.Minimize(cost), constraints) prob.solve(solvercp.OSQP)实际工程中需要注意权重调节Q/R比值影响系统响应速度通常从10:1开始调试约束软化对关键约束添加松弛变量避免无解热启动用上一周期的解作为初始猜测加速求解4. 误差补偿与闭环实现由于模型失配和干扰的存在必须引入反馈校正。常用方法包括1. 偏差校正法测量实际输出y(k1) 预测误差 e(k1) y(k1) - y(k1|k) 对未来预测值修正 y_cor(ki|k1) y(ki|k) h_i·e(k1) 其中h_i是衰减系数通常取0 h 12. 状态估计法更适合多变量系统使用卡尔曼滤波器估计当前状态 x_hat(k1) A·x_hat(k) B·u(k) K·(y(k1)-C·x_hat(k)) 其中K是卡尔曼增益完整闭环实现步骤初始化构建模型矩阵A,B,C设置P,M,Q,R在线循环读取传感器数据y(k)状态估计得到x(k)构建预测方程YΨx(k)ΦU求解QP得到最优控制序列U*输出第一个控制量u(k)U*[0]数据移位保存U*[1:M]用于下次热启动5. 工程实践中的关键问题采样时间选择经验法则应小于系统最小时间常数的1/10对于小车示例若时间常数τm/b2s采样周期T≤0.2s计算延迟处理的三种方法提前计算法在k-T期间完成k时刻的计算延迟补偿法在预测模型中显式考虑延迟多速率MPC控制计算与执行采用不同速率代码优化技巧# 预计算不变矩阵离线 Psi compute_psi(A,C,P) Phi compute_phi(A,B,C,P,M) H 2*(Phi.TQPhi R) H_inv np.linalg.inv(H) # 对于无约束QP可直接求解 # 在线部分快速计算 f 2*Phi.TQ(Psix(k)-R) U_opt -H_inv f # 无约束情况解析解典型调试流程先测试开环响应验证模型准确性关闭约束调节Q/R使响应速度适中逐步添加约束观察约束激活时的行为加入噪声测试调整状态估计器参数6. 进阶话题非线性MPC初探当系统呈现非线性特性时如倒立摆需要采用非线性MPC。其核心区别在于预测模型使用非线性微分方程dx/dt f(x,u) # 非线性状态方程优化求解转换为非线性规划(NLP)问题min J ∫(x-x_ref)² u² dt s.t. ẋ f(x,u) g(x,u) ≤ 0实时线性化连续时间线性化CTL方法# 在当前工作点(x0,u0)线性化 A ∂f/∂x|(x0,u0) B ∂f/∂u|(x0,u0)常用求解器ACADO开源NMPC框架CasADiPython/Matlab非线性优化IPOPT大规模NLP求解器一个倒立摆NMPC的简化示例def pendulum_dynamics(x, u): θ, ω x[0], x[1] dθ ω dω (m*g*l*sin(θ) - b*ω u)/I return np.array([dθ, dω]) # 使用CasADi构建NLP opti casadi.Opti() X opti.variable(2, P1) # 状态轨迹 U opti.variable(1, M) # 控制序列 cost 0 for k in range(P): cost (X[:,k]-x_ref).TQ(X[:,k]-x_ref) U[:,k].TRU[:,k] opti.subject_to(X[:,k1] rk4(pendulum_dynamics, X[:,k], U[:,k], T)) opti.minimize(cost)在实际项目中我们往往需要在控制性能和计算负担之间做权衡。对于快速动态系统如无人机可能需要采用显式MPCeMPC预先计算控制律或者使用更短的预测时域配合更高效的求解算法。