基于鲁棒模型预测控制RMPC的车辆路径跟踪控制研究,通过carsim和simulink进行验证。 基于车辆二自由度动力学模型,状态变量为横向偏差,航向偏差,质心侧偏角和横摆角速度;前轮转角和附加横摆力矩为控制量。 控制器预测模型为LPV模型。 内容包含 simulink模型 carsim的cpr文件 main和rmpc的m文件 rmpc采用s function编写 RMPC相关论文和DYC论文 图为双移线仿真效果图

在自动驾驶领域,车辆路径跟踪控制是关键技术之一。今天咱就唠唠基于鲁棒模型预测控制(RMPC)的车辆路径跟踪控制研究,并且还会通过 Carsim 和 Simulink 进行验证,那过程可有趣了。

一、核心模型:车辆二自由度动力学模型

咱先来说说这个车辆二自由度动力学模型,它里面的状态变量包括横向偏差、航向偏差、质心侧偏角和横摆角速度。这些变量就像是车辆行驶的“小账本”,记录着车辆实时的行驶状态。而控制量呢,是前轮转角和附加横摆力矩,它们就像是司机的手和脚,控制着车辆的行驶方向和姿态。

比如说,在 Matlab 里要是想简单定义这些状态变量和控制量,可以像下面这样:

% 定义状态变量
lateral_error = 0; % 横向偏差初始值设为0
heading_error = 0; % 航向偏差初始值设为0
side_slip_angle = 0; % 质心侧偏角初始值设为0
yaw_rate = 0; % 横摆角速度初始值设为0

% 定义控制量
steering_angle = 0; % 前轮转角初始值设为0
yaw_moment = 0; % 附加横摆力矩初始值设为0

这里简单初始化了这些变量,实际应用中肯定得根据车辆实时动态去更新它们的值。

二、预测模型:LPV 模型

控制器预测模型采用的是 LPV 模型,它就像一个聪明的小军师,能根据车辆当前的状态预测下一步该怎么调整。LPV 模型会考虑到车辆参数随着不同行驶工况的变化而变化,让控制更加精准。

三、验证工具:Carsim 与 Simulink

Carsim 的 CPR 文件

Carsim 可是个厉害的车辆动力学仿真软件,我们用它生成的 CPR 文件来提供高精度的车辆动力学模型。这个 CPR 文件就像是车辆的“数字化替身”,各种车辆参数都在里面。比如说车辆的质量、轴距、轮胎特性等等,这些参数都会影响车辆的实际行驶表现。

Simulink 模型

Simulink 模型则像是一个搭建好的舞台,把各种控制算法和车辆动力学模型组合到一起进行仿真。在这个模型里,我们会把之前说的车辆二自由度动力学模型、LPV 预测模型以及 RMPC 控制器都整合进来。

给大家看看简单的 Simulink 模型搭建思路代码示例(这里只是伪代码示意,实际搭建更复杂):

% 创建一个简单的 Simulink 模型
open_system('untitled');

% 添加车辆动力学模型模块
add_block('simulink/Continuous/Integrator', 'untitled/vehicle_dynamics/integrator1');
% 这里假设 Integrator1 用于处理某个状态变量的积分运算

% 添加 LPV 预测模型模块
add_block('simulink/User - defined Functions/Fcn', 'untitled/LPV_model/fcn1');
% 假设 fcn1 模块里编写 LPV 模型的相关算法

% 添加 RMPC 控制器模块
add_block('simulink/User - defined Functions/S - Function', 'untitled/RMPC_controller/sfunc1');
% sfunc1 模块就是咱们用 S - function 编写的 RMPC 控制器

四、代码实现:Main 和 RMPC 的 M 文件

Main M 文件

Main M 文件就像是总指挥,它负责调用各个模块,设置仿真参数,然后启动整个仿真过程。比如说,设置仿真的时间步长、初始条件等等。

% Main.m 文件示例
% 设置仿真参数
simulation_time = 10; % 仿真时间10秒
time_step = 0.01; % 时间步长0.01秒

% 初始化状态变量和控制量
lateral_error = 0;
heading_error = 0;
side_slip_angle = 0;
yaw_rate = 0;
steering_angle = 0;
yaw_moment = 0;

% 启动 Simulink 仿真
sim('your_simulink_model', simulation_time, 'FixedStep', num2str(time_step));

RMPC 的 M 文件(S - function 编写)

RMPC 的 M 文件采用 S - function 编写,它是整个控制算法的核心。S - function 就像是一个自定义的黑匣子,能按照我们设定的规则处理输入输出。在 RMPC 的 S - function 里,会根据当前的车辆状态和预测模型的结果,计算出合适的前轮转角和附加横摆力矩。

function [sys, x0, str, ts] = rmpc_sfunc(t, x, u, flag)
switch flag,
    case 0,
        % 初始化
        [sys, x0, str, ts] = mdlInitializeSizes;
    case 1,
        % 导数计算,这里因为 RMPC 主要是计算控制量,导数部分可能简单处理
        sys = mdlDerivatives(t, x, u);
    case 2,
        % 离散状态更新,这里如果有离散状态需要更新可以在此处理
        sys = mdlUpdate(t, x, u);
    case 3,
        % 输出计算,计算前轮转角和附加横摆力矩
        sys = mdlOutputs(t, x, u);
    case 4,
        % 计算下一个采样时间,这里如果是固定步长仿真可简单返回
        sys = mdlGetTimeOfNextVarHit(t, x, u);
    case 9,
        % 结束仿真
        sys = mdlTerminate(t, x, u);
    otherwise
        % 错误处理
        DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 2; % 输出前轮转角和附加横摆力矩
sizes.NumInputs      = 4; % 输入横向偏差、航向偏差、质心侧偏角和横摆角速度
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; 
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];

function sys = mdlDerivatives(t, x, u)
sys = [];

function sys = mdlUpdate(t, x, u)
sys = [];

function sys = mdlOutputs(t, x, u)
lateral_error = u(1);
heading_error = u(2);
side_slip_angle = u(3);
yaw_rate = u(4);

% 这里是简单示意,实际要根据 RMPC 算法计算控制量
steering_angle = lateral_error * 0.1; 
yaw_moment = heading_error * 0.2; 

sys = [steering_angle; yaw_moment];

function sys = mdlGetTimeOfNextVarHit(t, x, u)
sampleTime = 0.01; % 采样时间0.01秒
sys = t + sampleTime;

function sys = mdlTerminate(t, x, u)
sys = [];

五、理论支持:相关论文

在整个研究过程中,RMPC 相关论文和 DYC(直接横摆力矩控制,这里可能与附加横摆力矩控制相关)论文给了我们很多理论支持。这些论文里详细阐述了算法的原理、推导过程以及一些实验验证结果。就像是武林秘籍,让我们能站在巨人的肩膀上更好地理解和实现这个控制算法。

六、成果展示:双移线仿真效果图

最后,看看双移线仿真效果图。从图中可以直观地看到车辆在 RMPC 控制下沿着预设的双移线路径行驶。车辆的横向偏差和航向偏差都能被有效地控制在一定范围内,说明我们的 RMPC 控制算法在车辆路径跟踪控制上表现还不错。要是横向偏差过大,就说明控制算法可能还得再优化优化,调整调整参数啥的。

通过这次研究,咱对基于 RMPC 的车辆路径跟踪控制有了更深入的理解和实践,后续还能继续优化算法,让车辆行驶得更稳更准。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