此示例使用基于深度的确定性政策梯度(DDPG)的强化学习,为移动机器人制定一种策略,以避免障碍物。有关DDPG算法的简要摘要,请参阅深度确定性策略梯度代理(钢筋学习工具箱)。
这个示例场景训练一个移动机器人避开给定的距离传感器读数,该读数可以检测地图上的障碍物。强化学习算法的目标是学习机器人应该使用哪些控制(线速度和角速度)来避免撞到障碍物。这个例子使用一个已知环境的占用地图来生成距离传感器读数,探测障碍物,并检查机器人可能造成的碰撞。距离传感器读数是DDPG剂的观测值,线性和角速度控制是动作。
加载一个地图矩阵,simpleMap
,表示机器人的环境。
加载exampleMapssimpleMap加载examplehelperofficeareamap.Office_area_map.mapMatrix = simpleMap;mapScale = 1;
接下来,设置一个rangeSensor
对象,它模拟一个噪声距离传感器。距离传感器的读数被代理视为观测值。定义量程读数的角度位置、最大量程和噪声参数。
扫描角度= [-3*pi/8: pi/8:3*pi/8];maxRange = 12;lidarNoiseVariance = 0.1 ^ 2;lidarNoiseSeeds =兰迪(intmax、大小(scanAngles));
代理的动作是二维向量
在哪里
和
是我们机器人的线性和角速度。DDPG代理使用归一化输入来实现角度和线性速度,这意味着代理的动作是-1和1之间的标量,它们乘以maxLinSpeed
和maxangspeed
参数得到实际控制。指定最大线速度和角速度。
同时,指定机器人的初始位置为(x yθ)
。
%最大速度参数maxLinSpeed = 0.3;maxAngSpeed = 0.3;机器人的%初始姿势initX = 17;initY = 15;initTheta =π/ 2;
要想使机器人的动作形象化,创建一个图形。首先显示占用地图,并绘制机器人的初始位置。
图】图(“姓名”那“simplemap”);集(图,“可见”那“上”);ax =轴(图);表演(binaryOccupancyMap (mapMatrix),“父”、ax);持有在plottransforms([initx,fienty,0],eul2quat([inittheta,0,0]),“MeshFilePath”那“roundvehicle.stl”那“视图”那“2d”);淡定;持有离开
创建一个采用动作的环境模型,并给出观察和奖励信号。指定提供的示例模型名称,EXAmplehelperavoidobstaclesMobilerobot.
,模拟时间参数和代理块名称。
mdl =“examplehelperavoidobstaclesmobilerobot”;tfinal = 100;Sampletime = 0.1;AppletBlk = MDL +“/代理”;
打开模型。
open_system (mdl)
模型包含环境
和代理人
块。这代理人
块尚未定义。
在 - 的里面环境
子系统块,你应该看到一个模拟机器人和传感器数据的模型。子系统执行动作,根据距离传感器的读数生成观测信号,并根据距离障碍物的距离和动作命令的力度计算奖励。
open_system (mdl +“/环境”)
定义参数,观察obsinfo.
,使用rlnumericspec.
对象并为在范围传感器中的每个角度位置提供足够元素的范围读数的较低和上限。
obsInfo = rlNumericSpec([nummel (scanAngles) 1],...“LowerLimit”,零(numel(scanangles),1),...“上限”,那些(numel(scanangles),1)* maxrange);numobservations = Obsinfo.dimension(1);
定义动作参数,actInfo
。动作是控制命令向量,
,标准化为
。
numActions = 2;actInfo = rlNumericSpec([numActions 1],...“LowerLimit”, 1...“上限”1);
使用“构建环境界面对象”Rl金宝appsimulinkenv.
(钢筋学习工具箱)。指定模型、代理块名称、观测参数和动作参数。设置模拟使用的复位功能examplehelperrlavoidobstaclesresetfcn.
。该函数通过将机器人放置在一个新的随机位置开始躲避障碍物来重新启动模拟。
env = rl金宝appSimulinkEnv (mdl agentBlk、obsInfo actInfo);env。ResetFcn = @(在)exampleHelperRLAvoidObstaclesResetFcn (scanAngles, maxRange mapMatrix);env。UseFastRestart =“关闭”;
有关设置Simulink®环境进行培训的另一个示例,请参阅金宝app创建Simul金宝appink环境和培训代理(钢筋学习工具箱)。
DDPG代理使用批判价值函数表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个深度神经网络,它有两个输入,一个是观察和行动,一个是输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示(钢筋学习工具箱)。
statepath = [featureInputLayer(numobservations,“正常化”那“没有任何”那“姓名”那“状态”)全连接列(50,“姓名”那“批评福尔福尔”)剥离(“姓名”那“transrelu1”) fullyConnectedLayer (25,“姓名”那“批评福尔2”));ActionPath = [featuredupputlayer(nations,“正常化”那“没有任何”那“姓名”那“行动”) fullyConnectedLayer (25,“姓名”那“CriticActionFC1”));commonpath = [附加层(2,“姓名”那“添加”)剥离(“姓名”那“CriticCommonRelu”) fullyConnectedLayer (1,“姓名”那“CriticOutput”));批判性= layergraph();批评网络= addlayers(批判性,州路径);批评网络= addlayers(批判性,ActionPath);批评网络= addlayers(批判性,commonpath);批评网络= ConnectLayers(批评者,“批评福尔2”那“添加/ IN1”);批评网络= ConnectLayers(批评者,“CriticActionFC1”那“添加/ IN2”);
接下来,指定使用批评者表示的选项rlrepresentationOptions.
(钢筋学习工具箱)。
最后,使用指定的深度神经网络和选项创建评论表示。您还必须为评论家指定操作和观察规范,这是从环境接口获得的。有关更多信息,请参阅rlQValueRepresentation
(钢筋学习工具箱)。
批评= rlrepresentationOptions(“LearnRate”1 e - 3,“L2RegularizationFactor”1的军医,“毕业察勒德莱斯”1);评论家= rlQValueRepresentation (criticNetwork obsInfo actInfo,“观察”,{“状态”},“行动”,{“行动”},批评);
DDPG代理使用参与者表示来决定对给定的观察采取什么行动。要创建参与者,首先创建一个深度神经网络,有一个输入,一个观察,和一个输出,一个动作。
最后,以与评论家类似的方式构建演员。有关更多信息,请参阅rlDeterministicActorRepresentation
(钢筋学习工具箱)。
actorNetwork = [featureInputLayer(numobobservations,“正常化”那“没有任何”那“姓名”那“状态”)全连接列(50,“姓名”那“actorFC1”)剥离(“姓名”那“Actorrelu1”)全连接列(50,“姓名”那“actorFC2”)剥离(“姓名”那“Actorrelu2”) fullyConnectedLayer (2“姓名”那“actorFC3”) tanhLayer (“姓名”那“行动”));actorOptions = rlRepresentationOptions (“LearnRate”1的军医,“L2RegularizationFactor”1的军医,“毕业察勒德莱斯”1);演员= rlDeterministicActorRepresentation (actorNetwork obsInfo actInfo,“观察”,{“状态”},“行动”,{“行动”}, actorOptions);
指定代理选项。
agentOpts = rlDDPGAgentOptions (...“采样时间”,采样时间,...“TargetSmoothFactor”1 e - 3,...“DiscountFactor”, 0.995,...“迷你atchsize”,128,...“经验BufferLength”1 e6);agentOpts.NoiseOptions.Variance = 0.1;agentOpts.NoiseOptions.VarianceDecayRate = 1 e-5;
创建rlDDPGAgent
目的。这obstacleAvoidanceAgent
变量被用于模型中代理人
堵塞。
obstacleAvoidanceAgent = rlDDPGAgent(演员、评论家、agentOpts);open_system (mdl +“/代理”)
agent的报酬函数模型如下所示。
智能体被奖励避开最近的障碍,这使最坏的情况最小化。此外,代理在更高的线性速度时得到正奖励,在更高的角速度时得到负奖励。这种奖励策略阻止了代理的循环行为。调整奖励是正确培训代理的关键,因此奖励取决于应用程序。
要培训代理,首先指定培训选项。对于本例,使用以下选项:
最多为10000
每集最多持续一集maxSteps
时间步骤。
在“插曲管理器”对话框中显示培训进度(设置情节
选项),并启用命令行显示(设置verb
正确的选择)。
当经纪人在连续50次的训练中获得平均超过400的累计奖励时,停止训练。
有关更多信息,请参阅rltringOptions.
(钢筋学习工具箱)。
maxEpisodes = 10000;maxSteps =装天花板(Tfinal / sampleTime);trainOpts = rlTrainingOptions (...“maxepisodes”maxEpisodes,...“MaxStepsPerEpisode”maxSteps,...“scoreaveragingwindowlength”,50,...“stoptrinationcriteria”那“平均”那...“StopTrainingValue”,400,...“verbose”,真的,...“情节”那“训练进步”);
训练代理人使用火车
(钢筋学习工具箱)功能。培训是一种计算密集型进程,需要几分钟才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理用圆形
来错误的
。训练代理人,套装用圆形
来真的
。
doTraining = false;%切换此为真训练。如果用圆形培训代理商。Trainstats =火车(Optacleavoidancegent,Env,Trainpts);别的%为示例加载预训练的代理。加载exampleHelperAvoidObstaclesAgentobstacleAvoidanceAgent结尾
这加固学习集团经理可以用来跟踪按章节划分的训练进度。随着章节数量的增加,你希望看到奖励价值的增加。
使用培训的代理模拟在地图中驾驶的机器人,避免障碍物。
= sim卡(“exampleHelperAvoidObstaclesMobileRobot.slx”);
要可视化模拟机器人在周围环境中驾驶的距离传感器读数,使用助手,examplehelpoidobstaclesplot.
。
为了i = 1:5:尺寸(out.range,3)u = out.pose(i,:);r = out.range(:,:,i);examplehelperavoidobstaclesplot(u,mapmatrix,mapscale,r,扫描,斧头);结尾
现在可以使用这个代理来模拟在不同地图上的驾驶。另一幅由办公环境的激光雷达扫描生成的地图使用相同的训练模型。这个映射代表了在训练后应用训练模型的更现实的场景。
mapmatrix = Office_area_map.occupancymatrix> 0.5;MapScale = 10;initx = 20;病= 30;初始= 0;图】图(“姓名”那“Office_area_map”);集(图,“可见”那“上”);ax =轴(图);显示(binaryOccupancyMap (mapMatrix mapScale),“父”、ax);持有在plottransforms([initx,fienty,0],eul2quat([inittheta,0,0]),“MeshFilePath”那“roundvehicle.stl”那“视图”那“2d”);淡定;持有离开
= sim卡(“exampleHelperAvoidObstaclesMobileRobot.slx”);
为了i = 1:5:尺寸(out.range,3)u = out.pose(i,:);r = out.range(:,:,i);examplehelperavoidobstaclesplot(u,mapmatrix,mapscale,r,扫描,斧头);结尾