多车跟随仿真(强化学习)

本教程将会引导读者完成 多车跟随仿真(强化学习) 的演示。在使用此功能之前,确保已经完成了 仿真系统搭建

提示

除第一辆小车以外,每一辆小车都可以根据视轴前方的小车做跟随机动

提示

在某些电脑环境中,即使按照仿真系统搭建步骤完成搭建,在运行 rosinit 时,可能会出现 Cannot connect to ROS master at http://localhost:11311. Check the specified address or hostname 字样。

解决的办法是,将 rosinit 命令改为, rosinit("ip",端口)。如下图所示:

解决办法

多车跟随策略训练与评估

  1. 打开 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 文件中做如下修改:

  1. 代码67行, save('a2_pfc_rl.mat', 'agent');,将文件名称a2_pfc_rl.mat 修改为自己训练的文件名称。例如:rl_training_xxx.mat
  2. 代码56行,doTraining = false;,改为 true,进行训练
  3. 代码62行,load('a2_pfc_rl.mat','agent');,将文件名称改为自己训练的文件名称即可
  4. 该强化学习对CPU和内存要求较高,大概需要 Intel i9-10700K CPU及以上,内存32GB及以上
  5. 如果您的电脑硬件达不到要求,将代码 31-39行取消注释,同时将 'StopTrainingValue',100,... 中的 100,改为 80,然后注释掉 42-47行。开始训练
  6. 更多详情请见代码注释以及本教程前后部分wiki
  1. 将多车跟随策略训练脚本文件 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 训练效果与进程窗口

  1. 训练完成后,matlab会自动保存已训练好的神经网络策略数据文件,如 a2_pfc_rl.mat 文件

  2. 将多车跟随策略训练脚本文件 train_a2_pfc_td3.m 第56行代码改为 doTraining =false,取消多车跟随策略训练。 同时将脚本第70-72行代码注释,然后点击运行按钮,将会打开a2_pfc_rl.slx文件,然后点击该文件菜单栏上的仿真--运行即可查看和评估当前使用强化学习算法训练的多车跟随效果。如图4所示。

图4 训练效果

多车跟随策略生成与部署

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

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

图6 matlab自动生成的单车跟随策略文件

  1. 打开 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
  1. 在matlab命令行中输入 rosinit,启动ROS Master节点,如图9所示。

图9 rosinit

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

图10 Matlab配置MinGW

  1. 点击菜单栏上的 ROS -- Deplay to Localhost。如图11所示

图11 deploy

  1. 接着点击菜单栏上的 仿真 -- 运行。启动仿真,

  2. 等待编译完成,系统将会运行仿真。如图12所示:

图12 运行

一键生成ROS代码

  1. 将多车跟随环境训练生成的 PFC_Policy.mPFC_Agent.mat 两个文件与kk-robot-swarm/src/matlab/pfc_rl/c6_pfc_rl.slx放在一起

  2. 在matlab命令行中输入 rosinit,启动ROS Master节点

  3. 打开kk-robot-swarm/src/matlab/pfc_rl/c6_pfc_rl.slx文件,如图14所示。

图12 c6_pfc_rl.slx

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

图15 controller模块

注意

多车跟随Demo在小车数量较多的时候(6车以上),存在甩尾和速度跟不上前车的情况

  1. 考虑到场地限制和甩尾情况,将5号车和6号车 one_car_pfc 模块中的直线跟车策略的线速度参数增加了增益系数,分别为 1.21.5,如图16、图17所示。

图16 增益系数1.2

图17 增益系数1.5

  1. 在编译代码之前,确保启动了 rosinit

  2. 然后在菜单栏上的 ROS -- Deploy to Remote Device 。如图18所示。

图18

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

图19 生成ROS代码

  1. 等待编译完成以后,将会看到生成的压缩包文件,如 c6_pfc_rl.tgz

  2. 将生成的 ROS 代码复制到Linux系统中,并解压至 kk-robot-swarm/src/swarm/ 下,然后编译整个工作空间即可。