一、代码整体架构与核心目标
本文档所分析的代码基于 C++ 语言实现,围绕模型预测控制(MPC)技术在车辆控制场景的应用展开,构建了一套从车辆状态仿真、MPC 控制指令计算到控制效果可视化的完整解决方案。代码整体采用模块化设计,划分为车辆控制核心模块、可视化模块、外部依赖模块三大核心部分,支持车辆动力学模型与运动学模型两种控制模式,可通过多项式变道轨迹案例验证 MPC 控制算法的有效性,最终通过图形化界面直观呈现实际轨迹与期望轨迹的跟踪效果。
二、核心模块功能解析
2.1 车辆控制核心模块
该模块是整个系统的'大脑',负责实现车辆状态仿真、MPC 控制逻辑计算与控制指令生成,包含两个核心控制示例程序,分别对应不同的车辆模型。
2.1.1 车辆动力学控制(VehicleDynControl_mpc.cpp)
- 核心功能:基于车辆动力学模型,实现高精度轨迹跟踪控制。动力学模型考虑车辆加速度、转向角对车身姿态(位置、航向角、角速度)的动态影响,适用于对控制精度要求较高的场景(如高速行驶、复杂路况)。
- 关键流程:
- 初始化配置:创建期望轨迹(DesiredTrajectory)、车辆模型(Vehicle)、MPC 控制器(MPCController)等核心对象,设置仿真时间步长(dT=0.01s)、车辆初始姿态(初始位置 (0,0)、航向角 0)与初始速度(10.0 单位速度)。
- 仿真循环(1150 次迭代):
- 状态采集:实时获取车辆当前位置(xpos/ypos)、速度(speed)、航向角(phi)、航向角速度(dphi)等状态信息;
- 控制计算:调用
controller.ComputeControlCommand(),结合当前时间、车辆状态与期望轨迹,计算出加速度(acc)与转向角(steer)控制指令; - 数据存储:记录车辆实际行驶轨迹的位置数据(xs/ys 向量);
- 车辆仿真:将控制指令传入车辆模型,调用
veh.update()更新车辆下一时刻状态;
- 结果可视化:将存储的实际轨迹数据与期望轨迹数据传入
display()函数,通过图形界面展示对比效果。
2.1.2 车辆运动学控制(VehicleKinematicControl_mpc.cpp)
- 核心功能:基于车辆运动学模型,实现轻量化轨迹跟踪控制。运动学模型忽略车辆动力学特性(如轮胎侧偏、车身惯性),仅通过几何关系计算车辆姿态变化,适用于低速行驶、控制响应要求快的场景(如园区内车辆、低速泊车)。
- 与动力学控制的差异:
- 控制器类型不同:采用
KineMPCController运动学 MPC 控制器,控制逻辑更简洁,计算效率更高; - 初始参数不同:初始速度设置为 5.0 单位速度(低于动力学控制),仿真迭代次数为 3600 次(多于动力学控制),适配低速场景下的长周期仿真;
- 轨迹数据处理不同:期望轨迹数据通过
traj.path.size()动态获取,避免固定数组长度导致的数据溢出问题。
- 控制器类型不同:采用
2.2 可视化模块
该模块基于ImGui+GLFW+ImPlot图形库开发,负责将 MPC 控制的轨迹跟踪结果、输入输出数据以图表形式可视化,包含两个核心绘图程序,满足不同的展示需求。
2.2.1 轨迹对比可视化(VisPlot1.cpp)
- 核心功能:在同一图表中展示'实际行驶轨迹'与'期望规划轨迹',直观验证 MPC 控制器的轨迹跟踪精度。
- 关键实现:
- 窗口初始化:创建 1280×720 像素的 GLFW 窗口,初始化 ImGui 与 ImPlot 上下文,配置 OpenGL 投影矩阵(支持窗口缩放、平移);
- :支持 ESC 键关闭窗口,窗口大小变化时自动调整视图比例(通过 函数更新正交投影矩阵);


