此示例显示了如何在Simulink中为车道保持辅助(LKA)训练深度确定性策略梯度(DDPG)代理。为了提高训练效率,DDPG代理的参与者使用一个深度神经网络进行初始化,该神经网络以前使用监督学习进行过训练。该参与者在万博1manbetx模拟MPC控制器的车道保持辅助实例
有关DDPG代理的更多信息,请参阅深度确定性策略梯度代理.
车道保持应用的训练目标是通过调整前转向角度使自我车辆沿车道中心线行驶。这个例子使用了相同的自我车辆动力学和传感器动力学为车道保持辅助培训DQN代理实例
m=1575;%车辆总质量(kg)工业区= 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
,以秒为单位。
Ts=0.1;T=15;
LKA系统的输出是自我车辆的前转向角度。考虑到自我车辆的物理限制,限制其转向角度的范围[-60,60]度。以弧度指定约束条件。
u_min = -1.04;u_max = 1.04;
将道路的曲率定义为常数0.001( ).
rho=0.001;
设置横向偏差的初始值(e1_initial
)和相对偏航角(e2_首字母
).在培训期间,这些初始条件被设置为每个培训事件的随机值。
e1_初始值=0.2;e2_初始值=-0.1;
打开模型。
mdl=“rlActorLKAMdl”;open_system (mdl)
定义模型中RL代理块的路径。
agentblk=[mdl' / RL代理'];
为ego车辆创建强化学习环境界面。为此,首先定义观察和行动规范。这些观察和行动与中使用的监督学习功能相同模拟MPC控制器的车道保持辅助.
对环境的六个观测是横向速度 ,横摆率 ,横向偏移 ,相对偏航角 ,上一步的转向角 ,曲率 .
observationInfo=rlNumericSpec([6 1],...“LowerLimit”,-inf*one(6,1),“UpperLimit”,正* (6,1));observationInfo。Name =“观察”;
环境的操作是前转向角。在创建操作规范对象时指定转向角约束。
actionInfo=rlNumericSpec([1],“LowerLimit”u_min,“UpperLimit”,u_max);actionInfo.Name=“转向”;
在该模型中,LKA块的信号处理创建观测向量信号,计算奖励函数,并计算停止信号。
奖励 ,在每个时间步提供 ,如下所示,其中 控制输入是否来自前一个时间步骤 .
当 .
创建强化学习环境。
env=rlSi万博1manbetxmulinkEnv(mdl、agentblk、observationInfo、actionInfo);
若要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境复位函数。的localResetFcn
函数(在示例末尾定义)将初始横向偏差和相对偏航角设置为随机值。
env。ResetFcn = @(在)localResetFcn(的);
修复随机生成器种子以获得再现性。
rng(0)
DDPG代理使用临界值函数表示法近似给定观察和行动的长期回报。要创建临界值,首先创建一个包含两个输入、状态和行动以及一个输出的深度神经网络。有关创建深度神经网络值函数表示法的更多信息,请参阅创建策略和值函数表示.
评论家= createLaneKeepingCritic (observationInfo actionInfo);
DDPG代理使用参与者表示决定采取给定观察的动作。要创建参与者,首先创建一个具有一个输入(观察)和一个输出(动作)的深层神经网络。
[actor,actorOptions]=createLaneKeepingActor(观测信息,actionInfo);
这些初始参与者和评论家网络具有随机的初始参数值。
要创建DDPG代理,请首先指定DDPG代理选项。
agentOptions = rlDDPGAgentOptions (...“采样时间”Ts,...“TargetSmoothFactor”,1e-3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“MiniBatchSize”,64...);agentOptions.NoiseOptions.Variance = 0.3;agentOptions.NoiseOptions.VarianceDecayRate = 1 e-5;
使用指定的参与者表示、评论家表示和代理选项创建DDPG代理。有关详细信息,请参阅RLDDPG试剂
.
代理=rlDDPGAgent(演员、评论家、代理);
作为基线,用一个具有随机初始参数的参与者来训练agent。要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
跑步训练最多50000集,每集最多持续150个时间步。
在“事件管理器”对话框中显示培训进度。
当章节奖励达到-1时停止训练。
为累积奖励大于-的每一集保存代理的副本2.5
.
有关详细信息,请参阅rlTrainingOptions
.
最大事件数=50000;最大步骤数=T/Ts;训练点=RL训练选项(...“最大集”,每集,...“MaxStepsPerEpisode”maxsteps,...“冗长”假的,...“阴谋”,“培训进度”,...“StopTrainingCriteria”,“EpisodeReward”,...“StopTrainingValue”,-1,...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”, -2.5);
使用火车
作用培训是一个计算密集的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置doTraining
到假
.自己训练代理人,设置doTraining
到真正的
.
doTraining=false;如果doTraining%培训代理人。培训状态=培训(代理人、环境、培训点);其他的%为示例加载预训练代理。装载(“ddpgFromScratch.mat”);结束
您可以将代理的参与者网络设置为以前训练过的深度神经网络模拟MPC控制器的车道保持辅助这个网络被训练成使用监督学习来模拟模型预测控制器。
加载预训练的参与者网络。
装载(“仿制empcnetactorobj.mat”,“imitateMPCNetObj”);
使用预训练的参与者创建参与者表示。
supervisedActor = rlDeterministicActorRepresentation (imitateMPCNetObj observationInfo actionInfo,...“观察”, imitateMPCNetObj。InputNames,“行动”, {“Scale1”},动植物);
检查用户使用的网络监工
就是装了子弹的那个。为此,使用相同的随机输入观测值来评估网络和代理。
testData =兰德(6,1);
评价深层神经网络。
predictImNN=预测(模仿empcnetobj,testData');
评估的演员。
evaluateRLRep=getAction(supervisedActor,{testData});
比较结果。
错误=evaluateRLRep{:}-predictImNN
错误=仅有一个的0
使用预先训练的参与者创建DDPG代理。
代理人=rlDDPGAgent(监督代理人、评论家、代理人);
减少最大训练次数,并使用火车
作用要在运行此示例时节省时间,请通过设置doTraining
到假
.自己训练代理人,设置doTraining
到真正的
.
trainingOpts.maxsecutes=5000;doTraining=false;如果doTraining%培训代理人。培训状态=培训(代理人、环境、培训点);其他的%为示例加载预训练代理。装载(“ddpgFromPretrained.mat”);结束
利用预先训练好的行动者网络,可以提高DDPG agent的训练效率。总的训练时间和总的训练步数都提高了大约20%。同时,接近最佳结果的训练的集数从大约4500减少到大约3500。
要验证经过培训的代理的性能,请取消注释以下两行并在环境中对其进行模拟。有关代理模拟的更多信息,请参阅模拟选项
和sim卡
.
% simOptions = rlSimulationOptions('MaxSteps', MaxSteps);% experience = sim(env,agent,simOptions);
要检查Simulink模型中经过训练的代理的性能,请使用先前定义的初始条件模拟模型(万博1manbetxe1_初始值=0.2
和e2_initial = -0.1
).
sim卡(mdl)
如下图所示,横向误差(中间图)和相对偏航角(底部图)均被驱动至零。车辆从中心线的横向偏差(0.2 m)和非零偏航角误差(-0.1 rad)启动。车道保持控制器使ego车辆在大约两秒钟后沿中心线行驶。转向角(上图)显示控制器在大约两秒钟后达到稳定状态。
关闭Simulink万博1manbetx模型而不保存任何更改。
bdclose (mdl)
函数in=localResetFcn(in)%设置横向偏差的随机值。in=设置变量(in,“e1_initial”,0.5*(-1+2*兰德));%设置相对偏航角的随机值。in=设置变量(in,“e2_initial”, 0.1 *(1 + 2 *兰德));结束函数代理= loadPretrainedParams(代理,actorParams criticParams)%设置参与者参数。actor=getActor(agent);pretrainedActor=setLearnableParameters(actor,actorParams);%设置批评家参数。评论家= getCritic(代理);pretrainedCritic = setLearnableParameters(评论家,criticParams);在代理中设置演员和评论家表示。agent=setActor(agent,pretrainedActor);agent=setCritic(agent,pretrainedCritic);结束