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