移动机器人使用强化学习避免障碍
本示例使用基于深度确定性策略梯度(DDPG)的强化学习来为移动机器人制定避障策略。有关DDPG算法的简要摘要,请参见深度确定性策略梯度(DDPG)代理(强化学习工具箱).
这个示例场景训练一个移动机器人避开障碍物,给定的距离传感器读数可以检测地图上的障碍物。强化学习算法的目标是学习机器人应该使用哪些控制(线速度和角速度)来避免碰撞到障碍物。这个例子使用一个已知环境的占用地图来生成距离传感器读数,检测障碍物,并检查机器人可能发生的碰撞。距离传感器读数是DDPG剂的观测值,线性和角速度控制是动作。
加载地图
加载一个映射矩阵,simpleMap
,表示机器人的环境。
负载exampleMapssimpleMap负载exampleHelperOfficeAreaMapoffice_area_mapmapMatrix = simpleMap;mapScale = 1;
距离传感器参数
接下来,设置一个rangeSensor
对象,它模拟一个有噪声的距离传感器。距离传感器读数被代理视为观测值。定义范围读数、最大范围和噪声参数的角度位置。
scanAngles = [-3*pi/8:pi/8:3*pi/8];maxRange = 12;lidarNoiseVariance = 0.1^2;lidarnoisesseeds = randi(intmax,size(scanAngles));
机器人参数
代理的作用是一个二维矢量
在哪里
而且
是机器人的线速度和角速度。DDPG代理对角速度和线速度都使用标准化输入,这意味着代理的动作是-1到1之间的标量,该标量乘以maxLinSpeed
而且maxAngSpeed
参数来获得实际控制。指定最大线速度和角速度。
另外,指定机器人的初始位置为[x y theta]
.
最大速度参数maxLinSpeed = 0.3;maxAngSpeed = 0.3;%机器人初始姿态initX = 17;度= 15;initTheta = pi/2;
显示地图和机器人位置
为了可视化机器人的动作,创建一个图形。首先显示占用地图,并绘制机器人的初始位置。
图=图(“名称”,“simpleMap”);集(图,“可见”,“上”);Ax =轴(fig);表演(binaryOccupancyMap (mapMatrix),“父”、ax);持有在plotTransforms ([initX initY 0], eul2quat ((initTheta, 0, 0)),“MeshFilePath”,“groundvehicle.stl”,“视图”,“二维”);淡定;持有从
环境界面
创建一个采取行动的环境模型,并给出观察和奖励信号。指定提供的示例模型名称,例如ampleHelperAvoidObstaclesMobileRobot
、仿真时间参数和代理块名称。
mdl =“exampleHelperAvoidObstaclesMobileRobot”;Tfinal = 100;sampleTime = 0.1;agentBlk = mdl +“/代理”;
打开模型。
open_system (mdl)
该模型包含环境
而且代理
块。的代理
Block还没有定义。
在环境
子系统块中,您应该看到用于模拟机器人的模型和传感器数据。子系统接收动作,根据距离传感器读数生成观察信号,并根据与障碍物的距离和动作命令的努力计算奖励。
open_system (mdl +“/环境”)
定义观测参数,obsInfo
,使用rlNumericSpec
对象,并给出距离读数的下限和上限,为距离传感器中的每个角度位置提供足够的元素。
obsInfo = rlNumericSpec([数字(scanAngles) 1],...“LowerLimit”0(元素个数(scanAngles), 1),...“UpperLimit”的(元素个数(scanAngles), 1) * maxRange);numObservations = obsInfo.Dimension(1);
定义动作参数,actInfo
.动作是控制命令向量,
,归一化为
.
numActions = 2;actInfo = rlNumericSpec([numActions 1],...“LowerLimit”, 1...“UpperLimit”1);
使用构建环境接口对象rl万博1manbetxSimulinkEnv
(强化学习工具箱).指定模型、代理块名称、观察参数和操作参数。设置模拟使用的复位功能exampleHelperRLAvoidObstaclesResetFcn
.这个函数通过将机器人放置在一个新的随机位置开始避开障碍物来重新启动模拟。
env = rl万博1manbetxSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);env。ResetFcn = @(in)exampleHelperRLAvoidObstaclesResetFcn(in,scanAngles,maxRange,mapMatrix);env。UseFastRestart =“关闭”;
有关设置用于训练的Simulink®环境的另一个示例,请参见万博1manbetx创建Simul万博1manbetxink环境和训练代理(强化学习工具箱).
DDPG代理
DDPG代理使用临界值函数表示来近似给定观察和操作的长期奖励。为了创建评论家,首先创建一个具有两个输入的深度神经网络,即观察和行动,以及一个输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数(强化学习工具箱).
statePath = [featureInputLayer(numObservations,“归一化”,“没有”,“名称”,“状态”) fullyConnectedLayer (50,“名称”,“CriticStateFC1”) reluLayer (“名称”,“CriticRelu1”) fullyConnectedLayer (25,“名称”,“CriticStateFC2”));actionPath = [featureInputLayer(numActions,“归一化”,“没有”,“名称”,“行动”) fullyConnectedLayer (25,“名称”,“CriticActionFC1”));commonPath = [addtionlayer (2,“名称”,“添加”) reluLayer (“名称”,“CriticCommonRelu”) fullyConnectedLayer (1,“名称”,“CriticOutput”));criticNetwork = layerGraph();criticNetwork = addLayers(criticNetwork,statePath);criticNetwork = addLayers(criticNetwork,actionPath);criticNetwork = addLayers(criticNetwork,commonPath);临界网络= connectLayers(临界网络,“CriticStateFC2”,“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActionFC1”,“添加/ in2”);临界网络= dlnetwork(临界网络);
接下来,指定评论家优化器使用的选项rlOptimizerOptions
.
最后,使用指定的深度神经网络和选项创建评论家表示。您还必须为评论家指定操作和观察规范,这些都是从环境接口获得的。有关更多信息,请参见rlQValueFunction
(强化学习工具箱).
criticOptions = rlOptimizerOptions(“LearnRate”1 e - 3,“L2RegularizationFactor”1的军医,“GradientThreshold”1);rlQValueFunction(criticNetwork,obsInfo,actInfo,“ObservationInputNames”,“状态”,“ActionInputNames”,“行动”);
DDPG代理使用参与者表示来决定采取何种操作。要创建行动者,首先要创建一个深度神经网络,它有一个输入(观察)和一个输出(动作)。
最后,以类似于批评家的方式来构建行动者。有关更多信息,请参见rlContinuousDeterministicActor
(强化学习工具箱).
actorNetwork = [featureInputLayer(numObservations,“归一化”,“没有”,“名称”,“状态”) fullyConnectedLayer (50,“名称”,“actorFC1”) reluLayer (“名称”,“actorReLU1”) fullyConnectedLayer (50,“名称”,“actorFC2”) reluLayer (“名称”,“actorReLU2”) fullyConnectedLayer (2“名称”,“actorFC3”) tanhLayer (“名称”,“行动”));actorNetwork = dlnetwork(actorNetwork);actorOptions = rlOptimizerOptions(“LearnRate”1的军医,“L2RegularizationFactor”1的军医,“GradientThreshold”1);actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);
创建DDPG代理对象
指定代理选项。
agentOpts = rlDDPGAgentOptions(...“SampleTime”sampleTime,...“ActorOptimizerOptions”actorOptions,...“CriticOptimizerOptions”criticOptions,...“DiscountFactor”, 0.995,...“MiniBatchSize”, 128,...“ExperienceBufferLength”1 e6);agentoptions . noiseoptions . variance = 0.1;agentoptions . noiseoptions . variancedecayrate = 1e-5;
创建rlDDPGAgent
对象。的obstacleAvoidanceAgent
变量在模型中用于代理
块。
obstacleAvoidanceAgent = rlDDPGAgent(actor,critic,agentOpts);open_system (mdl +“/代理”)
奖励
对代理的奖励函数建模如下所示。
代理会因为避开最近的障碍物而得到奖励,这将最坏的情况最小化。此外,对于较高的线性速度,代理将获得正奖励,而对于较高的角速度,代理将获得负奖励。这种奖励策略抑制了智能体的循环行为。调整奖励是正确训练代理的关键,因此奖励会根据应用程序的不同而有所不同。
火车代理
要培训代理,首先指定培训选项。对于本例,使用以下选项:
最多训练一次
10000
集,每集最多maxSteps
时间的步骤。在“事件管理器”对话框中显示培训进度
情节
选项)并启用命令行显示(设置详细的
选项为true)。当代理在连续50集中获得的平均累积奖励大于400时停止训练。
有关更多信息,请参见rlTrainingOptions
(强化学习工具箱).
maxEpisodes = 10000;maxSteps = ceil(Tfinal/sampleTime);trainOpts = rlTrainingOptions(...“MaxEpisodes”maxEpisodes,...“MaxStepsPerEpisode”maxSteps,...“ScoreAveragingWindowLength”, 50岁,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 400,...“详细”,真的,...“阴谋”,“训练进步”);
培训代理使用火车
(强化学习工具箱)函数。训练是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;将此选项切换为true进行培训。如果doTraining培训代理。trainingStats = train(obstacleAvoidanceAgent,env,trainOpts);其他的为示例加载预训练的代理。负载exampleHelperAvoidObstaclesAgentobstacleAvoidanceAgent结束
的强化学习事件管理器可以用来跟踪每期的训练进度。随着章节数量的增加,你希望看到奖励值的增加。
模拟
使用经过训练的agent模拟机器人在地图中驾驶和避障。
Out = sim(“exampleHelperAvoidObstaclesMobileRobot.slx”);
可视化
为了可视化模拟机器人在距离传感器读数的环境中驾驶,使用助手,exampleHelperAvoidObstaclesPosePlot
.
为I = 1:5:size(out.range,3) u = out.pose(I,:);R = out.range(:,:,i);exampleHelperAvoidObstaclesPosePlot (u, mapMatrix mapScale, r, scanAngles, ax);结束
可扩展性
现在可以使用此代理在不同的地图中模拟驾驶。由激光雷达扫描办公环境生成的另一张地图与相同的训练模型一起使用。这张图代表了在训练后应用训练模型的更现实的场景。
改变地图
mapMatrix = office_area_map。占用矩阵> 0.5;mapScale = 10;initX = 20;度= 30;initTheta = 0;图=图(“名称”,“office_area_map”);集(图,“可见”,“上”);Ax =轴(fig);显示(binaryOccupancyMap (mapMatrix mapScale),“父”、ax);持有在plotTransforms([initX,initY,0],eul2quat([initX, 0,0]),“MeshFilePath”,“groundvehicle.stl”,“视图”,“二维”);淡定;持有从
模拟
Out = sim(“exampleHelperAvoidObstaclesMobileRobot.slx”);
可视化
为I = 1:5:size(out.range,3) u = out.pose(I,:);R = out.range(:,:,i);exampleHelperAvoidObstaclesPosePlot (u, mapMatrix mapScale, r, scanAngles, ax);结束