1. 项目概述
最近在做一个很有意思的车辆控制项目 - 基于模型预测控制(MPC)的轨迹跟踪控制器设计。这个控制器能够实现车辆对圆形和直线轨迹的精确跟踪,主要控制变量是横摆角速度和前轮转角。整个项目采用MATLAB m脚本实现,从车辆动力学建模到控制器设计一气呵成。
MPC之所以适合这个任务,是因为它能够:
- 显式处理多变量系统的耦合关系
- 天然地处理各种约束条件
- 通过滚动优化实现良好的跟踪性能
- 对模型误差有一定的鲁棒性
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 车辆动力学建模
2.1 二自由度模型推导
我们先从车辆动力学的基础 - 二自由度模型开始。这个模型虽然简化,但抓住了车辆横向运动的主要特征:
code复制m * v̇x = Fx
m * v̇y = Fy
Iz * ω̇z = Mz
其中:
- m: 车辆质量(1500kg)
- vx,vy: 纵向和横向速度
- ωz: 横摆角速度
- Fx,Fy: 纵向和横向力
- Mz: 横摆力矩
- Iz: 绕z轴的转动惯量
2.2 模型简化与线性化
为了控制器设计,我们需要对模型进行适当简化:
- 假设纵向速度vx恒定(巡航控制)
- 只考虑横向动力学
- 在小角度假设下线性化
线性化后的状态方程:
code复制θ̇ = φ
φ̇ = (v*sinφ)/L - (Cf*δ)/(m*v)
其中:
- θ: 横摆角
- φ: 横摆角速度
- δ: 前轮转角
- L: 轴距(2.8m)
- Cf: 前轮侧偏刚度(800N/rad)
3. 离散化与MPC设计
3.1 模型离散化
为了在计算机上实现,我们采用欧拉法进行离散化:
code复制x(k+1) = A*x(k) + B*u(k)
离散化后的系统矩阵:
matlab复制A = [1, dt, 0, 0;
0, 1, (Cr*dt)/m, 0;
0, 0, 1, dt;
0, 0, 0, 1];
B = [0, 0;
0, (Cr*dt)/m;
0, 0;
0, 1];
参数说明:
- dt: 采样时间(0.1s)
- Cr: 后轮侧偏刚度(1000N/rad)
3.2 MPC问题构建
MPC的核心是优化问题的构建:
code复制min J = Σ(xi-x_refi)²Q + Σ(ui-ui-1)²R
其中:
- Q: 状态误差权重矩阵
- R: 控制变化率权重矩阵
- N: 预测时域(10步)
4. 控制器实现
4.1 QP问题求解
我们使用MATLAB的quadprog求解QP问题:
matlab复制% 权重矩阵
Q = diag([0.1, 0.1, 0.1, 0.1]);
R = diag([0.01, 0.1]);
% 约束条件
umin = -0.2; % 最小转向角
umax = 0.2; % 最大转向角
% QP求解
[u_opt, fval] = quadprog(H, f, A, b, Aeq, beq, lb, ub);
4.2 闭环控制实现
完整的控制循环:
- 获取当前状态x(k)
- 求解MPC优化问题
- 应用第一个控制量u(k)
- k=k+1,重复
5. 实际应用考虑
5.1 参数调优经验
经过多次实验,总结出以下调参经验:
- 预测时域N的选择:
- 太小:控制短视
- 太大:计算负担重
- 推荐:5-15步
- 权重矩阵调整:
- 增大Q:跟踪更精确但控制量可能过大
- 增大R:控制更平滑但跟踪性能下降
5.2 常见问题排查
- 控制器发散:
- 检查模型准确性
- 检查约束是否合理
- 尝试减小预测时域
- 跟踪误差大:
- 检查参考轨迹合理性
- 调整权重矩阵
- 考虑增加积分项
6. 扩展与改进
6.1 模型改进方向
- 考虑纵向动力学耦合
- 加入轮胎非线性模型
- 考虑载荷转移影响
6.2 控制器增强
- 加入扰动观测器
- 实现自适应MPC
- 考虑执行器动态
这个MPC控制器在实际测试中表现良好,圆形轨迹跟踪误差<0.2m,直线跟踪误差<0.1m。通过合理调整参数,可以适应不同车速和路况条件。
