Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) для управления по пути (PFC) в Simulink ®. Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики.
Окружение обучения с подкреплением для этого примера является простой моделью велосипеда для эго-автомобиля и простой продольной моделью для свинцового автомобиля. Цель обучения состоит в том, чтобы заставить эго-автомобиль перемещаться с заданной скоростью при сохранении безопасного расстояния от свинцового автомобиля путем управления продольным ускорением и торможением, а также при сохранении эго-автомобиля, перемещающегося по осевой линии своей полосы путем управления углом наклона переднего руля. Для получения дополнительной информации о 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 (). Начальное значение для бокового отклонения составляет 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-автомобиля определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, эго-вагон отслеживает минимум скорости свинцового вагона и установленной водителем скорости. Таким образом эго-машина сохраняет некоторое расстояние от головной машины. Если относительное расстояние больше безопасного расстояния, ego-автомобиль отслеживает заданную водителем скорость. В этом примере безопасное расстояние определяется как линейная функция продольной скорости ego-автомобиля , то есть, . Безопасное расстояние определяет скорость отслеживания для эго-автомобиля.
Наблюдения от окружения содержат продольные измерения: ошибка скорости , его интеграл , и продольная скорость ego-автомобиля . В сложении наблюдения содержат боковые измерения: боковое отклонение , относительный угол рыскания , их производные и , и их интегралы и .
Симуляция заканчивается, когда боковое отклонение , когда продольная скорость , или когда относительное расстояние между головным автомобилем и ego автомобилем .
Вознаграждение , предоставляется в каждый временной шаг является
где является управляющим входом от предыдущего временного шага , - вход ускорения от предыдущего временного шага. Три логических значения следующие.
если симуляция прекращена, в противном случае
если боковая ошибка , в противном случае
если ошибка скорости , в противном случае
Три логических условия в вознаграждении побуждают агента сделать как боковую ошибку, так и ошибку скорости маленькими, и тем временем наказать агента, если симуляция прекращена раньше.
Создайте интерфейс окружения для модели 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 аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают политику и представления функции ценности.
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)
Задайте опции для представления критика используя 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
Чтобы подтвердить производительность обученного агента, симулируйте агент в окружение 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