主要内容

移动机器人使用强化学习避开障碍

本例使用基于深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)的强化学习为移动机器人开发避障策略。有关DDPG算法的简要概述,请参见深度确定性策略梯度代理(强化学习工具箱)

这个示例场景训练一个移动机器人避开给定的距离传感器读数,该读数可以检测地图上的障碍物。强化学习算法的目标是学习机器人应该使用哪些控制(线速度和角速度)来避免撞到障碍物。这个例子使用一个已知环境的占用地图来生成距离传感器读数,探测障碍物,并检查机器人可能造成的碰撞。距离传感器读数是DDPG剂的观测值,线性和角速度控制是动作。

加载地图

加载一个地图矩阵,simpleMap,表示机器人的环境。

负载exampleMapssimpleMap负载exampleHelperOfficeAreaMapoffice_area_mapmapMatrix = simpleMap;mapScale = 1;

传感器参数范围

接下来,设置一个rangeSensor对象,它模拟一个噪声距离传感器。距离传感器的读数被代理视为观测值。定义量程读数的角度位置、最大量程和噪声参数。

扫描角度= [-3*pi/8: pi/8:3*pi/8];maxRange = 12;lidarNoiseVariance = 0.1 ^ 2;lidarNoiseSeeds =兰迪(intmax、大小(scanAngles));

机器人参数

代理的作用是一个二维矢量 一个 v ω 在哪里 v ω 是机器人的线速度和角速度。DDPG代理使用角速度和线速度的标准化输入,这意味着代理的动作是-1到1之间的标量,该标量乘以maxLinSpeedmaxAngSpeed参数得到实际控制。指定最大线速度和角速度。

同时,指定机器人的初始位置为(x yθ)

%最大转速参数maxLinSpeed = 0.3;maxAngSpeed = 0.3;%机器人的初始姿态initX = 17;initY = 15;initTheta =π/ 2;

显示地图和机器人位置

要想使机器人的动作形象化,创建一个图形。首先显示占用地图,并绘制机器人的初始位置。

无花果=图(“名称”“simpleMap”);集(图,“可见”“上”);ax =轴(图);表演(binaryOccupancyMap (mapMatrix),“父”、ax);持有plotTransforms([initX, initY, 0], eul2quat([initTheta, 0,0]),“MeshFilePath”“groundvehicle.stl”“视图”“二维”);淡定;持有

Figure simpleMap包含一个坐标轴。以二进制占用网格为标题的坐标轴包含5个类型为patch、line、image的对象。

环境界面

创建一个采取行动的环境模型,并给予观察和奖励信号。指定提供的示例模型名称,例如ampleHelperAvoidObstaclesMobileRobot、模拟时间参数和代理块名称。

mdl =“exampleHelperAvoidObstaclesMobileRobot”;Tfinal = 100;sampleTime = 0.1;agentBlk = mdl +“/代理”

打开模型。

open_system (mdl)

模型包含环境代理块。的代理块尚未定义。

环境子系统块,你应该看到一个模拟机器人和传感器数据的模型。子系统执行动作,根据距离传感器的读数生成观测信号,并根据距离障碍物的距离和动作命令的力度计算奖励。

open_system (mdl +“/环境”

定义参数,观察obsInfo,使用rlNumericSpec对象,并给出距离传感器中每个角度位置的足够元素的距离读数的下限和上限。

obsInfo = rlNumericSpec([nummel (scanAngles) 1],...“LowerLimit”0(元素个数(scanAngles), 1),...“UpperLimit”的(元素个数(scanAngles), 1) * maxRange);numObservations = obsInfo.Dimension (1);

定义操作参数,actInfo.动作是控制命令向量, 一个 v ω 归一化, - 1 1

numActions = 2;actInfo = rlNumericSpec([numActions 1],...“LowerLimit”, 1...“UpperLimit”1);

使用rl金宝appSimulinkEnv(强化学习工具箱).指定模型、代理块名称、观测参数和动作参数。设置模拟使用的复位功能exampleHelperRLAvoidObstaclesResetFcn.该函数通过将机器人放置在一个新的随机位置开始躲避障碍物来重新启动模拟。

env = rl金宝appSimulinkEnv (mdl agentBlk、obsInfo actInfo);env。ResetFcn = @(在)exampleHelperRLAvoidObstaclesResetFcn (scanAngles, maxRange mapMatrix);env。UseFastRestart =“关闭”

有关设置Simulink®环境进行培训的另一个示例,请参见金宝app创建Simul金宝appink环境和培训代理(强化学习工具箱)

DDPG代理

DDPG代理使用批判价值函数表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个深度神经网络,它有两个输入,一个是观察和行动,一个是输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示(强化学习工具箱)

statePath = [featureInputLayer(numObservations,“归一化”“没有”“名称”“状态”) fullyConnectedLayer (50,“名称”“CriticStateFC1”) reluLayer (“名称”“CriticRelu1”) fullyConnectedLayer (25,“名称”“CriticStateFC2”));actionPath = [featureInputLayer(numActions,“归一化”“没有”“名称”“行动”) fullyConnectedLayer (25,“名称”“CriticActionFC1”));commonPath =[附加路径]“名称”“添加”) reluLayer (“名称”“CriticCommonRelu”) fullyConnectedLayer (1,“名称”“CriticOutput”));criticNetwork = layerGraph ();criticNetwork = addLayers (criticNetwork statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,“CriticStateFC2”“添加/三机一体”);criticNetwork = connectLayers (criticNetwork,“CriticActionFC1”“添加/ in2”);

接下来,为使用的批评家表示指定选项rlRepresentationOptions(强化学习工具箱)

最后,使用指定的深度神经网络和选项创建评论表示。您还必须为评论家指定操作和观察规范,这是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation(强化学习工具箱)

