这个例子演示了一个用于自动搜索和停车任务的混合控制器的设计。该混合控制器使用模型预测控制(MPC)在停车场中遵循参考路径,并使用训练过的强化学习(RL)代理执行停车机动。gydF4y2Ba
在这个例子中,自动停车算法执行了一系列的机动,同时在狭窄的空间中感知和避开障碍物。它在自适应MPC控制器和RL代理之间切换来完成停车机动。MPC控制器沿参考路径以恒定速度移动车辆,同时算法搜索空车位。当一个停车位被发现,RL代理接管并执行一个预先训练的停车机动。控制器可以事先了解环境(停车场),包括空车点和停放车辆的位置。gydF4y2Ba
停车场代表的是gydF4y2Ba停车场gydF4y2Ba
类,它存储关于ego车辆、空停车位和静态障碍物(停放的汽车)的信息。每个停车位都有一个独特的索引号和一个指示灯,绿色(空闲)或红色(占用)。停放的车辆用黑色表示。gydF4y2Ba
创建一个gydF4y2Ba停车场gydF4y2Ba
目标在7号位置有一个空闲点。gydF4y2Ba
freeSpotIdx = 7;地图=停车场(freeSpotIdx);gydF4y2Ba
指定初始姿态gydF4y2Ba 为自我车辆。当车辆导航停车场时,基于第一个可用的自由点确定目标姿势。gydF4y2Ba
egoInitialPose = [20, 15, 0];gydF4y2Ba
使用该目标计算车辆的目标姿势gydF4y2BacreateTargetPosegydF4y2Ba
函数。目标位姿对应的位置gydF4y2BafreeSpotIdxgydF4y2Ba
.gydF4y2Ba
Egotargetospose = createTargetPosit(Map,FreeSpotidx)gydF4y2Ba
egoTargetPose =gydF4y2Ba1×3gydF4y2Ba47.7500 4.9000 -1.5708gydF4y2Ba
停车算法使用相机和LIDAR传感器来收集环境信息。gydF4y2Ba
安装在ego车上的摄像机的视场由下图中绿色阴影区域表示。照相机有一个视场gydF4y2Ba 被约束gydF4y2Ba 和最大测量深度gydF4y2Ba 10米。gydF4y2Ba
当EGO车辆向前移动时,相机模块感测到落在视野中的停车位,并确定点是否自由或占用。为简单起见,使用点位置和当前车辆姿势之间的几何关系来实现该动作。停车位在相机范围内gydF4y2Ba 和gydF4y2Ba , 在哪里gydF4y2Ba 到停车位的距离是多少gydF4y2Ba 是到停车位的角度。gydF4y2Ba
钢筋学习代理使用LIDAR传感器读数来确定自助车辆在环境中的其他车辆的附近。在该示例中的LIDAR传感器也使用几何关系进行建模。LiDAR距离沿着12线段测量,从自助式车辆的中心径向出现。当LIDAR线与障碍物相交时,它返回障碍物与车辆的距离。沿任何线段的最大可测量的LIDAR距离为6米。gydF4y2Ba
包括控制器,自助式车辆,传感器和停车场,包括Simulink®的停车剂代客模型。万博1manbetxgydF4y2Ba
加载自动泊车代客参数。gydF4y2Ba
autoParkingValetParamsgydF4y2Ba
打开Simulin万博1manbetxk模型。gydF4y2Ba
mdl =gydF4y2Ba“rlAutoParkingValet”gydF4y2Ba;open_system (mdl)gydF4y2Ba
该模型中的自我车辆动力学由一个单车道自行车模型来表示,该模型包含两个输入:车辆速度gydF4y2Ba (m/s)和转向角gydF4y2Ba (弧度)。MPC和RL控制器被放置在启用的子系统块内,该信号由表示车辆是否必须搜索空点或执行停车操纵的信号激活。使能信号由车辆模式子系统内的摄像机算法确定。最初,车辆在gydF4y2Ba搜索gydF4y2Ba模式和MPC控制器跟踪参考路径。找到一个免费点,gydF4y2Ba公园gydF4y2Bamode被激活时,RL agent执行停车动作。gydF4y2Ba
为参考轨迹跟踪创建自适应MPC控制器对象gydF4y2Bacreatempcforparking.gydF4y2Ba
脚本。有关Adaptive MPC的更多信息,请参阅gydF4y2Ba自适应政策委员会gydF4y2Ba(模型预测控制工具箱)gydF4y2Ba.gydF4y2Ba
creatempcforparking.gydF4y2Ba
RL agent的训练环境为下图中红色阴影区域。由于停车场的对称性,在对观测数据进行适当的坐标变换后,该区域内的训练足以使政策调整到其他区域。与整个停车场的培训相比,使用这个更小的培训区域显著减少了培训时间。gydF4y2Ba
对于这个环境:gydF4y2Ba
训练区域是一个22.5米× 20米的空间,目标点位于其水平中心。gydF4y2Ba
观测结果就是位置误差gydF4y2Ba 和gydF4y2Ba 自我飞行器相对于目标姿态,真实航向角的正弦和余弦gydF4y2Ba ,以及激光雷达传感器读数。gydF4y2Ba
车辆在停车时的速度是恒定的2米/秒。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;disstetesteerangles = -steerMax: deg2rad(15): steerMax;actionInfo = rlFiniteSetSpec (num2cell (discreteSteerAngles));actionInfo。Name =gydF4y2Ba“行动”gydF4y2Ba;numActions =元素个数(actionInfo.Elements);gydF4y2Ba
创建Simulink环万博1manbetx境接口,指定RL Agent块的路径。gydF4y2Ba
BLK = [MDLgydF4y2Ba“/ RL控制器/ RL代理”gydF4y2Ba];env = rl万博1manbetxsimulinkenv(mdl,blk,观察info,afticeinfo);gydF4y2Ba
指定培训的重置功能。这gydF4y2BaautoParkingValetResetFcngydF4y2Ba
函数在每一集开始时将自我载体的初始姿态重置为随机值。gydF4y2Ba
env。ResetFcn = @autoParkingValetResetFcn;gydF4y2Ba
有关创建Simulink环境的更多信息,请参见万博1manbetxgydF4y2Barl万博1manbetxSimulinkEnvgydF4y2Ba
.gydF4y2Ba
本例中的RL代理是具有离散动作空间的近端策略优化(PPO)代理。PPO代理依靠演员和评论家代表来学习最优策略。agent为演员和评论家维护基于深度神经网络的函数近似器。要了解有关PPO代理的更多信息,请参见gydF4y2Ba近端政策优化代理gydF4y2Ba.gydF4y2Ba
为重现性设置随机种子生成器。gydF4y2Ba
rng (0)gydF4y2Ba
要创建批评批读表示,首先创建一个具有16个输入和一个输出的深度神经网络。批评网络的输出是特定观察的状态值函数。gydF4y2Ba
criticNetwork = [featureInputLayer(numobobservations,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));gydF4y2Ba
为PPO代理创建批评家。有关更多信息,请参见gydF4y2BarlValueRepresentationgydF4y2Ba
和gydF4y2BarlRepresentationOptionsgydF4y2Ba
.gydF4y2Ba
criticOptions = rlRepresentationOptions (gydF4y2Ba“LearnRate”gydF4y2Ba1 e - 3,gydF4y2Ba“GradientThreshold”gydF4y2Ba1);评论家= rlValueRepresentation (criticNetwork observationInfo,gydF4y2Ba...gydF4y2Ba“观察”gydF4y2Ba, {gydF4y2Ba“观察”gydF4y2Ba},批评);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)全连接列(数量,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“出”gydF4y2Ba) softmaxLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“actionProb”gydF4y2Ba));gydF4y2Ba
为PPO代理创建一个随机参与者表示。有关更多信息,请参见gydF4y2BarlstochastorrepresentationgydF4y2Ba
.gydF4y2Ba
actorOptions = rlRepresentationOptions (gydF4y2Ba“LearnRate”gydF4y2Ba2的军医,gydF4y2Ba“GradientThreshold”gydF4y2Ba1);演员= rlStochasticActorRepresentation (actorNetwork observationInfo actionInfo,gydF4y2Ba...gydF4y2Ba“观察”gydF4y2Ba, {gydF4y2Ba“观察”gydF4y2Ba},ActorOptions);gydF4y2Ba
指定代理选项并创建PPO代理。有关PPO代理选项的详细信息,请参阅gydF4y2BarlPPOAgentOptionsgydF4y2Ba
.gydF4y2Ba
agentOpts = rlPPOAgentOptions (gydF4y2Ba...gydF4y2Ba'采样时间'gydF4y2BaTs,gydF4y2Ba...gydF4y2Ba'经验鲁兹gydF4y2Ba, 200,gydF4y2Ba...gydF4y2Ba'ClipFactor'gydF4y2Ba, 0.2,gydF4y2Ba...gydF4y2Ba“EntropyLossWeight”gydF4y2Ba,0.01,gydF4y2Ba...gydF4y2Ba“MiniBatchSize”gydF4y2Ba, 64,gydF4y2Ba...gydF4y2Ba'numechoch'gydF4y2Ba,3,gydF4y2Ba...gydF4y2Ba'vieildereextimatemethod'gydF4y2Ba,gydF4y2Ba“gae”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“GAEFactor”gydF4y2Ba, 0.95,gydF4y2Ba...gydF4y2Ba“DiscountFactor”gydF4y2Ba, 0.998);代理= rlPPOAgent(演员、评论家、agentOpts);gydF4y2Ba
在训练过程中,agent收集经验,直到达到200步的经验视界或事件结束,然后从64个经验小批量进行三个阶段的训练。目标函数剪辑系数为0.2可提高训练稳定性,折扣系数为0.998可鼓励长期奖励。用GAE因子为0.95的广义优势估计方法减少了评价输出中的方差。gydF4y2Ba
对于本例,您对代理进行最多10000集的训练,每集最多持续200个时间步骤。当达到最大集数或平均奖励超过100集时,训练结束。gydF4y2Ba
指定用于培训的选项gydF4y2BarlTrainingOptionsgydF4y2Ba
对象。gydF4y2Ba
trainOpts = rlTrainingOptions (gydF4y2Ba...gydF4y2Ba'maxepisodes'gydF4y2Ba, 10000,gydF4y2Ba...gydF4y2Ba'maxstepperepisode'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
函数。培训此代理是一个计算密集型进程,需要几分钟才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理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
freeSpotIdx = 7;gydF4y2Ba%空闲点位置gydF4y2Basim (mdl);gydF4y2Ba
车辆达到目标位姿在指定的误差公差+/- 0.75米(位置)和+/-10度(方向)。gydF4y2Ba
要查看自我车辆的位置和方向,请打开自我车辆姿态范围。gydF4y2Ba