Обучите агента DQN для помощи по поддержанию маршрута

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

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

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

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 является угол наклона переднего руля эго-автомобиля. Чтобы симулировать физические ограничения ego-автомобиля, ограничьте угол поворота руля области значений [-0.5,0.5] рад.

u_min = -0.5;
u_max = 0.5;

Кривизна дороги определяется константой 0,001 (m-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.

Создайте интерфейс окружения

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

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

См. также

Похожие темы