Обучите агента DDPG управлению следования траектории

В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) управлению следования траектории (PFC) в Simulink®. Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики.

Модель Simulink

Среда обучения с подкреплением для этого примера является простой моделью велосипеда для автомобиля эго и простой продольной моделью для ведущего автомобиля. Цель обучения должна сделать автомобильное перемещение эго при скорости набора при поддержании безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением, и также при хранении автомобиля эго, перемещающегося вдоль средней линии его маршрута путем управления передним руководящим углом. Для получения дополнительной информации о PFC смотрите Систему управления Следования траектории (Model Predictive Control Toolbox). Автомобильные движущие силы эго заданы следующими параметрами.

m = 1600;   % total vehicle mass (kg)
Iz = 2875;  % yaw moment of inertia (mNs^2)
lf = 1.4;   % longitudinal distance from center of gravity to front tires (m)
lr = 1.6;   % longitudinal distance from center of gravity to rear tires (m)
Cf = 19000; % cornering stiffness of front tires (N/rad)
Cr = 33000; % cornering stiffness of rear tires (N/rad)
tau = 0.5;  % longitudinal time constant

Задайте исходное положение и скорость для этих двух транспортных средств.

x0_lead = 50;   % initial position for lead car (m)
v0_lead = 24;   % initial velocity for lead car (m/s)
x0_ego = 10;    % initial position for ego car (m)
v0_ego = 18;    % initial velocity for ego car (m/s)

Задайте значение по умолчанию бездействия, располагающее с интервалами (m), разрыв (разрывы) времени и скорость набора драйверов (m/s).

D_default = 10;
t_gap = 1.4;
v_set = 28;

Чтобы симулировать физические ограничения динамики аппарата, ограничьте ускорение к области значений [–3,2] (м/с^2) и держащийся угол ограничиваются быть [–0.5,0.5] (рад).

amin_ego = -3;
amax_ego = 2;
umin_ego = -0.5;
umax_ego = 0.5;

Искривление дороги задано постоянными 0.001 (m-1). Начальное значение для бокового отклонения составляет 0,2 м, и начальное значение для относительного угла рыскания является –0.1 рад.

rho = 0.001;
e1_initial = 0.2;
e2_initial = -0.1;

Задайте шаг расчета Ts и длительность симуляции Tf в секундах.

Ts = 0.1;
Tf = 60;

Откройте модель.

mdl = 'rlPFCMdl';
open_system(mdl)
agentblk = [mdl '/RL Agent'];

Для этой модели:

  • Сигнал действия состоит из ускорения и держащихся угловых действий. Ускоряющий сигнал действия принимает значение между –3 и 2 (м/с^2). Держащийся сигнал действия принимает значение между –15 градусами (–0.2618 рад) и 15 градусов (0,2618 рад).

  • Ссылочная скорость для автомобиля эго Vref определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, трамвайные пути эго минимум ведущей автомобильной скорости и скорости набора драйверов. Этим способом автомобиль эго обеспечивает некоторое расстояние от ведущего автомобиля. Если относительное расстояние больше безопасного расстояния, трамвайные пути эго скорость набора драйверов. В этом примере безопасное расстояние задано как линейная функция автомобиля эго продольная скорость V, то есть, tgap*V+Ddefault. Безопасное расстояние определяет скорость отслеживания для автомобиля эго.

  • Наблюдения средой содержат продольные измерения: ошибка скорости eV=Vref-Vego, его интеграл e, и автомобиль эго продольная скорость V. Кроме того, наблюдения содержат боковые измерения: боковое отклонение e1, относительный угол рыскания e2, их производные e˙1 и e˙2, и их интегралы e1 и e2.

  • Симуляция завершает работу когда боковое отклонение |e1|>1, когда продольная скорость Vego<0.5, или когда относительное расстояние между ведущим автомобилем и автомобилем эго Drel<0.

  • Вознаграждение rt, если на каждом временном шаге t,

rt=-(100e12+500ut-12+10eV2+100at-12)×1e-3-10Ft+2Ht+Mt

где ut-1 руководящий вход от предыдущего временного шага t-1, at-1 ускоряющий вход от предыдущего временного шага. Три логических значения следующие.

  • Ft=1если симуляция отключена в противном случае Ft=0

  • Ht=1 если боковая ошибка e12<0.01 , в противном случае Ht=0

  • Mt=1 если ошибка скорости eV2<1, в противном случае Mt=0

Три логических условия в вознаграждении поощряют агента совершать и боковую ошибку и небольшую ошибку скорости, и тем временем, штрафовать агента, если симуляция отключена рано.

Создайте интерфейс среды

Создайте интерфейс среды для модели Simulink.

Создайте спецификацию наблюдений.

observationInfo = rlNumericSpec([9 1],'LowerLimit',-inf*ones(9,1),'UpperLimit',inf*ones(9,1));
observationInfo.Name = 'observations';

Создайте спецификацию действия.

