该示例演示了如何训练多个智能体协同执行车辆的路径跟踪控制(PFC)。PFC的目标是通过控制纵向加速和刹车,使自我车辆以设定的速度行驶,同时保持与领先车辆的安全距离,并通过控制前转向角度使车辆保持在车道的中心线上行驶。有关PFC的更多信息,请参见<一种href="//www.tatmou.com/help/mpc/ref/pathfollowingcontrolsystem.html" class="a">路径跟随控制系统 列出了培训钢筋学习代理的示例<一种href="//www.tatmou.com/help/reinforcement-learning/ug/train-ddpg-agent-for-path-following-control.html" class="a">列车DDPG代理用于路径跟踪控制 经过训练的agent通过合作行为进行PFC,并取得了满意的结果。 本示例的环境包括ego汽车的简单自行车模型和lead汽车的简单纵向模型。训练目标是通过控制纵向加速和制动使自我车以设定的速度行驶,同时保持与领先车的安全距离,同时通过控制前转向角度使自我车保持在其车道的中心线上行驶。 加载环境参数。 打开Simulin金宝appk模型。 在该模型中,两个reinforcement learning agent (RL Agent1和RL Agent2)分别提供纵向加速度和转向角度信号。 当发生下列任何情况时,模拟将终止。
(横向偏差的幅度超过1)
自我车的纵向速度降到0.5以下。
(自我与领车的距离在零以下) 纵向控制器(RL Agent1): 自助式汽车的参考速度 来自环境的观测包含了纵向测量:速度误差 动作信号由-3到2 m/s^2之间的连续加速度值组成。 奖励
这里,
如果模拟终止,则为
如果 对于横向控制器(RL Agent2): 来自环境的观察结果包含横向测量:横向偏差 动作信号由离散转向角动作组成,其在1度(0.0175Rad)的步长的-15度(-0.2618 rad)到15度(0.2618 rad)的离散转向角动作。 奖励
这里,
如果模拟终止,则为
, 否则 奖赏功能的逻辑术语( 创建纵向控制回路的观察和动作规范。 创建横向控制回路的观察和动作规范。 将观察和动作规范结合为单元阵列。 创建一个Simul金宝appink环境接口,指定两个代理块的块路径。块路径的顺序必须与观察和动作规范单元阵列的顺序匹配。 使用该环境为环境指定重置函数 对于本例,您将创建两个强化学习代理。首先,确定随机种子的重现性。 两个代理在该示例中在相同的采样时间下运行。设置采样时间值(以秒为单位)。 用于纵向控制回路的试剂是DDPG剂。DDPG代理近似于使用批评值函数表示,使用批评值函数表示来达到长期奖励,并使用Actor策略表示选择操作。有关创建深度神经网络价值函数和策略表示的更多信息,请参阅<一种href="//www.tatmou.com/help/reinforcement-learning/ug/create-policy-and-value-function-representations.html" class="a">创建策略和值函数表示 使用 横向控制回路的代理是DQN代理。DQN代理近似于使用批评价值函数表示给定的长期奖励和操作。 使用 指定培训选项。对于此示例,请使用以下选项。 每一集最多5000集,每一集最多持续 在Episode Manager对话框中显示培训进度(设置 当分别收到大于480和1195的平均奖励时,停止培训DDPG和DQN代理。当一个代理达到其停止标准时,它会模拟自己的政策而不学习,而另一个代理继续培训。 训练特工使用<一种href="//www.tatmou.com/help/reinforcement-learning/ref/rl.agent.rlqagent.train.html" class="a"> 下图显示了两个代理的训练进度快照。 要验证培训的代理的性能,请通过取消注释以下命令来模拟Simulink环境中的代理。金宝app有关代理模拟的更多信息,请参阅<一种href="//www.tatmou.com/help/reinforcement-learning/ref/rlsimulationoptions.html" class="a"> 要使用确定性初始条件展示培训的代理,请在Simulink中模拟模型。金宝app 下图是模拟开始时,领头车领先自我车70米时的结果。 引车的速度从24米/秒周期性地变化到30米/秒(右上图)。ego汽车在整个模拟过程中保持安全距离(右下图)。 自我汽车从0到30秒追踪设定的速度(右上角)并体验一些加速度(左上绘图)。之后,加速度降低到0。 左下角显示横向偏差。如图所示,横向偏差在1秒内大大降低。横向偏差仍然小于0.1μm。
概述
创建环境
multiAgentPFCParams
mdl =
obsInfo1 = rlNumericSpec([3 1]);actInfo1 = rlNumericSpec([1 1],
obsInfo2 = rlNumericSpec([6 1]);actInfo2 = rlFiniteSetSpec((15:15) *π/ 180);
ObsInfo = {ObsInfo1,ObsInfo2};Actinfo = {Actinfo1,Actinfo2};
blks = mdl + [
env.resetfcn = @pfcresetfcn;
创造代理人
RNG(0)
ts = 0.1;
纵向控制
Agent1 = CreateAccagent(ObsInfo1,Actinfo1,TS);
横向控制
agent2 = createLKAAgent (obsInfo2 actInfo2, Ts);
培训代理商
Tf = 60;
火车
doTraining = false;
模拟代理
rlSimulationOptions
sim卡
%simoptions = rlsimulationoptions('maxsteps',maxsteps);
e1_initial = -0.4;e2_initial = 0.1;x0_lead = 80;sim (mdl)
也可以看看