exponenta event banner

Агент поезда DQN для помощи по поддержанию полосы движения

В этом примере показано, как обучить агента сети глубокого Q-обучения (DQN) для помощи в поддержании полосы движения (LKA) в Simulink ®. Дополнительные сведения об агентах DQN см. в разделе Агенты Deep Q-Network.

Модель Simulink для Ego Car

Среда обучения усилению для этого примера представляет собой простую модель велосипеда для динамики эго-транспортных средств. Цель обучения заключается в удержании эго-транспортного средства, движущегося вдоль осевой линии полос движения, путем регулировки угла поворота переднего руля. В этом примере используется та же модель транспортного средства, что и в системе помощи при удержании полосы движения с использованием управления прогнозом модели (панель инструментов управления прогнозом модели). Динамика эго-автомобиля определяется следующими параметрами.

m = 1575;   % total vehicle mass (kg)
Iz = 2875;  % yaw moment of inertia (mNs^2)
lf = 1.2;   % 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)
Vx = 15;    % longitudinal velocity (m/s)

Определение времени выборки Ts и продолжительность моделирования T в секундах.

Ts = 0.1;
T = 15;

Выходной сигнал системы LKA - угол переднего рулевого управления эго-автомобиля. Чтобы смоделировать физические ограничения эго-автомобиля, ограничьте угол рулевого управления диапазоном [-0.5,0.5] рад.

u_min = -0.5;
u_max = 0.5;

Кривизна дороги определяется постоянной величиной 0,001 (м-1). Начальное значение бокового отклонения составляет 0,2 м, а начальное значение относительного угла рыскания -0,1 рад.

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

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

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

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

  • Сигнал действия угла поворота от агента к окружающей среде составляет от -15 градусов до 15 градусов.

  • Наблюдениями из окружающей среды являются боковое отклонение e1, относительный угол рыскания e2, их производные e˙1 и e˙2, а также их интегралы ∫e1 и ∫e2.

  • Моделирование завершается, когда боковое отклонение | e1 | > 1.

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

rt = - (10e12+5e22+2u2+5e˙12+5e˙22)

где u - управляющий вход с предыдущего временного шага t-1.

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

Создайте интерфейс среды обучения для ego-транспортного средства. Для этого сначала создайте спецификации наблюдения и действий.

observationInfo = rlNumericSpec([6 1],'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1));
observationInfo.Name = 'observations';
observationInfo.Description = 'information on lateral deviation and relative yaw angle';
actionInfo = rlFiniteSetSpec((-15:15)*pi/180);
actionInfo.Name = 'steering';

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

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

Интерфейс имеет пространство дискретных действий, где агент может применить один из 31 возможных углов поворота от -15 градусов до 15 градусов. Наблюдение представляет собой шестимерный вектор, содержащий боковое отклонение, относительный угол рыскания, а также их производные и интегралы относительно времени.

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

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

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

rng(0)

Создание агента DQN

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

Агенты DQN могут использовать многовыходные критические аппроксиматоры Q-значений, которые обычно более эффективны. Многоотходный аппроксиматор имеет наблюдения в качестве входных данных и значения действия состояния в качестве выходных данных. Каждый выходной элемент представляет собой ожидаемое совокупное долгосрочное вознаграждение за принятие соответствующего дискретного действия из состояния, указанного входами наблюдения.

Для создания критика сначала создать глубокую нейронную сеть с одним входом (шестимерное наблюдаемое состояние) и одним выходным вектором с 31 элементом (равномерно разнесенные углы поворота от -15 до 15 градусов). Дополнительные сведения о создании глубокого представления функции значений нейронной сети см. в разделе Создание представлений политик и функций значений.

nI = observationInfo.Dimension(1);  % number of inputs (6)
nL = 24;                            % number of neurons
nO = numel(actionInfo.Elements);    % number of outputs (31)

dnn = [
    featureInputLayer(nI,'Normalization','none','Name','state')
    fullyConnectedLayer(nL,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(nL,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(nO,'Name','fc3')];

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

figure
plot(layerGraph(dnn))

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

Укажите параметры критического представления с помощью rlRepresentationOptions.

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

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

critic = rlQValueRepresentation(dnn,observationInfo,actionInfo,...
    'Observation',{'state'},criticOptions);

Для создания агента DQN сначала укажите параметры агента DQN с помощью rlDQNAgentOptions.

agentOptions = rlDQNAgentOptions(...
    'SampleTime',Ts,...
    'UseDoubleDQN',true,...
    'TargetSmoothFactor',1e-3,...
    'DiscountFactor',0.99,...
    'ExperienceBufferLength',1e6,...
    'MiniBatchSize',64);

Затем создайте агент DQN, используя указанное представление критика и параметры агента. Дополнительные сведения см. в разделе rlDQNAgent.

agent = rlDQNAgent(critic,agentOptions);

Агент поезда

Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции:

  • Запускать каждый учебный эпизод максимум для 5000 эпизодов, причем каждый эпизод длится максимум ceil(T/Ts) временные шаги.

  • Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots опция для training-progress) и отключите отображение командной строки (установите Verbose опция для false).

  • Прекратить обучение, когда доходит награда за эпизод –1.

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше –2.5.

Дополнительные сведения см. в разделе rlTrainingOptions.

maxepisodes = 5000;
maxsteps = ceil(T/Ts);
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue',-1,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',-2.5);

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

doTraining = false;

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

Моделирование агента DQN

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

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

Для демонстрации обучаемого агента на детерминированных начальных условиях смоделируйте модель в Simulink.

e1_initial = -0.4;
e2_initial = 0.2;
sim(mdl)

Как показывают графики, боковая ошибка (верхний график) и относительный угол рыскания (средний график) приводятся в движение близко к нулю. Транспортное средство начинается от осевой линии (-0,4 м) и с ненулевой погрешностью угла рыскания (0,2 рад). Помощь по поддержанию полосы делает эго-автомобиль двигаться вдоль осевой линии примерно через 2,5 секунды. Угол поворота (нижний график) показывает, что контроллер достигает устойчивого состояния примерно через 2 секунды.

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

if ~doTraining
    %bdclose(mdl)
end

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

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

См. также

Связанные темы