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

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

Модель Simulink

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

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.

% create the observation info
observationInfo = rlNumericSpec([9 1],'LowerLimit',-inf*ones(9,1),'UpperLimit',inf*ones(9,1));
observationInfo.Name = 'observations';
% action Info
actionInfo = rlNumericSpec([2 1],'LowerLimit',[-3;-0.2618],'UpperLimit',[2;0.2618]);
actionInfo.Name = 'accel;steer';
% define environment
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);

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

% randomize initial positions of lead car, lateral deviation and relative
% yaw angle
env.ResetFcn = @(in)localResetFcn(in);

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

rng(0)

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

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

L = 100; % number of neurons
statePath = [
    imageInputLayer([9 1 1],'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 = [
    imageInputLayer([2 1 1],'Normalization','none','Name','action')
    fullyConnectedLayer(L,'Name','fc5')];

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

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

figure
plot(criticNetwork)

Задайте опции для представления критика с помощью 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 = [
    imageInputLayer([9 1 1],'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',reshape([2.5;0.2618],[1,1,2]),'Bias',reshape([-0.5;0],[1,1,2]))];
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.Variance = [0.6;0.1];
agentOptions.NoiseOptions.VarianceDecayRate = 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 pretrained agent for the example.
    load('SimulinkPFCDDPG.mat','agent')       
end

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

Чтобы подтвердить производительность обученного агента, не прокомментируйте следующие две линии и симулируйте ее в среде. Для получения дополнительной информации о симуляции агента смотрите 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 секунд относительное расстояние становится меньше, чем безопасное расстояние (правый нижний график), таким образом автомобиль эго замедляется и отслеживает ведущую скорость.

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

Модель Close Simulink.

bdclose(mdl)

Локальная функция

function in = localResetFcn(in)
% reset 
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

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

Похожие темы