多车跟随仿真(强化学习)
本教程将会引导读者完成 多车跟随仿真(强化学习) 的演示。在使用此功能之前,确保已经完成了 仿真系统搭建
提示
除第一辆小车以外,每一辆小车都可以根据视轴前方的小车做跟随机动
提示
在某些电脑环境中,即使按照仿真系统搭建步骤完成搭建,在运行
rosinit
时,可能会出现Cannot connect to ROS master at http://localhost:11311. Check the specified address or hostname
字样。解决的办法是,将
rosinit
命令改为,rosinit("ip",端口)
。如下图所示:![]()
解决办法
多车跟随策略训练与评估
- 打开
kk-robot-swarm/src/matlab/pfc_rl/train_a2_pfc_td3.m
多车跟随策略训练脚本文件。
提示
文件名
a2
表示只有1台车跟随前车,td3
表示所使用的强化学习算法名称——双延迟深度确定性策略梯度(Twin Delayed Deep Deterministic Policy Gradient)
部分代码说明:
% 设置打开的多车跟随策略仿真训练环境
mdl = "a2_pfc_rl";
open_system(mdl);
% 加载强化学习训练模块
blks = mdl + ["/RL Agent"];
env = rlSimulinkEnv(mdl,blks,obsInfo,actInfo);
% 重置仿真训练环境的部分参数,如小车的位置,具体详见a2pfcResetFcn.m脚本文件
env.ResetFcn = @a2pfcResetFcn;
% 创建跟随策略训练智能体-TD3算法
agent = createPFCAgent(obsInfo,actInfo);
% 设置仿真结束时间Tf为120秒,采样时间Ts为0.1秒,最大训练回合数maxepisodes为30000,每个回合的仿真步长为maxsteps
Tf = 120;
Ts = 0.1;
maxepisodes = 30000;
maxsteps = ceil(Tf/Ts);
% 不会根据跟随仿真设置的奖励值(如某个回合的奖励值达到100以上)中途停止训练
trainingOpts = rlTrainingOptions(...
'MaxEpisodes',maxepisodes,...
'MaxStepsPerEpisode',maxsteps,...
'Verbose',false,...
'Plots','training-progress',...
'StopTrainingCriteria','EpisodeReward',... % 中止训练条件为回合奖励值
'StopTrainingValue',100,... % 中止训练的奖励值为100
'ScoreAveragingWindowLength',10);
% 不根据跟随仿真设置的奖励值中途停止训练
trainingOpts = rlTrainingOptions(...
'MaxEpisodes',maxepisodes,...
'MaxStepsPerEpisode',maxsteps,...
'Verbose',false,...
'Plots','training-progress',...
'ScoreAveragingWindowLength',10);
% 是否开启异步分布式训练 硬件性能配置较高时建议开启
trainingOpts.UseParallel = true;
trainingOpts.ParallelizationOptions.Mode = "async";
trainingOpts.ParallelizationOptions.DataToSendFromWorkers = "Experiences";
trainingOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
% 是否开启训练模式 true为训练模式 false为评估模式
doTraining = false;
% 保存已训练好的神经网络策略数据
save('a2_pfc_rl.mat', 'agent');
% 评估模式查看仿真运行效果
simOptions = rlSimulationOptions('MaxSteps',1200);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward);
提示
在进行训练以前, 避免覆盖已经训练好的神经网络。还请在
train_a2_pcf_td3.m
文件中做如下修改:
- 代码67行,
save('a2_pfc_rl.mat', 'agent');
,将文件名称a2_pfc_rl.mat
修改为自己训练的文件名称。例如:rl_training_xxx.mat
- 代码56行,
doTraining = false;
,改为true
,进行训练- 代码62行,
load('a2_pfc_rl.mat','agent');
,将文件名称改为自己训练的文件名称即可- 该强化学习对CPU和内存要求较高,大概需要
Intel i9-10700K
CPU及以上,内存32GB及以上- 如果您的电脑硬件达不到要求,将代码 31-39行取消注释,同时将
'StopTrainingValue',100,...
中的100
,改为80
,然后注释掉 42-47行。开始训练- 更多详情请见代码注释以及本教程前后部分wiki
- 将多车跟随策略训练脚本文件
train_a2_pfc_td3.m
第56行代码改为doTraining = true;
,即可开启运用强化学习方法训练多车跟随策略。
如图1所示,点击 运行
按钮,matlab会自动打开 a2_pfc_rl.slx
文件;

图1 运行多车跟随策略训练脚本文件
同时,matlab将自动打开 a2_pfc_rl.slx
文件,并且开启强化学习算法训练模式。如图2所示。

图2 a2_pfc_rl.slx文件
以及将会自动打开训练效果窗口和训练进程窗口(包括每次训练的奖励值情况),如图3所示。