criticOpts = rlRepresentationOptions (“LearnRate”1 e - 3,“L2RegularizationFactor”1的军医,“GradientThreshold”1);评论家= rlQValueRepresentation (criticNetwork obsInfo actInfo,“观察”, {“状态”},“行动”, {“行动”}, criticOpts);

DDPG代理使用参与者表示来决定对给定的观察采取什么行动。要创建参与者,首先创建一个深度神经网络,有一个输入,一个观察,和一个输出,一个动作。

最后,以与评论家相似的方式构建行动者。有关更多信息,请参见rlDeterministicActorRepresentation(强化学习工具箱)

actorNetwork = [featureInputLayer(numobobservations,“归一化”“没有”“名称”“状态”) fullyConnectedLayer (50,“名称”“actorFC1”) reluLayer (“名称”“actorReLU1”) fullyConnectedLayer (50,“名称”“actorFC2”) reluLayer (“名称”“actorReLU2”) fullyConnectedLayer (2“名称”“actorFC3”) tanhLayer (“名称”“行动”));actorOptions = rlRepresentationOptions (“LearnRate”1的军医,“L2RegularizationFactor”1的军医,“GradientThreshold”1);演员= rlDeterministicActorRepresentation (actorNetwork obsInfo actInfo,“观察”, {“状态”},“行动”, {“行动”}, actorOptions);

创建DDPG代理对象

指定代理选项。

agentOpts = rlDDPGAgentOptions (...“SampleTime”sampleTime,...“TargetSmoothFactor”1 e - 3,...“DiscountFactor”, 0.995,...“MiniBatchSize”, 128,...“ExperienceBufferLength”1 e6);agentOpts.NoiseOptions.Variance = 0.1;agentOpts.NoiseOptions.VarianceDecayRate = 1 e-5;

创建rlDDPGAgent对象。的obstacleAvoidanceAgent变量被用于模型中代理块。

obstacleAvoidanceAgent = rlDDPGAgent(演员、评论家、agentOpts);open_system (mdl +“/代理”

奖励

agent的报酬函数模型如下所示。

智能体被奖励避开最近的障碍,这使最坏的情况最小化。此外,代理在更高的线性速度时得到正奖励,在更高的角速度时得到负奖励。这种奖励策略阻止了代理的循环行为。调整奖励是正确培训代理的关键,因此奖励取决于应用程序。

火车代理

要培训代理,首先指定培训选项。对于本例,使用以下选项:

  • 最多为10000每集最多持续一集maxSteps时间的步骤。

  • 在“插曲管理器”对话框中显示培训进度(设置情节选项),并启用命令行显示(设置详细的选项为true)。

  • 当经纪人在连续50次的训练中获得平均超过400的累计奖励时,停止训练。

有关更多信息,请参见rlTrainingOptions(强化学习工具箱)

maxEpisodes = 10000;maxSteps =装天花板(Tfinal / sampleTime);trainOpts = rlTrainingOptions (...“MaxEpisodes”maxEpisodes,...“MaxStepsPerEpisode”maxSteps,...“ScoreAveragingWindowLength”, 50岁,...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, 400,...“详细”,真的,...“阴谋”“训练进步”);

训练代理人使用火车(强化学习工具箱)函数。培训是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining.自己训练代理人,设置doTraining真正的

doTraining = false;%切换此为真训练。如果doTraining培训代理商。env, trainingStats =火车(obstacleAvoidanceAgent trainOpts);其他的%为示例加载预训练的代理。负载exampleHelperAvoidObstaclesAgentobstacleAvoidanceAgent结束

强化学习情景管理器可以用来跟踪按章节划分的训练进度。随着章节数量的增加,你希望看到奖励价值的增加。

模拟

使用训练过的agent模拟机器人在地图中行驶和躲避障碍物。

= sim卡(“exampleHelperAvoidObstaclesMobileRobot.slx”);

可视化

要可视化模拟机器人在周围环境中驾驶的距离传感器读数,使用助手,exampleHelperAvoidObstaclesPosePlot

我= 1:5:大小(。范围,3)u = out。构成(我:);r =。范围(:,:我);exampleHelperAvoidObstaclesPosePlot(u, mapMatrix, mapScale, r, scanAngles, ax);结束

Figure simpleMap包含一个坐标轴。以“二元占据网格”为标题的坐标轴包含patch、line、image等6个对象。

可扩展性

现在可以使用这个代理来模拟在不同地图上的驾驶。另一幅由办公环境的激光雷达扫描生成的地图使用相同的训练模型。这个映射代表了在训练后应用训练模型的更现实的场景。

改变地图

mapMatrix = office_area_map。occupancyMatrix > 0.5;mapScale = 10;initX = 20;initY = 30;initTheta = 0;无花果=图(“名称”“office_area_map”);集(图,“可见”“上”);ax =轴(图);显示(binaryOccupancyMap (mapMatrix mapScale),“父”、ax);持有plotTransforms([initX, initY, 0], eul2quat([initTheta, 0,0]),“MeshFilePath”“groundvehicle.stl”“视图”“二维”);淡定;持有

图office_area_map包含坐标轴。以二进制占用网格为标题的坐标轴包含5个类型为patch、line、image的对象。

模拟

= sim卡(“exampleHelperAvoidObstaclesMobileRobot.slx”);

可视化

我= 1:5:大小(。范围,3)u = out。构成(我:);r =。范围(:,:我);exampleHelperAvoidObstaclesPosePlot(u, mapMatrix, mapScale, r, scanAngles, ax);结束

图office_area_map包含坐标轴。以“二元占据网格”为标题的坐标轴包含patch、line、image等6个对象。