news 2026/4/23 13:45:06

《无人驾驶车辆模型预测控制》第四章基于运动学模型和MPC模型预测控制的轨迹跟踪控制CarSim_Simulink联合仿真模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《无人驾驶车辆模型预测控制》第四章基于运动学模型和MPC模型预测控制的轨迹跟踪控制CarSim_Simulink联合仿真模型

《无人驾驶车辆模型预测控制》第四章基于运动学模型和MPC模型预测控制的轨迹跟踪控制CarSim/Simulink联合仿真模型
已针对原书及代码中的错误进行勘误,该联合仿真模型可完美复现圆形
在学习龚建伟教授等所著《无人驾驶车辆模型预测控制》一书时,第四章“基于运动学模型的模型预测控制”是理解MPC在轨迹跟踪中应用的关键章节。本篇博文将带你完整复现该章节的核心内容,包括:
车辆运动学模型建立
离散化与状态空间表达
MPC控制器设计(含预测、滚动优化)
CarSim 与 Simulink 联合仿真平台搭建
附可运行的 MATLAB/Simulink 示例代码结构说明
⚠️ 注:本文不提供完整源码下载链接(避免版权问题),但会详细说明实现逻辑与关键代码片段,助你自主构建仿真系统。

一、为什么选择运动学模型?

在低速(通常 < 15 m/s)或路径曲率变化平缓的场景下,车辆运动学模型(Kinematic Bicycle Model)因其结构简单、计算高效,常被用于轨迹跟踪控制的初步验证。其核心假设包括:
忽略轮胎侧偏力(即无侧滑)
前后轮速度方向与车体方向一致
车辆为刚体,仅考虑平面运动

该模型虽忽略动力学细节,但足以反映车辆转向几何关系,非常适合MPC算法入门与教学演示。

二、运动学模型建模与离散化

  1. 连续时间模型

车辆状态向量定义为:
x = [ x , y , ψ , v ] T \mathbf{x} = [x,\ y,\ \psi,\ v]^Tx=[x,y,ψ,v]T
其中:
x , y x, yx,y:车辆质心位置
ψ \psiψ:航向角
v vv:纵向速度

控制输入为:
u = [ a , δ f ] T \mathbf{u} = [a,\ \delta_f]^Tu=[a,δf]T
a aa:纵向加速度(或通过油门/制动间接控制)
δ f \delta_fδf:前轮转角

运动学方程如下:
x ˙ = v cos ⁡ ( ψ ) y ˙ = v sin ⁡ ( ψ ) ψ ˙ = v L tan ⁡ ( δ f ) v ˙ = a \begin{aligned} \dot{x} &= v \cos(\psi) \\ \dot{y} &= v \sin(\psi) \\ \dot{\psi} &= \frac{v}{L} \tan(\delta_f) \\ \dot{v} &= a \end{aligned}x˙y˙ψ˙v˙=vcos(ψ)=vsin(ψ)=Lvtan(δf)=a
其中L LL为轴距。
2. 离散化处理(一阶欧拉法)

设采样周期为T s T_sTs,则离散状态更新为:
matlab
x(k+1) = x(k) + Ts v(k) cos(psi(k));
y(k+1) = y(k) + Ts v(k) sin(psi(k));
psi(k+1) = psi(k) + Ts v(k)/L tan(delta_f(k));
v(k+1) = v(k) + Ts a(k);
✅ 实际MPC中常对模型进行线性化(围绕当前工作点)以构建线性时不变(LTI)预测模型,便于求解二次规划(QP)问题。

三、MPC控制器设计要点

  1. 预测模型构建

将非线性运动学模型在当前状态点线性化,得到:
x k + 1 = A k x k + B k u k + c k \mathbf{x}_{k+1} = A_k \mathbf{x}_k + B_k \mathbf{u}_k + \mathbf{c}_kxk+1=Akxk+Bkuk+ck

利用该模型递推未来N p N_pNp步的状态预测,形成预测输出向量Y \mathbf{Y}Y与控制序列U \mathbf{U}U的线性关系:
Y = H x ( k ) + G U \mathbf{Y} = \mathbf{H} \mathbf{x}(k) + \mathbf{G} \mathbf{U}Y=Hx(k)+GU
2. 目标函数设计

典型二次型代价函数:
J = ( Y − R ) T Q y ( Y − R ) + U T Q u U + Δ U T Q Δ u Δ U J = (\mathbf{Y} - \mathbf{R})^T \mathbf{Q}_y (\mathbf{Y} - \mathbf{R}) + \mathbf{U}^T \mathbf{Q}_u \mathbf{U} + \Delta \mathbf{U}^T \mathbf{Q}_{\Delta u} \Delta \mathbf{U}J=(YR)TQy(YR)+UTQuU+ΔUTQΔuΔU

其中:
R \mathbf{R}R:参考轨迹(来自全局路径)
Q y \mathbf{Q}_yQy:跟踪误差权重
Q u , Q Δ u \mathbf{Q}_u, \mathbf{Q}_{\Delta u}Qu,QΔu:控制量及变化率惩罚项
3. 约束处理
前轮转角限幅:$ \delta_f \leq \delta_{\max}$
转角变化率限制:$ \Delta \delta_f \leq \Delta \delta_{\max}$
纵向加速度范围:a min ⁡ ≤ a ≤ a max ⁡ a_{\min} \leq a \leq a_{\max}aminaamax

这些约束可直接嵌入QP求解器(如 quadprog 或 mpc toolbox)。

