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

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

Модель Simulink

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

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), временную погрешность (ы) и заданную драйвером скорость (м/с).

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

Чтобы симулировать физические ограничения динамики аппарата, ограничьте ускорение области значений [–3,2] (m/s ^ 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 рад).

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

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

  • Симуляция заканчивается, когда боковое отклонение |e1|>1, когда продольная скорость Vego<0.5, или когда относительное расстояние между головным автомобилем и ego автомобилем 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 временные шаги.

  • Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите 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 (м) опережает эго-автомобиль.

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

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

  • От 42 до 58 секунд ego-автомобиль отслеживает заданную скорость (график справа сверху), и ускорение остается нулем (график слева сверху).

  • От 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

См. также

Похожие темы