强化学习实战-训练PPO智能体完成自动泊车

  在此示例中,通过自动泊车算法执行一系列操作,同时感应并避开狭窄空间中的障碍物。 它在自适应MPC控制器和RL智能体之间切换,以完成停车操作。 MPC控制器以恒定速度沿参考路径移动车辆,而算法则搜索空的停车位。 找到一个地点后,RL智能体会接管并执行预先训练的停车操作。 控制器可以获取有关环境(停车场)的先验知识,包括空旷地点和停放的车辆的位置。  

停车场

  停车场由ParkingLot类表示,该类存储有关自我车辆,空停车位和静态障碍物(停放的汽车)的信息。 每个停车位都有一个唯一的索引号和一个绿色(空闲)或红色(已占用)的指示灯。 停放的车辆以黑色表示。 测试代码使用matlab2020b。 创建一个在位置7有空闲点的ParkingLot对象。  

freeSpotIdx = 7;
map = ParkingLot(freeSpotIdx);

  为车辆指定一个初始姿态(X_0,Y_0,θ_0)。当车辆导航该停车场时,根据第一个可用的空闲位置确定目标姿态。  

egoInitialPose = [20, 15, 0];

  使用createTargetPose函数计算车辆的目标姿态。目标姿态对应于freeSpotIdx中的位置。  

egoTargetPose = createTargetPose(map,freeSpotIdx)

  在matlab中显示    

传感器模块

  该停车算法使用摄像头和激光雷达传感器从环境中收集信息。  

摄像头

  下图中以绿色阴影表示的区域表示了安装在自驾车上的摄像头的视野。 摄像机的视场φ以±60°度为边界,最大测量深度为d。     当汽车向前移动时,摄像模块感知视野内的停车位,并确定某个停车位是空的还是被占用的。为了简单起见,这个动作是使用点位置和当前车辆姿态之间的几何关系来实现的。当d_i\leq d_{max}φ_{min}\leq φ_i\leq φ_{max}时,一个车位在摄像机的范围内,其中d_i为到车位的距离,φ_i为到车位的角度。  

雷达

  强化学习智能体使用激光雷达传感器读数来确定车辆与环境中其他车辆的距离。本例中的激光雷达传感器也采用几何关系建模。激光雷达的距离沿着从车辆中心呈放射状出现的12条线段进行测量。当激光雷达线与障碍物相交时,它返回障碍物与车辆的距离。沿任意线段的最大可测激光雷达距离为 6m 。    

自动泊车模型

  在Simulink中实现了泊车模型,包括控制器、车辆、传感器和停车场。 加载自动泊车参数。  

autoParkingValetParams

  打开Simulink模型。  

mdl = 'rlAutoParkingValet';
open_system(mdl)

  需要花费一点时间。     该模型中的车辆动力学由具有两个输入的单轨自行车模型表示:车速v(m / s)和转向角δ(弧度)。 MPC和RL控制器放置在“启用子系统”模块中,该模块由表示车辆是否必须搜索空位或执行停车操作的信号激活。 启用信号由“车辆模式”子系统中的“摄像头”算法确定。 最初,车辆处于搜索模式,MPC控制器跟踪参考路径。 当找到空位时,将激活停车模式,并且RL智能体执行停车操作。  

自适应模型预测控制器

  使用createMPCForParking脚本创建自适应的MPC控制器对象,用于参考轨迹跟踪。  

createMPCForParking

强化学习环境

  训练RL智能体的环境是下图中用红色阴影显示的区域。 由于停车场中的对称性,在对该区域应用适当的坐标转换后,对该区域内的训练足以使该策略适应其他区域。 与在整个停车场内进行训练相比,使用此较小的训练区域可显着减少训练时间。     对于这个环境: 1.训练区域是一个22.5 m \times 20 m的空间,目标点位于其水平中心。 2.观测到的是相对于目标位姿的车辆的位置误差X_eY_e,真实航向角θ的正弦和余弦,以及激光雷达传感器读数。 3.停车期间的车速恒定为 2 m / s。 4.动作信号是离散的转向角,范围为+/- 45度,步长为15度。 5.如果目标姿态的误差在+/- 0.75 m(位置)和+/- 10度(方向)的规定公差内,则认为车辆已停车。 6.如果车辆超出训练区域的边界,与障碍物碰撞或成功停放,则该 episode 终止。 7.在时间t提供的奖励r_t为     其中,X_e, Y_e, θ_e为车相对于目标位姿的位置和航向角误差,δ为转向角。f_t(0或1)表示车辆是否已停车,g_t(0或1)表示车辆在t时刻是否与障碍物发生碰撞。   不同车位位姿(X,Y,θ)观测的坐标变换如下:     创建环境的观察和动作规范。  