图3 训练效果与进程窗口
-
训练完成后,matlab会自动保存已训练好的神经网络策略数据文件,如
a2_pfc_rl.mat
文件 -
将多车跟随策略训练脚本文件
train_a2_pfc_td3.m
第56行代码改为doTraining =false
,取消多车跟随策略训练。 同时将脚本第70-72行代码注释,然后点击运行按钮,将会打开a2_pfc_rl.slx
文件,然后点击该文件菜单栏上的仿真
--运行
即可查看和评估当前使用强化学习算法训练的多车跟随效果。如图4所示。

图4 训练效果
多车跟随策略生成与部署
- 打开
kk-robot-swarm/src/matlab/pfc_rl/gen_pfc_policy.m
单车跟随策略生成脚本文件,如图5所示。点击运行
按钮,matlab会自动生成PFC_Policy.m
和PFC_Agent.mat
两个文件,如图6所示。用户可以拷贝这两个文件,在自己的Simulink工程文件中按照正常脚本文件中的m函数
调用多车跟随策略方法。

图5 运行单车跟随策略生成脚本文件

图6 matlab自动生成的单车跟随策略文件
- 打开
kk-robot-swarm/src/matlab/pfc_rl/b6_pfc_rl.slx
文件,如图7所示。双击图7中的controller
模块,可以看到跟随控制模块,名称为one_car_pfc
,如图8所示。

图7 运行多车跟随仿真环境

图8 多车跟随仿真环境的跟随控制模块
目前,跟随控制模块采用了 混合控制策略,考虑到前后车横距和纵距有时很大,可以采用比较简单的直线跟车策略。双击跟随控制模块,可以看到单车跟随的控制逻辑,示例代码如下:
function action = one_car_pfc(obs, pose2, obs_flag)
longitudinal_rel_dist = obs(3);
lateral_rel_dist = obs(6);
% 在前后车横距和纵距一定的情况下,使用强化学习训练的单车跟随策略
if longitudinal_rel_dist > -0.25 && abs(lateral_rel_dist) <=0.225 && longitudinal_rel_dist < 0
action = double(PFC_Policy(obs));
% 其它情况,使用直线跟车策略
else
action = simple_pfc(obs(1), obs(2), pose2(3));
end
if obs_flag==0
action = [0.0, 0.0];
end
end
% 直线跟车策略
function action = simple_pfc(x_delta, y_delta, yaw2)
kk = -1.0;
new_theta_cmd = atan2(y_delta, x_delta);
delta_theta = angdiff(yaw2, new_theta_cmd);
angular_speed = kk * delta_theta;
new_omega_cmd = angular_speed;
action = [0.225, new_omega_cmd];
end
- 在matlab命令行中输入
rosinit
,启动ROS Master节点,如图9所示。

图9 rosinit
- 打开matlabR2021b,在命令行中输入命令
setenv('MW_MINGW64_LOC','C:\MinGW\')
,然后再输入mex -setup C++
。为matlab配置 MinGW 环境。如图10所示:

图10 Matlab配置MinGW
- 点击菜单栏上的
ROS
--Deplay to Localhost
。如图11所示

图11 deploy
-
接着点击菜单栏上的
仿真
--运行
。启动仿真, -
等待编译完成,系统将会运行仿真。如图12所示:

图12 运行
一键生成ROS代码
-
将多车跟随环境训练生成的
PFC_Policy.m
和PFC_Agent.mat
两个文件与kk-robot-swarm/src/matlab/pfc_rl/c6_pfc_rl.slx
放在一起 -
在matlab命令行中输入
rosinit
,启动ROS Master节点 -
打开
kk-robot-swarm/src/matlab/pfc_rl/c6_pfc_rl.slx
文件,如图14所示。

图12 c6_pfc_rl.slx
- 与
c6_pfc_rl.slx
文件类似,双击图14中的controller
模块,可以看到单车跟随控制模块,名称为one_car_pfc
,如图15所示。

图15 controller模块
注意
多车跟随Demo在小车数量较多的时候(6车以上),存在甩尾和速度跟不上前车的情况
- 考虑到场地限制和甩尾情况,将5号车和6号车
one_car_pfc
模块中的直线跟车策略的线速度参数增加了增益系数,分别为1.2
和1.5
,如图16、图17所示。

图16 增益系数1.2

图17 增益系数1.5
-
在编译代码之前,确保启动了
rosinit
-
然后在菜单栏上的
ROS
--Deploy to Remote Device
。如图18所示。

图18
- 然后点击菜单栏上的
ROS
--Build Model
--Build Model
一键生成ROS代码,如图19所示

图19 生成ROS代码
-
等待编译完成以后,将会看到生成的压缩包文件,如
c6_pfc_rl.tgz
。 -
将生成的 ROS 代码复制到Linux系统中,并解压至
kk-robot-swarm/src/swarm/
下,然后编译整个工作空间即可。