火车PPO代理自动代客停车gydF4y2Ba
这个案例展示了混合控制器的设计一个自动搜索和停车的任务。混合控制器使用模型预测控制(MPC)跟随参考路径在一个停车场和一个训练有素的强化学习(RL)代理执行停车操作。gydF4y2Ba
自动停车算法在本例中执行的一系列动作,同时传感和避免在狭小空间障碍。之间切换自适应MPC控制器和RL代理完成停车操作。MPC控制器车辆在一个恒定的速度移动沿着参考路径,算法搜索一个空的停车位。当找到现货,RL代理接管和执行pretrained停车操作。环境的先验知识(停车场),包括空点和停放车辆的位置提供给控制器。gydF4y2Ba
停车场gydF4y2Ba
所代表的停车场gydF4y2Ba停车场gydF4y2Ba
类,它存储的信息自我车,空的停车位,和静态障碍(停放的汽车)。每个停车位都有一个唯一的索引号和一个指示灯是绿色(免费)或红色(占用)。停放车辆用黑色表示。gydF4y2Ba
创建一个gydF4y2Ba停车场gydF4y2Ba
对象与自由点位置7。gydF4y2Ba
freeSpotIdx = 7;地图=停车场(freeSpotIdx);gydF4y2Ba
指定一个初始姿势gydF4y2Ba 自我的工具。确定目标构成基于第一个可用的免费停车场的车辆导航。gydF4y2Ba
egoInitialPose =[0] 20日15日;gydF4y2Ba
计算的目标造成车辆使用gydF4y2BacreateTargetPosegydF4y2Ba
函数。目标构成对应的位置gydF4y2BafreeSpotIdxgydF4y2Ba
。gydF4y2Ba
freeSpotIdx egoTargetPose = createTargetPose(地图)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
代客停车模式,包括控制器、自我汽车,传感器,和停车场,在仿真软件中实现®。金宝appgydF4y2Ba
负载自动停车员参数。gydF4y2Ba
autoParkingValetParamsgydF4y2Ba
打开仿真软件模型。金宝appgydF4y2Ba
mdl =gydF4y2Ba“rlAutoParkingValet”gydF4y2Ba;open_system (mdl)gydF4y2Ba
自我车辆动力学在这个模型由一个单向的自行车模型有两个输入:车辆速度gydF4y2Ba (米/秒)和转向角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 m x 20 m区域在水平中心与目标点。gydF4y2Ba
观测位置错误gydF4y2Ba 和gydF4y2Ba 自我的工具对目标造成,真正的航向角的正弦和余弦gydF4y2Ba 和激光雷达传感器读数。gydF4y2Ba
在停车车辆的速度是一个常数2 m / 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 =π/ 4;discreteSteerAngles = -steerMax:函数(15):steerMax;actionInfo = rlFiniteSetSpec (num2cell (discreteSteerAngles));actionInfo。Name =gydF4y2Ba“行动”gydF4y2Ba;numActions =元素个数(actionInfo.Elements);gydF4y2Ba
创建仿真软件环境界面,金宝appRL代理指定路径。gydF4y2Ba
黑色= [mdlgydF4y2Ba“/ RL控制器/ RL代理”gydF4y2Ba];env = rl金宝appSimulinkEnv (mdl,黑色,observationInfo actionInfo);gydF4y2Ba
指定一个重置功能训练。的gydF4y2BaautoParkingValetResetFcngydF4y2Ba
函数重置的初始姿势自我车辆随机值在每集的开始。gydF4y2Ba
env。ResetFcn = @autoParkingValetResetFcn;gydF4y2Ba
创造仿真软件环境的更多信息,请参阅金宝appgydF4y2Barl金宝appSimulinkEnvgydF4y2Ba
。gydF4y2Ba
创建代理gydF4y2Ba
RL代理在本例中是一个近端政策优化(PPO)代理一个离散的行动空间。PPO代理依靠演员和评论家表示学习最优政策。代理维护深层神经网络函数接近者为演员和评论家。更多地了解PPO代理,看看gydF4y2Ba近端政策优化代理gydF4y2Ba。gydF4y2Ba
再现性的随机种子生成器。gydF4y2Ba
rng (0)gydF4y2Ba
创建评论家表示,首先创建一个深层神经网络具有16个输入和一个输出。评论家网络状态值的输出函数为特定的观察。gydF4y2Ba
criticNetwork = [featureInputLayer numObservations,gydF4y2Ba“归一化”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“观察”gydF4y2Ba)fullyConnectedLayer (128,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“fc1”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu1”gydF4y2Ba)fullyConnectedLayer (128,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“取得”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu2”gydF4y2Ba)fullyConnectedLayer (128,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“一个fc3”文件gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu3”gydF4y2Ba)fullyConnectedLayer (1,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“fc4”gydF4y2Ba));criticNetwork = dlnetwork (criticNetwork);gydF4y2Ba
创建的评论家PPO代理。有关更多信息,请参见gydF4y2BarlValueFunctiongydF4y2Ba
和gydF4y2BarlOptimizerOptions。gydF4y2Ba
criticOptions = rlOptimizerOptions (gydF4y2Ba“LearnRate”gydF4y2Ba1 e - 3,gydF4y2Ba“GradientThreshold”gydF4y2Ba1);评论家= rlValueFunction (criticNetwork observationInfo);gydF4y2Ba
演员网络的输出的概率采取每个可能转向行动当车辆处于某种状态。创建一个演员深层神经网络。gydF4y2Ba
actorNetwork = [featureInputLayer numObservations,gydF4y2Ba“归一化”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“观察”gydF4y2Ba)fullyConnectedLayer (128,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“fc1”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu1”gydF4y2Ba)fullyConnectedLayer (128,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“取得”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu2”gydF4y2Ba)fullyConnectedLayer (numActionsgydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“出”gydF4y2Ba)softmaxLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“actionProb”gydF4y2Ba));actorNetwork = dlnetwork (actorNetwork);gydF4y2Ba
创建一个离散分类演员PPO的代理。有关更多信息,请参见gydF4y2BarlDiscreteCategoricalActorgydF4y2Ba
。gydF4y2Ba
actorOptions = rlOptimizerOptions (gydF4y2Ba“LearnRate”gydF4y2Ba2的军医,gydF4y2Ba“GradientThreshold”gydF4y2Ba1);演员= rlDiscreteCategoricalActor (actorNetwork observationInfo actionInfo);gydF4y2Ba
指定代理选项并创建PPO代理。PPO代理选项的更多信息,请参阅gydF4y2BarlPPOAgentOptionsgydF4y2Ba
。gydF4y2Ba
agentOpts = rlPPOAgentOptions (gydF4y2Ba…gydF4y2Ba“SampleTime”gydF4y2BaTs,gydF4y2Ba…gydF4y2Ba“ActorOptimizerOptions”gydF4y2BaactorOptions,gydF4y2Ba…gydF4y2Ba“CriticOptimizerOptions”gydF4y2BacriticOptions,gydF4y2Ba…gydF4y2Ba“ExperienceHorizon”gydF4y2Ba,200,gydF4y2Ba…gydF4y2Ba“ClipFactor”gydF4y2Ba,0.2,gydF4y2Ba…gydF4y2Ba“EntropyLossWeight”gydF4y2Ba,0.01,gydF4y2Ba…gydF4y2Ba“MiniBatchSize”gydF4y2Ba,64,gydF4y2Ba…gydF4y2Ba“NumEpoch”gydF4y2Ba3,gydF4y2Ba…gydF4y2Ba“AdvantageEstimateMethod”gydF4y2Ba,gydF4y2Ba“gae”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“GAEFactor”gydF4y2Ba,0.95,gydF4y2Ba…gydF4y2Ba“DiscountFactor”gydF4y2Ba,0.998);代理= rlPPOAgent(演员、评论家、agentOpts);gydF4y2Ba
培训期间,代理收集经验,直到达到经验地平线200步或集64年终止,然后从mini-batches火车经历了三个时代。0.2提高培训的目标函数剪辑因素稳定性和折现系数值0.998鼓励长期回报。在评论家输出方差减少广义优势估计方法GAE因子为0.95。gydF4y2Ba
火车代理gydF4y2Ba
对于本例,您培训代理最多10000集,每集与持久的最多200时间步。训练终止当事件的最大数量达到或超过100集的平均回报超过100。gydF4y2Ba
培训使用一个指定的选项gydF4y2BarlTrainingOptionsgydF4y2Ba
对象。gydF4y2Ba
trainOpts = rlTrainingOptions (gydF4y2Ba…gydF4y2Ba“MaxEpisodes”gydF4y2Ba,10000,gydF4y2Ba…gydF4y2Ba“MaxStepsPerEpisode”gydF4y2Ba,200,gydF4y2Ba…gydF4y2Ba“ScoreAveragingWindowLength”gydF4y2Ba,200,gydF4y2Ba…gydF4y2Ba“阴谋”gydF4y2Ba,gydF4y2Ba“训练进步”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“StopTrainingCriteria”gydF4y2Ba,gydF4y2Ba“AverageReward”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“StopTrainingValue”gydF4y2Ba,80);gydF4y2Ba
火车代理使用gydF4y2Ba火车gydF4y2Ba
函数。培训这个代理是一个计算密集型的过程需要几分钟才能完成。节省时间在运行这个例子中,加载一个pretrained代理设置gydF4y2BadoTraininggydF4y2Ba
来gydF4y2Ba假gydF4y2Ba
。训练自己代理,集gydF4y2BadoTraininggydF4y2Ba
来gydF4y2Ba真正的gydF4y2Ba
。gydF4y2Ba
doTraining = false;gydF4y2Ba如果gydF4y2BadoTraining trainingStats =火车(代理,env, trainOpts);gydF4y2Ba其他的gydF4y2Ba负载(gydF4y2Ba“rlAutoParkingValetAgent.mat”gydF4y2Ba,gydF4y2Ba“代理”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba
模拟剂gydF4y2Ba
模拟模型的汽车公园免费停车位。模拟车辆在不同的位置停车,改变自由点位置在下面的代码。gydF4y2Ba
freeSpotIdx = 7;gydF4y2Ba%免费点位置gydF4y2Basim (mdl);gydF4y2Ba
车辆到达目标构成在指定误差公差+ / - 0.75 m(位置)和+ / -10度(方向)。gydF4y2Ba
把自我车辆位置和姿态,开放自我车辆构成范围。gydF4y2Ba