这个例子展示了如何在Simulink中训练一个深度确定性策略梯度(DDPG)代理,用于车道保持辅助(LKA)。金宝app为了使训练更有效,DDPG代理的actor被初始化为一个深度神经网络,这个深度神经网络之前是用监督学习训练的。这个演员接受过训练模拟MPC控制器的车道保持辅助的例子。
有关DDPG代理的更多信息,请参见深度确定性策略梯度代理.
车道保持应用的训练目标是通过调整前转向角度使自我车辆沿车道中心线行驶。这个例子使用了相同的自我车辆动力学和传感器动力学对DQN代理进行车道保持协助培训的例子。
m = 1575;车辆总质量(kg)IZ = 2875;偏航惯性矩% (mNs^2)lf = 1.2;重心到前胎纵向距离百分比(m)lr = 1.6;从重心到后轮胎的%纵向距离(m)cf = 19000;前轮胎的%转弯刚度(n / rad)Cr = 33000;后轮转弯刚度百分比(N/rad)Vx = 15;%纵向速度(m / s)
定义采样时间,Ts
和仿真持续时间,T
,在几秒钟内。
t = 0.1;T = 15;
LKA系统的输出是自我车辆的前转向角度。考虑到自我车辆的物理限制,限制其转向角度的范围[-60,60]度。以弧度指定约束条件。
u_min = -1.04;u_max = 1.04;
将道路的曲率定义为常数0.001( ).
rho = 0.001;
设置横向偏差的初始值(e1_initial
)及相对偏航角(e2_initial
).在训练期间,这些初始条件被设置为每个训练集的随机值。
e1_initial = 0.2;e2_initial = -0.1;
打开模型。
mdl =“rlActorLKAMdl”;open_system (mdl)
定义模型中RL Agent块的路径。
agentblk = [mdl' / RL代理'];
为自我车辆创建一个强化学习环境界面。为此,首先定义观察和操作规范。这些观察和动作与在模拟MPC控制器的车道保持辅助.
对环境的六个观测是横向速度 ,横摆率 ,横向偏差 ,相对偏航角 ,前一步的转向角度 ,曲率 .
observationInfo = rlNumericSpec([6 1],...“LowerLimit”,负无穷* (6,1),“UpperLimit”,正* (6,1));observationInfo。Name =“观察”;
对环境的作用是前转向角。在创建动作规范对象时指定转向角度约束。
ActionInfo = rlnumericspec([1 1],“LowerLimit”u_min,“UpperLimit”, u_max);actionInfo。Name =“转向”;
在该模型中,LKA块的信号处理创建观察矢量信号,计算奖励功能,并计算停止信号。
奖励 ,提供在每个时间步骤 ,如下,其中 控制输入是否来自前一个时间步骤 .
模拟停止时 .
创造强化学习环境。
ent = rl金宝appsimulinkenv(mdl,agentblk,devalionationInfo,ActionInfo);
若要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境复位函数。的localResetFcn
在示例结束时定义的功能将初始横向偏差和相对偏航角设置为随机值。
env。ResetFcn = @(在)localResetFcn(的);
修复随机生成器种子的再现性。
rng (0)
DDPG代理使用批判价值函数表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个深度神经网络,它有两个输入,状态和动作,和一个输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
评论家= createLaneKeepingCritic (observationInfo actionInfo);
DDPG代理使用参与者表示来决定对给定的观察采取什么行动。要创建参与者,首先要创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。
(演员,actorOptions) = createLaneKeepingActor (observationInfo actionInfo);
这些初始的行动者和评论家网络具有随机的初始参数值。
要创建DDPG代理,首先指定DDPG代理选项。
agentOptions = rlDDPGAgentOptions (...“SampleTime”,ts,...'targetsmoothfactor'1 e - 3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“MiniBatchSize”,64....);agentOptions.NoiseOptions.Variance = 0.3;agentOptions.NoiseOptions.VarianceDecayRate = 1 e-5;
使用指定的参与者表示、评论家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
代理= rlddpgagent(演员,批评者,代理选项);
作为基线,用一个具有随机初始参数的参与者来训练agent。要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
跑步训练最多50000集,每集最多持续150个时间步。
在“插曲管理器”对话框中显示培训进度。
当章节奖励达到-1时停止训练。
为累积奖励大于-的每一集保存代理的副本2.5
.
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 50000;maxsteps = T / T;trainingOpts = rlTrainingOptions (...“MaxEpisodes”maxepisodes,...'maxstepperepisode'maxsteps,...“详细”,错误的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“EpisodeReward”,...“StopTrainingValue”, 1...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”, -2.5);
使用培训代理商使用火车
函数。培训是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
来假
.训练代理人,套装doTraining
来真的
.
doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainingOpts);其他的%为示例加载预训练的代理。负载('ddpgfromscratch.mat');结束
你可以将你的代理的角色网络设置为一个已经被训练过的深度神经网络。对于这个例子,使用深度神经网络模拟MPC控制器的车道保持辅助的例子。该网络通过有监督学习来模拟模型预测控制器。
加载佩带的演员网络。
负载(“imitateMPCNetActorObj.mat”,“imitateMPCNetObj”);
使用预先训练的参与者创建一个参与者表示。
supervisedActor = rlDeterministicActorRepresentation (imitateMPCNetObj observationInfo actionInfo,...“观察”, imitateMPCNetObj。InputNames,'行动',{“Scale1”},ActorOptions);
检查用户使用的网络supervisedActor
就是装了子弹的那个。为此,使用相同的随机输入观测值来评估网络和代理。
testData =兰德(6,1);
评估深度神经网络。
predictImNN =预测(imitateMPCNetObj testData”);
评估的演员。
evaluateRLRep = getAction (supervisedActor {testData});
比较结果。
ERROR = EVALUATERLREP {:} - Predictimnn
错误=单0
使用预先训练的actor创建DDPG代理。
代理= rlDDPGAgent (supervisedActor,评论家,agentOptions);
减少最大的训练次数,并使用火车
函数。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
来假
.训练代理人,套装doTraining
来真的
.
trainingOpts。MaxEpisodes = 5000;doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainingOpts);其他的%为示例加载预训练的代理。负载('ddpgfrompropretrated.mat');结束
通过使用佩带的演员网络,DDPG代理的训练更有效。总培训时间和培训步骤总数都提高了大约20%。此外,接近最佳结果附近的训练的剧集的数量从大约4500降至大约3500。
要验证经过培训的代理的性能,取消注释以下两行代码,并在环境中进行模拟。有关代理模拟的更多信息,请参见RlsimulationOptions.
和sim卡
.
% simOptions = rlSimulationOptions('MaxSteps', MaxSteps);% experience = sim(env,agent,simOptions);
要检查Simulink模型中训练过的代理的性能,请使用前面定义的初始条件(金宝appe1_initial = 0.2
和e2_initial = -0.1
).
sim (mdl)
如下图所示,横向误差(中间图)和相对偏航角(底部图)都被驱动到零。车辆开始时与中心线有横向偏差(0.2米)和非零偏航角误差(-0.1 rad)。车道保持控制器使自我车辆在大约两秒后沿中心线行驶。转向角度(顶部图)显示控制器在大约2秒后达到稳定状态。
关闭Simulink金宝app模型而不保存任何更改。
bdclose (mdl)
功能= localResetFcn(中)%随机设置横向偏差值。= setVariable (,“e1_initial”, 0.5 *(1 + 2 *兰德));%设置相对偏航角的随机值。= setVariable (,“e2_initial”, 0.1 *(1 + 2 *兰德));结束功能代理= loadPretrainedParams(代理,actorParams criticParams)%设置Actor参数。Actor = GetAttor(代理);PretRordactor = SetLearnableParameters(演员,ActorParams);%设置批评家参数。评论家= getCritic(代理);pretrainedCritic = setLearnableParameters(评论家,criticParams);在代理中设置演员和评论家表示。代理= setActor(代理、pretrainedActor);代理= setCritic(代理、pretrainedCritic);结束