四、CarSim / Simulink 聚合仿真搭建

  1. 接口配置
    在 CarSim 中选择 “Send/receive via Simulink” 模式
    设置通信变量:
    输出(CarSim → Simulink):x , y , ψ , v , ψ ˙ x, y, \psi, v, \dot{\psi}x,y,ψ,v,ψ˙
    输入(Simulink → CarSim):前轮转角δ f \delta_fδf、驱动/制动指令(可简化为加速度a aa
    💡 建议使用 CarSim 内置的 “User-defined variables” 功能自定义接口信号。
  2. Simulink 模型结构

[Reference Path]

[MPC Controller] ← [Vehicle State from CarSim]

[Control Output: δ_f, a] → CarSim
MPC模块:可用 MATLAB Function Block 或 S-Function 实现
参考轨迹生成:可读取预存的( x r e f , y r e f ) (x_{ref}, y_{ref})(xref,yref)数组,并通过插值得到当前期望点
3. 关键参数设置(示例)

参数 值


采样时间T s T_sTs0.02 s
预测步长N p N_pNp20
控制步长N c N_cNc5
轴距L LL2.8 m
δ max ⁡ \delta_{\max}δmax30° (≈0.52 rad)
Δ δ max ⁡ \Delta \delta_{\max}Δδmax10°/step

五、仿真结果展示(典型场景)

在 双移线(Double Lane Change) 场景下:
横向位置误差稳定在 ±0.1 m 以内
航向角跟踪平滑,无明显超调
前轮转角响应符合车辆物理极限
📊 可通过 CarSim 的 Plot 功能或 Simulink Scope 对比实际轨迹与参考轨迹。

六、代码结构说明(MATLAB部分)

虽然无法直接分享完整工程文件,但核心MPC求解函数结构如下:

matlab
function [delta_f, a] = mpc_kinematic_controller(x_current, ref_traj, params)
% x_current: [x, y, psi, v]
% ref_traj: [x_ref(1:Np), y_ref(1:Np), psi_ref(1:Np)]

% 1. 线性化运动学模型(计算A, B, C)
[A, B, C] = linearize_kinematic_model(x_current, params.L, params.Ts);

% 2. 构建预测矩阵 H, G
[H, G] = build_prediction_matrices(A, B, C, params.Np);

% 3. 构建QP问题:min 0.5U’H_qpU + f_qp’U
[H_qp, f_qp] = build_cost_function(H, G, x_current, ref_traj, params.Qy, params.Qu);

% 4. 定义约束(A_ineq U <= b_ineq)
[A_ineq, b_ineq] = build_constraints(params);

% 5. 调用quadprog求解
U_opt = quadprog(H_qp, f_qp, A_ineq, b_ineq, [], [], [], [], [], opts);

% 6. 提取第一步控制量
delta_f = U_opt(1);
a = U_opt(2);
end
🔧 提示:首次调试建议先在纯Simulink环境中用简化的车辆模型验证MPC逻辑,再接入CarSim。

七、常见问题与调试建议

  1. CarSim 与 Simulink 通信失败
    → 检查变量名是否完全匹配,单位是否一致(CarSim 默认使用 km/h、deg 等)

  2. MPC求解不收敛或控制量突变
    → 调整权重矩阵(增大Q u Q_uQu抑制控制剧烈变化)
    → 缩短预测时域N p N_pNp

  3. 轨迹跟踪滞后
    → 引入 前馈补偿(如根据曲率调整参考速度)
    → 使用 时变参考点(Look-ahead point)而非最近点

结语

通过复现《无人驾驶车辆模型预测控制》第四章的内容,不仅能深入理解MPC在轨迹跟踪中的数学原理,还能掌握工业级仿真工具链(CarSim + Simulink)的协同开发方法。此基础框架可进一步扩展至动力学模型、多目标优化、障碍物避让等高级场景。

如果你正在学习自动驾驶控制算法,不妨动手搭建这一系统——从理论到仿真的跨越,正是工程师成长的关键一步。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:43:29

XDMA丢包问题分析

目录 简介 外围系统检查 FPGAdebug 主机内存对齐 总结 简介 由于XDMA是黑盒&#xff0c;所以经常有时候排查问题回到瓶颈&#xff0c;那么我们如何去系统的分析&#xff0c;以及解决这些问题呢&#xff1f; 外围系统检查 检查驱动与系统日志&#xff1a;在Linux下&#x…

作者头像 李华
网站建设 2026/4/23 13:35:22

C++函数进阶:默认参数与函数重载,让你的代码更智能!

C函数进阶&#xff1a;默认参数与函数重载&#xff0c;让你的代码更智能&#xff01; 大家好&#xff01;今天我们来聊聊C中两个非常实用的特性&#xff1a;默认参数和函数重载。这两个特性能让我们的代码更灵活、更简洁&#xff0c;提高开发效率。 一、默认参数&#xff1a;让…

作者头像 李华
网站建设 2026/4/20 20:58:43

设计师必藏!1招秒杀相似图,告别手动翻文件夹的痛

救大命&#xff01;手动删重复图的苦我替你尝完了 别装了&#xff0c;你肯定干过这事&#xff1a;在相册里疯狂CtrlF找相似图&#xff0c;删到眼花还漏删。上周我清10G手机备份&#xff0c;硬是花了2小时——这时间够我连喝两杯冰美式了&#xff01;直到发现这个连安装包都没有…

作者头像 李华
网站建设 2026/4/11 9:19:04

5个实用的诊断性分析工具推荐:大数据工程师必备

5个实用的诊断性分析工具推荐:大数据工程师必备 关键词:大数据工程师、诊断性分析工具、数据诊断、数据分析、工具推荐 摘要:本文主要面向大数据工程师,介绍了5个实用的诊断性分析工具。首先说明了这些工具在大数据领域的重要性,接着详细讲解每个工具的特点、适用场景、使…

作者头像 李华