培训PPO代理自动代泊车员gydF4y2Ba
本例演示了一种用于自动搜索和停车任务的混合控制器的设计。该混合控制器使用模型预测控制(MPC)来跟踪停车场中的参考路径,并使用训练有素的强化学习(RL)代理来执行停车机动。gydF4y2Ba
本例中的自动泊车算法执行一系列机动,同时感知和避开狭窄空间中的障碍物。它在自适应MPC控制器和RL代理之间切换来完成停车机动。MPC控制器沿参考路径以恒定速度移动车辆,同时算法搜索空停车位。当找到停车位时,RL代理接管并执行预先训练的停车机动。对环境(停车场)的先验知识,包括空点和停放车辆的位置,控制器是可用的。gydF4y2Ba
停车场gydF4y2Ba
停车场由gydF4y2Ba停车场gydF4y2Ba
类,它存储关于自我车辆、空停车位和静态障碍物(停放的汽车)的信息。每个停车位都有一个唯一的索引号和一个指示灯,绿色(空闲)或红色(有人)。停放的车辆用黑色表示。gydF4y2Ba
创建一个gydF4y2Ba停车场gydF4y2Ba
对象在位置7处有一个空闲点。gydF4y2Ba
freeSpotIdx = 7;map = ParkingLot(freeSpotIdx);gydF4y2Ba
指定初始姿态gydF4y2Ba 为了自我的载体。当车辆在停车场行驶时,目标姿态是根据第一个可用的空闲位置确定的。gydF4y2Ba
egoInitialPose = [20, 15, 0];gydF4y2Ba
计算车辆的目标姿态gydF4y2BacreateTargetPosegydF4y2Ba
函数。目标姿态对应的位置gydF4y2BafreeSpotIdxgydF4y2Ba
.gydF4y2Ba
egoTargetPose = createTargetPose(map,freeSpotIdx)gydF4y2Ba
egoTargetPose =gydF4y2Ba1×3gydF4y2Ba47.7500 4.9000 -1.5708gydF4y2Ba
传感器模块gydF4y2Ba
停车算法使用摄像头和激光雷达传感器从环境中收集信息。gydF4y2Ba
相机gydF4y2Ba
安装在自我车辆上的摄像头的视野由下图中绿色阴影区域表示。照相机有视场gydF4y2Ba 有界的gydF4y2Ba 并有最大测量深度gydF4y2Ba 10米。gydF4y2Ba
当自动驾驶汽车向前移动时,摄像头模块会感知视野范围内的停车位,并确定该停车位是空的还是被占用的。为了简单起见,这个动作是使用点位置和当前车辆姿态之间的几何关系来实现的。停车场在摄像头范围内,如果gydF4y2Ba 而且gydF4y2Ba ,在那里gydF4y2Ba 到停车场的距离是多少gydF4y2Ba 是与停车位的角度。gydF4y2Ba
激光雷达gydF4y2Ba
该强化学习代理使用激光雷达传感器读数来确定自我车辆与环境中其他车辆的接近程度。本例中的激光雷达传感器也是使用几何关系建模的。激光雷达的距离是沿着12条线段测量的,这些线段从自我车辆的中心放射出来。当激光雷达线与障碍物相交时,它会返回障碍物与车辆的距离。激光雷达沿任何线段的最大可测量距离为6米。gydF4y2Ba
汽车泊车代客模型gydF4y2Ba
停车代客模型是在Simulink中实现的,包括控制器、小车、传感器和停车场。gydF4y2Ba
加载自动泊车代客参数。gydF4y2Ba
autoParkingValetParamsgydF4y2Ba
打开Simulink模型。gydF4y2Ba
mdl =gydF4y2Ba“rlAutoParkingValet”gydF4y2Ba;open_system (mdl)gydF4y2Ba
在该模型中,自我车辆动力学由一个单轨自行车模型来表示,该模型有两个输入:车速gydF4y2Ba (m/s)和转向角gydF4y2Ba (弧度)。MPC和RL控制器被放置在“启用子系统”模块中,这些模块由表示车辆是否必须搜索空位置或执行停车机动的信号激活。使能信号由车辆模式子系统中的摄像头算法确定。最初,飞行器在里面gydF4y2Ba搜索gydF4y2Ba模式,MPC控制器跟踪参考路径。一旦找到空位,gydF4y2Ba公园gydF4y2Ba模式被激活,RL代理执行停车机动。gydF4y2Ba
自适应模型预测控制器gydF4y2Ba
创建自适应MPC控制器对象,用于参考轨迹跟踪gydF4y2BacreateMPCForParkinggydF4y2Ba
脚本。有关自适应MPC的更多信息,请参见gydF4y2Ba自适应政策委员会gydF4y2Ba(模型预测控制工具箱)gydF4y2Ba.gydF4y2Ba
createMPCForParkinggydF4y2Ba
强化学习环境gydF4y2Ba
训练RL代理的环境为下图中红色阴影区域。由于停车场的对称性,在该区域内的训练足以使策略在对观测值进行适当的坐标变换后调整到其他区域。与整个停车场的训练相比,使用这个较小的训练区域可以显著减少训练时间。gydF4y2Ba
对于这种环境:gydF4y2Ba
训练区域是一个22.5米x 20米的空间,目标点在其水平中心。gydF4y2Ba
观测值是位置误差gydF4y2Ba 而且gydF4y2Ba 自我飞行器相对于目标姿态的正弦和余弦值gydF4y2Ba ,以及激光雷达传感器读数。gydF4y2Ba
停车时车速为恒定的2m /s。gydF4y2Ba
动作信号是离散的转向角度,范围在+/- 45度之间的步骤15度。gydF4y2Ba
如果与目标位姿相关的误差在+/- 0.75米(位置)和+/-10度(方向)的指定公差范围内,则认为车辆已停放。gydF4y2Ba
如果自我车辆走出训练区域的边界,与障碍物碰撞,或成功停车,则插曲结束。gydF4y2Ba
奖励gydF4y2Ba 提供时间gydF4y2BatgydF4y2Ba是:gydF4y2Ba
在这里,gydF4y2Ba ,gydF4y2Ba ,gydF4y2Ba 自我飞行器的位置和航向角度与目标姿态的误差,和gydF4y2Ba 是转向角。gydF4y2Ba (0或1)表示车辆是否已停车gydF4y2Ba (0或1)表示车辆当时是否与障碍物发生碰撞gydF4y2Ba .gydF4y2Ba
飞行器姿态的坐标变换gydF4y2Ba 不同泊车位的观察结果如下:gydF4y2Ba
1-14:无变换gydF4y2Ba
第15 - 22:gydF4y2Ba
23-36:gydF4y2Ba
37-40:gydF4y2Ba
41-52:gydF4y2Ba
53 - 64:gydF4y2Ba
为环境创建观察和行动规范。gydF4y2Ba
numObservations = 16;observationInfo = rlNumericSpec([numObservations 1]);observationInfo。Name =gydF4y2Ba“观察”gydF4y2Ba;steerMax = pi/4;离散steerangles = -steerMax: deg2rad(15): steerMax;actionInfo = rlFiniteSetSpec(num2cell(discreteSteerAngles));actionInfo。Name =gydF4y2Ba“行动”gydF4y2Ba;numActions = numel(actionInfo.Elements);gydF4y2Ba
创建Simulink环境接口,指定RL代理块的路径。gydF4y2Ba
BLK = [mdl .gydF4y2Ba'/RL控制器/RL代理'gydF4y2Ba];env = rlSimulinkEnv(mdl,blk,observationInfo,actionInfo);gydF4y2Ba
为训练指定复位功能。的gydF4y2BaautoParkingValetResetFcngydF4y2Ba
函数将自我载具的初始姿态重置为每集开始时的随机值。gydF4y2Ba
env。ResetFcn = @autoParkingValetResetFcn;gydF4y2Ba
有关创建Simulink环境的更多信息,请参见gydF4y2BarlSimulinkEnvgydF4y2Ba
.gydF4y2Ba
创建代理gydF4y2Ba
本例中的RL代理是具有离散动作空间的近端策略优化(PPO)代理。PPO代理依赖于参与者和评论家表征来学习最优策略。agent为演员和评论家维护基于深度神经网络的函数逼近器。要了解更多关于PPO代理的信息,请参见gydF4y2Ba近端策略优化代理gydF4y2Ba.gydF4y2Ba
设置随机种子发生器的再现性。gydF4y2Ba
rng (0)gydF4y2Ba
为了创建评论家表示,首先创建一个具有16个输入和一个输出的深度神经网络。评论家网络的输出是特定观察的状态值函数。gydF4y2Ba
criticNetwork = [featureInputLayer(numObservations,gydF4y2Ba...gydF4y2Ba归一化=gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba...gydF4y2BaName =gydF4y2Ba“观察”gydF4y2Ba) fullyConnectedLayer(128年,Name =gydF4y2Ba“fc1”gydF4y2Ba) reluLayer (Name =gydF4y2Ba“relu1”gydF4y2Ba) fullyConnectedLayer(128年,Name =gydF4y2Ba“取得”gydF4y2Ba) reluLayer (Name =gydF4y2Ba“relu2”gydF4y2Ba) fullyConnectedLayer(128年,Name =gydF4y2Ba“一个fc3”文件gydF4y2Ba) reluLayer (Name =gydF4y2Ba“relu3”gydF4y2Ba) fullyConnectedLayer (Name =gydF4y2Ba“fc4”gydF4y2Ba));临界网络= dlnetwork(临界网络);gydF4y2Ba
为PPO代理创建评论家。有关更多信息,请参见gydF4y2BarlValueFunctiongydF4y2Ba
而且gydF4y2BarlOptimizerOptionsgydF4y2Ba
.gydF4y2Ba
criticOptions = rlOptimizerOptions(gydF4y2Ba...gydF4y2BaLearnRate = 1 e - 3,gydF4y2Ba...gydF4y2BaGradientThreshold = 1);rlValueFunction(criticNetwork,observationInfo);gydF4y2Ba
行为者网络的输出是车辆处于特定状态时采取每种可能转向动作的概率。创建行动者深度神经网络。gydF4y2Ba
actorNetwork = [featureInputLayer(numObservations,gydF4y2Ba...gydF4y2Ba归一化=gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba...gydF4y2BaName =gydF4y2Ba“观察”gydF4y2Ba) fullyConnectedLayer(128年,Name =gydF4y2Ba“fc1”gydF4y2Ba) reluLayer (Name =gydF4y2Ba“relu1”gydF4y2Ba) fullyConnectedLayer(128年,Name =gydF4y2Ba“取得”gydF4y2Ba) reluLayer (Name =gydF4y2Ba“relu2”gydF4y2Ba) fullyConnectedLayer (numActionsgydF4y2Ba“名称”gydF4y2Ba,gydF4y2Ba“出去”gydF4y2Ba) softmaxLayer (Name =gydF4y2Ba“actionProb”gydF4y2Ba));actorNetwork = dlnetwork(actorNetwork);gydF4y2Ba
为PPO代理创建一个离散的分类参与者。有关更多信息,请参见gydF4y2BarlDiscreteCategoricalActorgydF4y2Ba
.gydF4y2Ba
actorOptions = rlOptimizerOptions(gydF4y2Ba...gydF4y2BaLearnRate = 2的军医,gydF4y2Ba...gydF4y2BaGradientThreshold = 1);actor = rlDiscreteCategoricalActor(actorNetwork,observationInfo,actionInfo);gydF4y2Ba
指定代理选项并创建PPO代理。有关PPO代理选项的更多信息,请参见gydF4y2BarlPPOAgentOptionsgydF4y2Ba
.gydF4y2Ba
agentOpts = rlPPOAgentOptions(gydF4y2Ba...gydF4y2BaSampleTime = Ts,gydF4y2Ba...gydF4y2BaActorOptimizerOptions = actorOptions,gydF4y2Ba...gydF4y2BaCriticOptimizerOptions = criticOptions,gydF4y2Ba...gydF4y2BaExperienceHorizon = 200,gydF4y2Ba...gydF4y2BaClipFactor = 0.2,gydF4y2Ba...gydF4y2BaEntropyLossWeight = 0.01,gydF4y2Ba...gydF4y2BaMiniBatchSize = 64,gydF4y2Ba...gydF4y2BaNumEpoch = 3,gydF4y2Ba...gydF4y2BaAdvantageEstimateMethod =gydF4y2Ba“gae”gydF4y2Ba,gydF4y2Ba...gydF4y2BaGAEFactor = 0.95,gydF4y2Ba...gydF4y2BaDiscountFactor = 0.998);agent = rlPPOAgent(actor,批评家,agentOpts);gydF4y2Ba
在训练过程中,agent收集经验,直到达到200步的经验视界或插曲结束,然后从64个经验的小批量中训练3个epoch。目标函数剪辑因子为0.2可以提高训练稳定性,折扣因子值为0.998则鼓励长期奖励。采用广义优势估计方法,以0.95的GAE因子降低了输出的方差。gydF4y2Ba
火车代理gydF4y2Ba
对于本例,您最多训练代理10000集,每集最多持续200个时间步。当达到最大集数或超过100集的平均奖励超过100集时,训练终止。gydF4y2Ba
属性指定培训选项gydF4y2BarlTrainingOptionsgydF4y2Ba
对象。gydF4y2Ba
trainOpts = rlTrainingOptions(gydF4y2Ba...gydF4y2BaMaxEpisodes = 10000,gydF4y2Ba...gydF4y2BaMaxStepsPerEpisode = 200,gydF4y2Ba...gydF4y2BaScoreAveragingWindowLength = 200,gydF4y2Ba...gydF4y2Ba情节=gydF4y2Ba“训练进步”gydF4y2Ba,gydF4y2Ba...gydF4y2BaStopTrainingCriteria =gydF4y2Ba“AverageReward”gydF4y2Ba,gydF4y2Ba...gydF4y2BaStopTrainingValue = 80);gydF4y2Ba
培训代理使用gydF4y2Ba火车gydF4y2Ba
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理gydF4y2BadoTraininggydF4y2Ba
来gydF4y2Ba假gydF4y2Ba
.要亲自训练特工,请设置gydF4y2BadoTraininggydF4y2Ba
来gydF4y2Ba真正的gydF4y2Ba
.gydF4y2Ba
doTraining = false;gydF4y2Ba如果gydF4y2BadoTraining trainingStats = train(agent,env,trainOpts);gydF4y2Ba其他的gydF4y2Ba负载(gydF4y2Ba“rlAutoParkingValetAgent.mat”gydF4y2Ba,gydF4y2Ba“代理”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba
模拟剂gydF4y2Ba
模拟模型将车辆停在免费停车位。要模拟车辆停放在不同的位置,请在以下代码中更改免费停车位的位置。gydF4y2Ba
freeSpotIdx = 7;gydF4y2Ba%空闲点位置gydF4y2Basim (mdl);gydF4y2Ba
车辆在+/- 0.75米(位置)和+/-10度(方向)的指定误差容限内到达目标位姿。gydF4y2Ba
要查看自我载具的位置和方向,打开自我载具姿态范围。gydF4y2Ba