此示例演示了用于自动搜索和停车任务的混合控制器的设计。混合控制器使用模型预测控制(MPC)来遵循停车场中的参考路径和培训的加强学习(RL)代理以执行停车操纵。G.ydF4y2Ba
在这个例子中,自动停车算法执行了一系列的机动,同时在狭窄的空间中感知和避开障碍物。它在自适应MPC控制器和RL代理之间切换来完成停车机动。MPC控制器沿参考路径以恒定速度移动车辆,同时算法搜索空车位。当一个停车位被发现,RL代理接管并执行一个预先训练的停车机动。控制器可以事先了解环境(停车场),包括空车点和停放车辆的位置。G.ydF4y2Ba
停车场代表的是G.ydF4y2Ba停车场G.ydF4y2Ba
班级,存储有关自我车辆,空停车斑和静态障碍物(停放的汽车)的信息。每个停车位都有一个唯一的索引号和绿色(自由)或红色(占用)的指示灯。停放的车辆以黑色表示。G.ydF4y2Ba
创建一个G.ydF4y2Ba停车场G.ydF4y2Ba
目标在7号位置有一个空闲点。G.ydF4y2Ba
FreeSpotidx = 7;地图=停车局(FreeSpotidx);G.ydF4y2Ba
指定初始姿态G.ydF4y2Ba 对于自身车辆。目标姿势是基于为车辆导航的停车场第一个可用的点确定。G.ydF4y2Ba
egoInitialPose = [20, 15, 0];G.ydF4y2Ba
计算使用车辆的目标姿势G.ydF4y2BacreateTargetPoseG.ydF4y2Ba
函数。目标位姿对应的位置G.ydF4y2BaFreeSpotidx.G.ydF4y2Ba
.G.ydF4y2Ba
egoTargetPose = createTargetPose(地图,freeSpotIdx)G.ydF4y2Ba
egotargetospose =G.ydF4y2Ba1×3G.ydF4y2Ba47.7500 4.9000 -1.5708G.ydF4y2Ba
停车算法使用摄像头和雷达传感器来收集来自环境的信息。G.ydF4y2Ba
安装在ego车上的摄像机的视场由下图中绿色阴影区域表示。照相机有一个视场G.ydF4y2Ba 以下所界定G.ydF4y2Ba 和最大测量深度G.ydF4y2Ba 10米。G.ydF4y2Ba
作为前进自主车辆移动时,相机模块感测落在视野之内的停车点,并确定一个点是否是自由或占据。为了简单起见,这个动作是使用斑点位置和当前车辆姿态之间的几何关系来实现。停车点是摄像机范围内,如果G.ydF4y2Ba 和G.ydF4y2Ba ,在哪里G.ydF4y2Ba 是到停车位的距离和G.ydF4y2Ba 是到停车位的角度。G.ydF4y2Ba
强化学习代理使用激光雷达传感器读数来确定自身车辆的其他车辆在环境中的接近度。本例中的激光雷达传感器是使用几何关系也被建模。激光雷达的距离沿12个线段径向从自身车辆的中心出现测量。当激光雷达线相交的障碍物,则返回从车辆到障碍物的距离。沿任何线段的最大可测量激光雷达距离为6m。G.ydF4y2Ba
停车代客模型,包括控制器,自主车辆,传感器和停车场,在Simulink®中被实现。万博1manbetxG.ydF4y2Ba
加载自动泊车代客参数。G.ydF4y2Ba
autoParkingValetParamsG.ydF4y2Ba
打开Simulin万博1manbetxk模型。G.ydF4y2Ba
mdl =G.ydF4y2Ba“rlAutoParkingValet”G.ydF4y2Ba;open_system (mdl)G.ydF4y2Ba
该模型中的自我车辆动力学由一个单车道自行车模型来表示,该模型包含两个输入:车辆速度G.ydF4y2Ba (m/s)和转向角G.ydF4y2Ba (弧度)。所述MPC和RL控制器被放置在由表示车辆是否必须搜索的空白处或执行驻车操作信号激活使能子系统块内。信号由车辆模式子系统内的相机算法确定的使能。最初,车辆处于G.ydF4y2Ba搜索G.ydF4y2Ba模式和所述MPC控制器的轨道参考路径。当一个自由点被发现,G.ydF4y2Ba公园G.ydF4y2Ba激活模式,RL代理执行停车操作。G.ydF4y2Ba
为参考轨迹跟踪创建自适应MPC控制器对象G.ydF4y2BacreateMPCForParkingG.ydF4y2Ba
脚本。有关自适应MPC的更多信息,请参阅G.ydF4y2Ba自适应MPCG.ydF4y2Ba(模型预测控制工具箱)G.ydF4y2Ba.G.ydF4y2Ba
createMPCForParkingG.ydF4y2Ba
RL agent的训练环境为下图中红色阴影区域。由于停车场的对称性,在对观测数据进行适当的坐标变换后,该区域内的训练足以使政策调整到其他区域。与整个停车场的培训相比,使用这个更小的培训区域显著减少了培训时间。G.ydF4y2Ba
对于这样的环境:G.ydF4y2Ba
训练区域是一个22.5米× 20米的空间,目标点位于其水平中心。G.ydF4y2Ba
观测结果就是位置误差G.ydF4y2Ba 和G.ydF4y2Ba 自我飞行器相对于目标姿态,真实航向角的正弦和余弦G.ydF4y2Ba ,以及激光雷达传感器读数。G.ydF4y2Ba
停车期间的车速是恒定的2米/秒。G.ydF4y2Ba
动作信号是离散的转向角,其在15度的步长之间的+/- 45度之间的范围。G.ydF4y2Ba
如果目标姿势的误差在+/- 0.75米(位置)和+/- 10度(方向)的特定公差内,则认为车辆被认为停放。G.ydF4y2Ba
剧集终止如果自我车辆摆脱训练区的界限,则成功碰撞障碍物或公园。G.ydF4y2Ba
奖励G.ydF4y2Ba 提供的时间G.ydF4y2BaT.G.ydF4y2Ba,是:G.ydF4y2Ba
在这里,G.ydF4y2Ba 那G.ydF4y2Ba ,G.ydF4y2Ba 是来自目标姿势的自我车辆的位置和标题角误差,以及G.ydF4y2Ba 是转向角。G.ydF4y2Ba (0或1)表示车辆是否已停车G.ydF4y2Ba (0或1)表示车辆是否已经在时间与障碍物碰撞G.ydF4y2Ba .G.ydF4y2Ba
车辆姿势的坐标变换G.ydF4y2Ba 对于不同的停车点位置以下几点意见:G.ydF4y2Ba
1-14:没有转型G.ydF4y2Ba
15-22:G.ydF4y2Ba
23-36:G.ydF4y2Ba
37-40:G.ydF4y2Ba
41-52:G.ydF4y2Ba
53-64:G.ydF4y2Ba
创建环境的观察和行动规范。G.ydF4y2Ba
numobservations = 16;观察invo = rlnumericspec([numobservations 1]);观察info.name =G.ydF4y2Ba“观察”G.ydF4y2Ba;Steermax = PI / 4;Solcetesteerangles = -Steermax:Deg2rad(15):Steermax;ActionInfo = rlfinitesetspec(num2cell(酌情));ActionInfo.name =.G.ydF4y2Ba'行动'G.ydF4y2Ba;numActions =元素个数(actionInfo.Elements);G.ydF4y2Ba
创建Simulink环万博1manbetx境接口,指定RL Agent块的路径。G.ydF4y2Ba
BLK = [MDLG.ydF4y2Ba“/ RL控制器/ RL代理”G.ydF4y2Ba]。ENV = rl万博1manbetxSimulinkEnv(MDL,BLK,observationInfo,actionInfo);G.ydF4y2Ba
指定培训复位功能。当G.ydF4y2BaautoParkingValetResetFcnG.ydF4y2Ba
函数在每一集开始时将自我载体的初始姿态重置为随机值。G.ydF4y2Ba
env.resetfcn = @autoparkingvaletresetfcn;G.ydF4y2Ba
有关创建Simulink环境的更多信息,请参见万博1manbetxG.ydF4y2BaRl万博1manbetxsimulinkenv.G.ydF4y2Ba
.G.ydF4y2Ba
该示例中的RL代理是具有离散动作空间的近端策略优化(PPO)代理。PPO代理人依靠演员和批评者表示来学习最佳政策。该代理维护了演员和评论家的深度神经网络的函数近似器。要了解有关PPO代理商的更多信息,请参阅G.ydF4y2Ba近端政策优化代理G.ydF4y2Ba.G.ydF4y2Ba
为重现性设置随机种子生成器。G.ydF4y2Ba
rng (0)G.ydF4y2Ba
为了创建评论家表示,首先用16个输入和一个输出的深神经网络。评论家网络的输出是用于特定的观察的状态值的功能。G.ydF4y2Ba
criticNetwork = [featureInputLayer(numObservations,G.ydF4y2Ba“正常化”G.ydF4y2Ba那G.ydF4y2Ba'没有'G.ydF4y2Ba那G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“观察”G.ydF4y2Ba)全连接列(128,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“fc1”G.ydF4y2Ba)剥离(G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba'relu1'G.ydF4y2Ba)全连接列(128,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“取得”G.ydF4y2Ba)剥离(G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“relu2”G.ydF4y2Ba)全连接列(128,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“一个fc3”文件G.ydF4y2Ba)剥离(G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“relu3”G.ydF4y2Ba) fullyConnectedLayer (1,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“fc4”G.ydF4y2Ba)];G.ydF4y2Ba
为PPO代理创建批评家。有关更多信息,请参阅G.ydF4y2BarlValueRepresentationG.ydF4y2Ba
和G.ydF4y2BarlrepresentationOptions.G.ydF4y2Ba
.G.ydF4y2Ba
criticOptions = rlRepresentationOptions (G.ydF4y2Ba'学习'G.ydF4y2Ba1 e - 3,G.ydF4y2Ba'gradientthreshold'G.ydF4y2Ba1);评论家= rlValueRepresentation (criticNetwork observationInfo,G.ydF4y2Ba...G.ydF4y2Ba“观察”G.ydF4y2Ba,{G.ydF4y2Ba“观察”G.ydF4y2Ba},criticOptions);G.ydF4y2Ba
行动者网络的输出是车辆处于某一状态时采取每种可能转向动作的概率。创建参与者深度神经网络。G.ydF4y2Ba
actorNetwork = [featureInputLayer(numObservations,G.ydF4y2Ba“正常化”G.ydF4y2Ba那G.ydF4y2Ba'没有'G.ydF4y2Ba那G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“观察”G.ydF4y2Ba)全连接列(128,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“fc1”G.ydF4y2Ba)剥离(G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba'relu1'G.ydF4y2Ba)全连接列(128,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“取得”G.ydF4y2Ba)剥离(G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“relu2”G.ydF4y2Ba)fullyConnectedLayer(numActions,G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2BaoutG.ydF4y2Ba)softmaxlayer(G.ydF4y2Ba'名字'G.ydF4y2Ba那G.ydF4y2Ba“actionProb”G.ydF4y2Ba)];G.ydF4y2Ba
为PPO代理创建一个随机演员表示。有关更多信息,请参阅G.ydF4y2BarlStochasticActorRepresentationG.ydF4y2Ba
.G.ydF4y2Ba
actorOptions = rlRepresentationOptions (G.ydF4y2Ba'学习'G.ydF4y2Ba2的军医,G.ydF4y2Ba'gradientthreshold'G.ydF4y2Ba1);演员= rlStochasticActorRepresentation (actorNetwork observationInfo actionInfo,G.ydF4y2Ba...G.ydF4y2Ba“观察”G.ydF4y2Ba,{G.ydF4y2Ba“观察”G.ydF4y2Ba},actorOptions);G.ydF4y2Ba
指定代理选项并创建PPO剂。有关PPO代理选项的详细信息,请参阅G.ydF4y2Barlppoagentoptions.G.ydF4y2Ba
.G.ydF4y2Ba
agentOpts = rlPPOAgentOptions (G.ydF4y2Ba...G.ydF4y2Ba'SampleTime'G.ydF4y2BaTs,G.ydF4y2Ba...G.ydF4y2Ba'ExperienceHorizon'G.ydF4y2Ba,200,G.ydF4y2Ba...G.ydF4y2Ba'ClipFactor'G.ydF4y2Ba,0.2,G.ydF4y2Ba...G.ydF4y2Ba'entropylossweight'G.ydF4y2Ba,0.01%,G.ydF4y2Ba...G.ydF4y2Ba“MiniBatchSize”G.ydF4y2Ba, 64,G.ydF4y2Ba...G.ydF4y2Ba'NumEpoch'G.ydF4y2Ba,3,G.ydF4y2Ba...G.ydF4y2Ba'AdvantageEstimateMethod'G.ydF4y2Ba那G.ydF4y2Ba“GAE”G.ydF4y2Ba那G.ydF4y2Ba...G.ydF4y2Ba'Gafactor'G.ydF4y2Ba,0.95,G.ydF4y2Ba...G.ydF4y2Ba'贴花因子'G.ydF4y2Ba, 0.998);代理= rlPPOAgent(演员、评论家、agentOpts);G.ydF4y2Ba
在培训期间,代理商收集经验,直到它到达200个步骤的经验范围或剧集终止,然后从三个时期的迷你批次出发的迷你批次进行列车。目标函数剪辑因子为0.2提高训练稳定性,折扣系数值为0.998鼓励长期奖励。评估评价的差异由GAE因子为0.95的广义优势估计方法减少。G.ydF4y2Ba
在此示例中,您将代理培训最多10000次剧集,每个集发作持续最多200个时间步长。培训何时达到最大剧集数或超过100次发作的平均奖励超过100时。G.ydF4y2Ba
指定使用培训的选项G.ydF4y2BarlTrainingOptionsG.ydF4y2Ba
对象。G.ydF4y2Ba
训练= rltrainingOptions(G.ydF4y2Ba...G.ydF4y2Ba'MaxEpisodes'G.ydF4y2Ba,10000,G.ydF4y2Ba...G.ydF4y2Ba'MaxStepsPerEpisode'G.ydF4y2Ba,200,G.ydF4y2Ba...G.ydF4y2Ba'scoreaveragingwindowlength'G.ydF4y2Ba,200,G.ydF4y2Ba...G.ydF4y2Ba'plots'G.ydF4y2Ba那G.ydF4y2Ba“训练进步”G.ydF4y2Ba那G.ydF4y2Ba...G.ydF4y2Ba'stoptrinaincriteria'G.ydF4y2Ba那G.ydF4y2Ba'AverageReward'G.ydF4y2Ba那G.ydF4y2Ba...G.ydF4y2Ba“StopTrainingValue”G.ydF4y2Ba, 80);G.ydF4y2Ba
使用列车上的代理G.ydF4y2Ba训练G.ydF4y2Ba
函数。培训本剂是一种计算密集型过程,需要几分钟才能完成。为了节省时间运行这个例子而,装载由设置一个预训练的剂G.ydF4y2Ba用圆形G.ydF4y2Ba
来G.ydF4y2Ba假G.ydF4y2Ba
.自己训练代理人,设置G.ydF4y2Ba用圆形G.ydF4y2Ba
来G.ydF4y2Ba真正的G.ydF4y2Ba
.G.ydF4y2Ba
doTraining = false;G.ydF4y2Ba如果G.ydF4y2Badotraining trainingstats =火车(代理,env,训练);G.ydF4y2Ba别的G.ydF4y2Ba负载(G.ydF4y2Ba'rlAutoParkingValetAgent.mat'G.ydF4y2Ba那G.ydF4y2Ba“代理”G.ydF4y2Ba);G.ydF4y2Ba结束G.ydF4y2Ba
仿真该模型,将车辆停放在自由车位上。为了模拟车辆在不同的位置停车,在下面的代码中更改空闲位置。G.ydF4y2Ba
FreeSpotidx = 7;G.ydF4y2Ba%空闲点位置G.ydF4y2BaSIM(MDL);G.ydF4y2Ba
车辆在+/- 0.75米(位置)和+/- 10度(方向)的指定误差公差内达到目标姿势。G.ydF4y2Ba
要查看本车的位置和方向,打开自我车辆姿态范围。G.ydF4y2Ba