numObservations = 16;
observationInfo = rlNumericSpec([numObservations 1]);
observationInfo.Name = 'observations';

steerMax = pi/4;
discreteSteerAngles = -steerMax : deg2rad(15) : steerMax;
actionInfo = rlFiniteSetSpec(num2cell(discreteSteerAngles));
actionInfo.Name = 'actions';
numActions = numel(actionInfo.Elements);

  创建Simulink环境接口,并指定RL Agent块的路径。  

blk = [mdl '/RL Controller/RL Agent'];
env = rlSimulinkEnv(mdl,blk,observationInfo,actionInfo);

  为训练指定一个复位函数。autoParkingValetResetFcn函数在每个episode开始时将汽车的初始姿态重置为随机值。  

env.ResetFcn = @autoParkingValetResetFcn;

创建智能体

  在此示例中,RL智能体是具有离散操作空间的近端策略优化(PPO)智能体。 PPO智能体依靠行动器和批判器的代表来学习最佳策略。 该智能体为行动器和批判器维护基于深度神经网络的函数逼近器。 为重现性设置随机种子发生器。  

rng(0)

  要创建批判器表示,首先创建一个有16个输入和一个输出的深度神经网络。批评网络的输出是一个特定观察的状态值函数。  

criticNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','observations')
    fullyConnectedLayer(128,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(128,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(128,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')];

  为PPO智能体创建批判器。  

criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
critic = rlValueRepresentation(criticNetwork,observationInfo,...
    'Observation',{'observations'},criticOptions);

  行动器网络的输出是车辆处于某一状态时采取每一种可能转向动作的概率。创建actor深度神经网络。  

actorNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','observations')
    fullyConnectedLayer(128,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(128,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(numActions, 'Name', 'out')
    softmaxLayer('Name','actionProb')];

  为PPO智能体创建一个随机行动器表示。  

actorOptions = rlRepresentationOptions('LearnRate',2e-4,'GradientThreshold',1);
actor = rlStochasticActorRepresentation(actorNetwork,observationInfo,actionInfo,...
    'Observation',{'observations'},actorOptions);

  指定智能体选项并创建PPO智能体。  

agentOpts = rlPPOAgentOptions(...
    'SampleTime',Ts,...
    'ExperienceHorizon',200,...
    'ClipFactor',0.2,... 
    'EntropyLossWeight',0.01,...
    'MiniBatchSize',64,...
    'NumEpoch',3,...
    'AdvantageEstimateMethod',"gae",...
    'GAEFactor',0.95,...
    'DiscountFactor',0.998);
agent = rlPPOAgent(actor,critic,agentOpts);

  在训练期间,智能体会收集经验,直到达到200步的经验水平或 episode 终止,然后从64个经验的mini-batches中训练三个epochs。 客观函数限幅因子0.2改善了训练的稳定性,折扣因子值0.998鼓励了长期奖励。 批判器的差异通过广义优势估计法以0.95的GAE系数降低了产出。  

训练智能体

  在此示例中,您训练代理最多10000个 episode ,每个 episode 最多持续200个时间步长。 当达到最大 episode 数或超过100个 episode 的平均奖励超过100时,训练终止。 使用rlTrainingOptions对象指定训练选项。  

trainOpts = rlTrainingOptions(...
    'MaxEpisodes',10000,...
    'MaxStepsPerEpisode',200,...
    'ScoreAveragingWindowLength',200,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',80);

  使用Train函数对智能体进行训练。训练这个智能体是一个计算密集型的过程,需要几分钟才能完成。为了在运行这个示例时节省时间,可以通过将doTraining设置为false来加载一个预先训练过的智能体。要自己训练智能体,请将doTraining设置为true。  

doTraining = false;
if doTraining
    trainingStats = train(agent,env,trainOpts);
else
    load('rlAutoParkingValetAgent.mat','agent');
end

仿真

  对该模型将车辆停放在自由停车位进行测试。要测试车辆在不同位置的停车,请在下面的代码中更改自由泊位位置。  

freeSpotIdx = 7;  % free spot location
sim(mdl);

  车辆在指定的误差容差+/- 0.75 m(位置)和+/- 10度(方向)内达到目标姿态。   要查看车辆的位置和方向,请打开“Ego Vehicle Pose scope”。