这个例子演示了一个用于自动搜索和停车任务的混合控制器的设计。该混合控制器使用模型预测控制(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
freeSpotIdx egoTargetPose = createTargetPose(地图)gydF4y2Ba
egoTargetPose =gydF4y2Ba1×3gydF4y2Ba47.7500 4.9000 -1.5708gydF4y2Ba
停车算法使用摄像头和激光雷达传感器从环境中收集信息。gydF4y2Ba
安装在ego车上的摄像机的视场由下图中绿色阴影区域表示。照相机有一个视场gydF4y2Ba 有界的gydF4y2Ba 以及最大测量深度gydF4y2Ba 10米。gydF4y2Ba
当自我车辆向前移动时,摄像头模块感知视野范围内的停车点,并决定一个停车位是空闲的还是被占用的。为了简单起见,这个动作是使用点位置和当前车辆姿态之间的几何关系来实现的。停车位在摄像头范围内,如果gydF4y2Ba 和gydF4y2Ba ,在那里gydF4y2Ba 到停车位的距离是多少gydF4y2Ba 是到停车位的角度。gydF4y2Ba
强化学习代理使用激光雷达传感器读数来确定ego车辆与环境中其他车辆的接近程度。本例中的激光雷达传感器也使用几何关系建模。激光雷达距离是沿着从自我飞行器中心放射状出现的12条线段测量的。当激光雷达线与障碍物相交时,它返回障碍物与车辆的距离。沿任何线段的最大可测激光雷达距离为6米。gydF4y2Ba
泊车代客模型,包括控制器、ego车辆、传感器和停车场,是在Simulink®中实现的。金宝appgydF4y2Ba
加载自动泊车代客参数。gydF4y2Ba
autoParkingValetParamsgydF4y2Ba
打开Simulin金宝appk模型。gydF4y2Ba
mdl =gydF4y2Ba“rlAutoParkingValet”gydF4y2Ba;open_system (mdl)gydF4y2Ba
该模型中的自我车辆动力学由一个单车道自行车模型来表示,该模型包含两个输入:车辆速度gydF4y2Ba (m/s)和转向角gydF4y2Ba (弧度)。MPC和RL控制器被放置在启用子系统模块中,这些模块由信号激活,这些信号表示车辆是否需要搜索空车位或执行停车机动。使能信号由车辆模式子系统中的Camera算法决定。一开始,飞行器在里面gydF4y2Ba搜索gydF4y2Ba模式和MPC控制器跟踪参考路径。当找到一个空位时,gydF4y2Ba公园gydF4y2Bamode被激活时,RL agent执行停车动作。gydF4y2Ba
为参考轨迹跟踪创建自适应MPC控制器对象gydF4y2BacreateMPCForParkinggydF4y2Ba
脚本。有关自适应MPC的更多信息,请参见gydF4y2Ba自适应政策委员会gydF4y2Ba(模型预测控制工具箱)gydF4y2Ba.gydF4y2Ba
createMPCForParkinggydF4y2Ba
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环金宝app境接口,指定RL Agent块的路径。gydF4y2Ba
黑色= [mdlgydF4y2Ba“/ RL控制器/ RL代理”gydF4y2Ba];env = rl金宝appSimulinkEnv (mdl,黑色,observationInfo actionInfo);gydF4y2Ba
指定一个用于训练的重置函数。的gydF4y2BaautoParkingValetResetFcngydF4y2Ba
函数在每一集开始时将自我载体的初始姿态重置为随机值。gydF4y2Ba
env。ResetFcn = @autoParkingValetResetFcn;gydF4y2Ba
有关创建Simulink环境的更多信息,请参见金宝appgydF4y2Barl金宝appSimulinkEnvgydF4y2Ba
.gydF4y2Ba
本例中的RL代理是具有离散动作空间的近端策略优化(PPO)代理。PPO代理依靠演员和评论家代表来学习最优策略。agent为演员和评论家维护基于深度神经网络的函数近似器。要了解有关PPO代理的更多信息,请参见gydF4y2Ba近端政策优化代理gydF4y2Ba.gydF4y2Ba
为重现性设置随机种子生成器。gydF4y2Ba
rng (0)gydF4y2Ba
要创建批评表示,首先创建一个有16个输入和1个输出的深度神经网络。评价网络的输出是一个特定观测的状态值函数。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}, criticOptions);gydF4y2Ba
行动者网络的输出是车辆处于某一状态时采取每种可能转向动作的概率。创建参与者深度神经网络。gydF4y2Ba
actorNetwork = [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 (numActionsgydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“出”gydF4y2Ba) softmaxLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“actionProb”gydF4y2Ba));gydF4y2Ba
为PPO代理创建一个随机参与者表示。有关更多信息,请参见gydF4y2BarlStochasticActorRepresentationgydF4y2Ba
.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“SampleTime”gydF4y2BaTs,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
在训练过程中,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“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
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理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