actionInfo = rlNumericSpec([2 1],'LowerLimit',[-3;-0.2618],'UpperLimit',[2;0.2618]);
actionInfo.Name = 'accel;steer';

Создайте интерфейс среды.

env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);

Чтобы задать начальные условия, задайте функцию сброса среды использование указателя анонимной функции. Функция сброса localResetFcn, то, которое задано в конце примера, рандомизирует исходное положение ведущего автомобиля, бокового отклонения и относительного угла рыскания.

env.ResetFcn = @(in)localResetFcn(in);

Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.

rng(0)

Создайте агента DDPG

Агент DDPG аппроксимирует долгосрочные премиальные заданные наблюдения и действия при помощи представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают Представления Функции ценности и политика.

L = 100; % number of neurons
statePath = [
    featureInputLayer(9,'Normalization','none','Name','observation')
    fullyConnectedLayer(L,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(L,'Name','fc2')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu2')
    fullyConnectedLayer(L,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')];

actionPath = [
    featureInputLayer(2,'Normalization','none','Name','action')
    fullyConnectedLayer(L,'Name','fc5')];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
    
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');

Просмотрите конфигурацию сети критика.

figure
plot(criticNetwork)

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика с помощью rlRepresentationOptions.

criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',1e-4);

Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation.

critic = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);

Агент DDPG решает который действие взять заданные наблюдения при помощи представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выходом, действием.

Создайте агента так же критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation.

actorNetwork = [
    featureInputLayer(9,'Normalization','none','Name','observation')
    fullyConnectedLayer(L,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(L,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(L,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(2,'Name','fc4')
    tanhLayer('Name','tanh1')
    scalingLayer('Name','ActorScaling1','Scale',[2.5;0.2618],'Bias',[-0.5;0])];
actorOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'ActorScaling1'},actorOptions);

Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions.

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',64);
agentOptions.NoiseOptions.StandardDeviation = [0.6;0.1];
agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-5;

Затем создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent.

agent = rlDDPGAgent(actor,critic,agentOptions);

Обучите агента

Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:

  • Запустите каждый эпизод тренировки для в большей части 10000 эпизоды, с каждым эпизодом, длящимся в большей части maxsteps временные шаги.

  • Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Verbose и Plots опции.

  • Остановите обучение, когда агент получит совокупное вознаграждение эпизода, больше, чем 1700.

Для получения дополнительной информации смотрите rlTrainingOptions.

maxepisodes = 1e4;
maxsteps = ceil(Tf/Ts);
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue',1700);

Обучите агента с помощью train функция. Обучение является в вычислительном отношении интенсивным процессом, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining к false. Чтобы обучить агента самостоятельно, установите doTraining к true.

doTraining = false;

if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOpts);
else
    % Load a pretrained agent for the example.
    load('SimulinkPFCDDPG.mat','agent')       
end

Симулируйте агента DDPG

Чтобы подтвердить производительность обученного агента, симулируйте агента в окружении Simulink путем некомментария следующих команд. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

% simOptions = rlSimulationOptions('MaxSteps',maxsteps);
% experience = sim(env,agent,simOptions);

Чтобы продемонстрировать обученного агента с помощью детерминированных начальных условий, симулируйте модель в Simulink.

e1_initial = -0.4;
e2_initial = 0.1;
x0_lead = 80;
sim(mdl)

Следующие графики показывают результаты симуляции, когда ведущий автомобиль 70 (m) перед автомобилем эго.

  • За первые 35 секунд относительное расстояние больше безопасного расстояния (нижний правый график), таким образом, трамвайные пути эго скорость набора (верхний правый график). Чтобы убыстриться и достигнуть скорости набора, ускорение является в основном неотрицательным (верхний левый график).

  • С 35 до 42 секунд относительное расстояние в основном меньше безопасного расстояния (нижний правый график), таким образом, трамвайные пути эго минимум ведущей скорости и скорости набора. Поскольку ведущая скорость меньше скорости набора (верхний правый график), чтобы отследить ведущую скорость, ускорение становится ненулевым (верхний левый график).

  • С 42 до 58 секунд трамвайные пути эго скорость набора (верхний правый график) и ускорение остается нуль (верхний левый график).

  • С 58 до 60 секунд относительное расстояние становится меньше, чем безопасное расстояние (нижний правый график), таким образом, автомобиль эго замедляется и отслеживает ведущую скорость.

  • Нижний левый график показывает боковое отклонение. Как показано в графике, боковое отклонение значительно уменьшено в течение 1 секунды. Боковое отклонение остается меньше чем 0,05 м.

Закройте модель Simulink.

bdclose(mdl)

Функция сброса

function in = localResetFcn(in) 
in = setVariable(in,'x0_lead',40+randi(60,1,1));    % random value for initial position of lead car
in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % random value for lateral deviation
in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); % random value for relative yaw angle
end

Смотрите также

Похожие темы