MPC模型预测控制,车辆纵向速度跟踪; Simulink/Carsim联合仿真,采用2级S函数; 包括模型预测控制基本原理PPT; 包括模型建立过程PPT; 包抱详细PPT(27页)流程讲解; 包括模型预测控制图书3册;

油门刹车来回踩?车速死活跟不上参考速度?试试用模型预测控制(MPC)给车子装个智能大脑。今天带你们手搓个车辆速度跟踪控制器,顺便把Simulink和Carsim联动的骚操作给整明白。

先看个真实场景:前车突然减速,你的车既要快速响应又不能急刹搞得乘客晕车。传统PID这时候容易手忙脚乱,MPC却能提前算好未来几步的动作。就像下棋多看三步,控制量都是带着预判打出去的。

!MPC滚动时域示意图

(假装这里有张动态演示图)

搞联合仿真时得用二级S函数当中间人。别慌,咱们先看看S函数长啥样:

function [sys,x0,str,ts] = MPC_Sfunc(t,x,u,flag)
switch flag
    case 0 % 初始化
        sizes = simsizes;
        sizes.NumContStates = 0;
        sizes.NumDiscStates = 3; % 状态量个数
        sizes.NumOutputs = 2;    % 控制量输出
        sizes.NumInputs = 4;     % 传感器输入
        sys = simsizes(sizes);
        x0 = zeros(3,1); 
        ts = [0.05 0]; % 采样时间
    case 2 % 更新状态
        sys = doMPC(u); % 核心计算在这里
    case 3 % 输出
        sys = [u(3); u(4)]; % 输出油门刹车信号
    otherwise
        sys = [];
end

这坨代码的关键在doMPC函数里藏着的优化计算。注意离散状态量个数要和车辆模型维度匹配,采样时间别设得比Carsim步长还小,不然仿真能卡成PPT。

预测模型怎么建?抓个最简单的纵向动力学模型:

dx/dt = v
dv/dt = (F_trac - F_brake - F_resist)/m

转换成状态空间方程时记得做线性化处理。实际工程中遇到过坑——某次忘记空气阻力项的非线性特性,结果车速上80km/h后控制量直接暴走。

目标函数可不是随便写的,得兼顾跟踪误差和控制增量:

Q = diag([10, 1]);  % 状态量权重
R = 0.1;            % 控制量权重
H = blkdiag(kron(eye(N),Q), kron(eye(N),R)); % 堆成块对角矩阵
f = zeros(size(H,1),1); % 没有线性项时留空

权重系数调参是门玄学,有个诀窍:先把R设为0调Q,等跟踪效果差不多了再微调R抑制控制抖动。

Carsim设置要注意接口匹配,曾经有个项目因为输出信号单位不统一(牛 vs 千牛),导致仿真时车辆疯狂点头,场面堪比蹦迪。

最后上点干货——调试时优先检查约束条件:

  1. 控制量上下限是否合理(别让油门超过100%)
  2. 状态量约束是否冲突
  3. 求解器选型(quadprog比fmincon快得多)

完整代码包里还藏着几个防呆设计:比如当求解器报错时自动切换备用策略,防止仿真中断。毕竟实验室电脑跑一次联合仿真要半小时,崩了真的会砸键盘。

!仿真结果对比图

(此处应有PID和MPC的跟踪效果对比曲线)

配套资料里有三本实体书电子版,建议当枕头用——《模型预测控制》这玩意看着催眠效果拔群。不过第2本第3章讲约束处理的部分是真干货,配合27页的流程PPT食用更佳。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