主要内容gydF4y2Ba

培训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 XgydF4y2Ba 0gydF4y2Ba ,gydF4y2Ba YgydF4y2Ba 0gydF4y2Ba ,gydF4y2Ba θgydF4y2Ba 0gydF4y2Ba )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 ±gydF4y2Ba 60gydF4y2Ba 度gydF4y2Ba 和最大测量深度gydF4y2Ba dgydF4y2Ba 马克斯gydF4y2Ba 10米。gydF4y2Ba

当自我车辆向前移动时,摄像头模块会感知视野范围内的停车点,并确定一个停车位是空的还是有人的。为了简单起见,这个动作是使用点位置和当前车辆姿态之间的几何关系来实现的。停车场在摄像头的拍摄范围内,如果gydF4y2Ba dgydF4y2Ba 我gydF4y2Ba ≤gydF4y2Ba dgydF4y2Ba 马克斯gydF4y2Ba 而且gydF4y2Ba φgydF4y2Ba 最小值gydF4y2Ba ≤gydF4y2Ba φgydF4y2Ba 我gydF4y2Ba ≤gydF4y2Ba φgydF4y2Ba 马克斯gydF4y2Ba ,在那里gydF4y2Ba dgydF4y2Ba 我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 vgydF4y2Ba (m/s)和转向角gydF4y2Ba δgydF4y2Ba (弧度)。MPC和RL控制器被放置在Enabled子系统块中,由表示车辆是否必须寻找空点或执行停车机动的信号激活。使能信号由车辆模式子系统中的摄像头算法决定。最初,车辆是在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 XgydF4y2Ba egydF4y2Ba 而且gydF4y2Ba YgydF4y2Ba egydF4y2Ba 自我飞行器相对于目标姿态的,真实航向角的正弦和余弦gydF4y2Ba θgydF4y2Ba ,以及激光雷达传感器读数。gydF4y2Ba

  • 停车时车辆的速度是恒定的2米/秒。gydF4y2Ba

  • 动作信号是离散的转向角度,范围在+/- 45度之间的步骤15度。gydF4y2Ba

  • 如果相对于目标位姿的误差在+/- 0.75米(位置)和+/-10度(方向)的指定公差范围内,则认为车辆已停放。gydF4y2Ba

  • 如果自我载具离开训练区域的边界,与障碍物相撞,或成功停车,这一情节就结束了。gydF4y2Ba

  • 奖励gydF4y2Ba rgydF4y2Ba tgydF4y2Ba 按时间提供gydF4y2BatgydF4y2Ba是:gydF4y2Ba

rgydF4y2Ba tgydF4y2Ba =gydF4y2Ba 2gydF4y2Ba egydF4y2Ba -gydF4y2Ba (gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 05gydF4y2Ba XgydF4y2Ba egydF4y2Ba 2gydF4y2Ba +gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 04gydF4y2Ba YgydF4y2Ba egydF4y2Ba 2gydF4y2Ba )gydF4y2Ba +gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 5gydF4y2Ba egydF4y2Ba -gydF4y2Ba 40gydF4y2Ba θgydF4y2Ba egydF4y2Ba 2gydF4y2Ba -gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 05gydF4y2Ba δgydF4y2Ba 2gydF4y2Ba +gydF4y2Ba One hundred.gydF4y2Ba fgydF4y2Ba tgydF4y2Ba -gydF4y2Ba 50gydF4y2Ba ggydF4y2Ba tgydF4y2Ba

在这里,gydF4y2Ba XgydF4y2Ba egydF4y2Ba ,gydF4y2Ba YgydF4y2Ba egydF4y2Ba ,gydF4y2Ba θgydF4y2Ba egydF4y2Ba 自我飞行器与目标姿态的位置和航向角度误差,和gydF4y2Ba δgydF4y2Ba 是转向角。gydF4y2Ba fgydF4y2Ba tgydF4y2Ba (0或1)表示车辆是否已停车和gydF4y2Ba ggydF4y2Ba tgydF4y2Ba (0或1)表示车辆当时是否与障碍物相撞gydF4y2Ba tgydF4y2Ba .gydF4y2Ba

