此示例显示了如何训练多个智能体以共同执行车辆的路径跟踪控制(PFC)。 PFC的目标是通过控制纵向加速度和制动,使车辆以设定的速度行驶,同时保持与领头车的安全距离,并通过控制前转向角保持车辆沿其车道中心线行驶 。 有关PFC的更多信息,请参见路径跟随控制系统(模型预测控制工具箱)。
总览
训练DDPG路径跟踪控制智能体中显示了训练强化学习智能体以执行PFC的示例。 在该示例中,训练了单个深度确定性策略梯度(DDPG)智能体,以控制车辆的纵向速度和横向转向。 在此示例中,您将训练两个强化学习智能体-DDPG智能体为纵向控制回路提供连续的加速度值,而深度Q网络(DQN)智能体程序为横向控制回路提供离散的转向角值。
创建环境
此示例的环境包括用于简单自行车模型和用于领头车的简单纵向模型。 训练的目标是通过控制纵向加速度和制动,使自动驾驶汽车以设定的速度行驶,同时保持与领先汽车的安全距离,并通过控制前转向角使自动驾驶汽车沿着车道的中心线行驶。
加载环境参数
multiAgentPFCParams
打开Simulink模型。
mdl = "rlMultiAgentPFC";
open_system(mdl)
点击进入文件夹
在此模型中,两个强化学习智能体(RL Agent1和RL Agent2)分别提供纵向加速度和转向角信号。
当出现下列任何条件时,模拟终止:
- ∣ e 1 ∣ > 1 |e_ 1| >1 ∣e1∣>1(横向偏差大小超过1)
- V e g o < 0.5 V_{ego} <0.5 Vego<0.5 (ego car的纵向速度降到0.5以下)。
- D r e l < 0 D_{rel} <0 Drel<0 (ego与lead car的距离低于0)
对于纵向控制器(RL Agent1):
- 赛车 V r e f V_{ref} Vref的参考速度定义如下。如果相对距离小于安全距离,车跟踪前车速度和驾驶员设定速度的最小值。以这种方式,车与前车保持一定的距离。如果相对距离大于安全距离,车会跟踪驾驶员设定的速度。在本例中,安全距离被定义为汽车纵向速度V的线性函数,即 t g a p ∗ V + D d e f a u k t t_{gap}*V+D_{defaukt} tgap∗V+Ddefaukt。安全距离决定了车的跟踪速度。
- 环境观测包括纵向测量:速度误差 e V = V r e f − V e_V =V_{ref}-V eV=Vref−V,其积分 ∫ e \int{e} ∫e,汽车纵向速度V。
- 动作信号由介于-3和2 m / s ^ 2之间的连续加速度值组成。
- 每一步t提供的奖励 r t r_t rt为
这里, a t − 1 a_{t-1} at−1是前一个时间步长的加速度输入:
- 如果仿真终止, F t = 1 F_t =1 Ft=1,否则 F t = 0 F_t =0 Ft=0。
- 如果 e v 2 < 1 e^2_v <1 ev2<1,则 M t = 1 M_t =1 Mt=1,否则 M t = 0 M_t =0 Mt=0。
对于横向控制器(RL Agent2):
- 环境观测包括横向测量:横向偏差 e 1 e_1 e1,相对偏航角 e 2 e_2 e2,它们的导数 e 1 ˙ \dot{e_1} e1˙和 e 2 ˙ \dot{e_2} e2˙,以及它们的积分 ∫ e 1 \int{e_1} ∫e1和 ∫ e 2 \int{e_2} ∫e2。
- 动作信号由离散的转向角动作组成,其值以1度(0.0175 rad)的步长从-15度(-0.2618 rad)到15度(0.2618 rad)。
- 每一步t提供的奖励 r t r_t rt为
这里, u t − 1 u_{t-1} ut−1是前一个时间步长的转向输入, a t − 1 a_{t-1} at−1是前一个时间步长的加速度输入
- 如果仿真终止, F t = 1 F_t =1 Ft=1,否则 F t = 0 F_t =0 Ft=0。
- H t = 1 , e 1 2 < 0.01 H_t =1 ,e^ 2_ 1 <0.01 Ht=1,e12<0.01,否则 H t = 0 H_t =0 Ht=0。
如果模拟提前终止,奖励函数中的逻辑项 ( F t 、 M t 和 H t ) (F_t、M_t和H_t) (Ft、Mt和Ht)对施动者进行惩罚,同时鼓励智能体减小横向误差和速度误差。
创建纵向控制回路的观察和动作规范。
obsInfo1 = rlNumericSpec([3 1]);
actInfo1 = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2);
创建横向控制回路的观察和动作规范。
obsInfo2 = rlNumericSpec([6 1]);
actInfo2 = rlFiniteSetSpec((-15:15)*pi/180);
将观察和动作规范组合为一个单元阵列。
blks = mdl + ["/RL Agent1", "/RL Agent2"];
env = rlSimulinkEnv(mdl,blks,obsInfo,actInfo);
使用ResetFcn属性为环境指定一个重置函数。 函数pfcResetFcn在训练期间的每个episode 开始时随机设置领先和车辆的初始姿势。
env.ResetFcn = @pfcResetFcn;
创建智能体
在此示例中,您将创建两个强化学习智能体。 首先,固定随机种子以提高可重复性。
rng(0)
在此示例中,两个智能体在相同的采样时间操作。 设置采样时间值(以秒为单位)。
Ts = 0.1;
纵向控制
纵向控制回路的智能体是DDPG智能体。 DDPG智能体使用评论者价值函数表示来估算给定的观察和操作的长期奖励,并使用行动者策略表示来选择操作。 有关创建深度神经网络价值函数和策略表示的更多信息,请参阅创建策略和价值函数表示。
使用createCCAgent函数创建用于纵向控制的DDPG智能体。 该智能体的结构类似于“用于自适应巡航控制的Train DDPG智能体”示例。
agent1 = createACCAgent(obsInfo1,actInfo1,Ts);
横向控制
横向控制回路的智能体是DQN智能体。 DQN智能体使用评论者价值函数表示法,根据观察和操作来估计长期奖励。
agent2 = createLKAAgent(obsInfo2,actInfo2,Ts);
训练智能体
指定训练选项。 对于此示例,使用以下选项。
-
每个训练剧集最多运行5000个剧episode ,每个episode 最多持续maxsteps时间步长。
-
在“情节管理器”对话框中显示训练进度(设置“Verbose ”和“Plots ”选项)。
-
当DDPG和DQN智能体的平均奖励分别大于480和1195时,请停止对其进行训练。 当一个智能体达到其停止标准时,它会模拟自己的策略而无需学习,而另一个智能体则继续训练。
Tf = 60; % simulation time
maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainingOpts = rlTrainingOptions(...
'MaxEpisodes',maxepisodes,...
'MaxStepsPerEpisode',maxsteps,...
'Verbose',false,...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',[480,1195]);
训练这些智能体是一个计算密集型过程,需要几分钟才能完成。 为了节省运行本示例的时间,请通过将doTraining设置为false来加载预训练的智能体。 要自己训练,请将doTraining设置为true。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train([agent1,agent2],env,trainingOpts);
else
% Load pretrained agents for the example.
load('rlPFCAgents.mat')
end
下图显示了这两个智能体的训练进度的截图。
智能体仿真
要验证训练后智能体的性能,请通过取消注释以下命令来在Simulink环境中仿真智能体。 有关智能体仿真的更多信息,请参见rlSimulationOptions和sim。
% simOptions = rlSimulationOptions('MaxSteps',maxsteps);
% experience = sim(env,[agent1, agent2],simOptions);
要使用确定性初始条件演示训练后的智能体,请在Simulink中模拟模型。
e1_initial = -0.4;
e2_initial = 0.1;
x0_lead = 80;
sim(mdl)
下图显示了在模拟开始时领头的汽车比后面的汽车领先70 m。
-
领头车会定期将速度从24 m / s更改为30 m / s(右上图)。 后面的汽车在整个仿真过程中保持安全距离(右下图)。
-
在0到30秒之间,后面汽车会追踪设定的速度(右上图)并经历一些加速度(左上图)。 此后,加速度减小为0。
-
左下图显示了横向偏差。 如图所示,横向偏差在1秒内大大减小。 横向偏差保持小于0.1 m。