车辆姿态的坐标变换gydF4y2Ba (gydF4y2Ba XgydF4y2Ba ,gydF4y2Ba YgydF4y2Ba ,gydF4y2Ba θgydF4y2Ba )gydF4y2Ba 不同泊车位的观察结果如下:gydF4y2Ba

  • 1-14:无转换gydF4y2Ba

  • 第15 - 22:gydF4y2Ba XgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba YgydF4y2Ba ,gydF4y2Ba YgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba -gydF4y2Ba XgydF4y2Ba ,gydF4y2Ba θgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba θgydF4y2Ba -gydF4y2Ba πgydF4y2Ba /gydF4y2Ba 2gydF4y2Ba

  • 23-36:gydF4y2Ba XgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba One hundred.gydF4y2Ba -gydF4y2Ba XgydF4y2Ba ,gydF4y2Ba YgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba 60gydF4y2Ba -gydF4y2Ba YgydF4y2Ba ,gydF4y2Ba θgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba θgydF4y2Ba -gydF4y2Ba πgydF4y2Ba

  • 37-40:gydF4y2Ba XgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba 60gydF4y2Ba -gydF4y2Ba YgydF4y2Ba ,gydF4y2Ba YgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba XgydF4y2Ba ,gydF4y2Ba θgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba θgydF4y2Ba -gydF4y2Ba 3.gydF4y2Ba πgydF4y2Ba /gydF4y2Ba 2gydF4y2Ba

  • 41-52:gydF4y2Ba XgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba One hundred.gydF4y2Ba -gydF4y2Ba XgydF4y2Ba ,gydF4y2Ba YgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba 30.gydF4y2Ba -gydF4y2Ba YgydF4y2Ba ,gydF4y2Ba θgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba θgydF4y2Ba +gydF4y2Ba πgydF4y2Ba

  • 53 - 64:gydF4y2Ba XgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba XgydF4y2Ba ,gydF4y2Ba YgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba YgydF4y2Ba -gydF4y2Ba 28gydF4y2Ba ,gydF4y2Ba θgydF4y2Ba ‾gydF4y2Ba =gydF4y2Ba θgydF4y2Ba

为环境创建观察和行动规范。gydF4y2Ba

numObservations = 16;observationInfo = rlNumericSpec([numObservations 1]);observationInfo。Name =gydF4y2Ba“观察”gydF4y2Ba;steerMax = /4;离散steerangles = -steerMax: deg2rad(15): steerMax;actionInfo = rllimitesetspec (num2cell(discrete testeerangles));actionInfo。Name =gydF4y2Ba“行动”gydF4y2Ba;numActions = numel(actionInfo.Elements);gydF4y2Ba

创建Simulink环境接口,指定RL Agent块的路径。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代理依赖于行动者和批评家的表征来学习最优策略。代理为演员和评论家维护基于深度神经网络的函数逼近器。要了解更多关于PPO代理的信息,请参见gydF4y2Ba近端策略优化代理gydF4y2Ba.gydF4y2Ba

设置随机种子发生器的再现性。gydF4y2Ba

rng (0)gydF4y2Ba

要创建批评家表示,首先创建一个具有16个输入和1个输出的深度神经网络。临界网络的输出是一个特定观测的状态值函数。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));criticNetwork = dlnetwork(criticNetwork);gydF4y2Ba

为PPO代理创建批评家。有关更多信息,请参见gydF4y2BarlValueFunctiongydF4y2Ba而且gydF4y2BarlOptimizerOptionsgydF4y2Ba.gydF4y2Ba

criticOptions = rlottimizeroptions (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));actor网络= dlnetwork(actor网络);gydF4y2Ba

为PPO代理创建一个离散的类别参与者。有关更多信息,请参见gydF4y2BarlDiscreteCategoricalActorgydF4y2Ba.gydF4y2Ba

actorOptions = rlottimizeroptions (gydF4y2Ba...gydF4y2BaLearnRate = 2的军医,gydF4y2Ba...gydF4y2BaGradientThreshold = 1);actor = rldiscrete tecategoricalactor (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(演员,评论家,agentOpts);gydF4y2Ba

在训练过程中,代理收集经验,直到达到200步的经验视界或章节结束,然后从64个经验的小批量中进行训练,共3个章节。0.2的目标函数剪辑因子提高了训练的稳定性,0.998的折扣因子值鼓励长期奖励。采用广义优势估计方法,在GAE因子为0.95的情况下,减少了评价结果的方差。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如果gydF4y2BatrainingStats = 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

另请参阅gydF4y2Ba

相关的话题gydF4y2Ba

Baidu
map