В этом примере показано, как обучить нескольких агентов совместно выполнять управление по пути (PFC) для транспортного средства. Цель PFC состоит в том, чтобы заставить автомобиль , оборудованный датчиком перемещаться с заданной скоростью при сохранении безопасного расстояния от головного автомобиля путем управления продольным ускорением и торможением, а также при сохранении автомобиля, перемещающегося по осевой линии своей полосы движения, путем управления углом наклона переднего руля. Для получения дополнительной информации о PFC, смотрите Путь после системы управления (Model Predictive Control Toolbox).
Пример, который обучает агента обучения с подкреплением для выполнения PFC, показан в Train DDPG Agent for Path-Following Control. В этом примере один агент глубокого детерминированного градиента политики (DDPG) обучен управлять как продольной скоростью, так и боковым управлением автомобиля , оборудованного датчиком. В этом примере вы обучаете двух агентов обучения с подкреплением - агент DDPG обеспечивает непрерывные значения ускорения для продольного цикла управления, а агент глубокой Q-сети (DQN) обеспечивает дискретные значения угла поворота для бокового цикла управления.
Обученные агенты выполняют PFC через совместное поведение и достигают удовлетворительных результатов.
В окружение для этого примера входит простая модель велосипеда для эго-автомобиля и простая продольная модель для свинцового автомобиля. Цель обучения состоит в том, чтобы заставить эго-автомобиль перемещаться с заданной скоростью при сохранении безопасного расстояния от свинцового автомобиля путем управления продольным ускорением и торможением, а также удерживать эго-автомобиль движущимся вдоль осевой линии своей полосы путем управления углом наклона переднего руля.
Загрузите параметры окружения.
multiAgentPFCParams
Откройте модель Simulink.
mdl = "rlMultiAgentPFC";
open_system(mdl)
В этой модели два агента обучения с подкреплением (RL Agent1 и RL Agent2) обеспечивают сигналы продольного ускорения и угла поворота, соответственно.
Симуляция прекращается, когда происходит любое из следующих условий.
(величина бокового отклонения превышает 1)
(продольная скорость эго-вагона падает ниже 0,5.
(расстояние между ego и свинцовой машиной ниже нуля)
Для продольного контроллера (RL Agent1):
Исходная скорость для ego-автомобиля определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, эго-вагон отслеживает минимум скорости свинцового вагона и установленной водителем скорости. Таким образом эго-машина сохраняет некоторое расстояние от головной машины. Если относительное расстояние больше безопасного расстояния, ego-автомобиль отслеживает заданную водителем скорость. В этом примере безопасное расстояние определяется как линейная функция продольной скорости ego-автомобиля , то есть, . Безопасное расстояние определяет скорость отслеживания для эго-автомобиля.
Наблюдения от окружения содержат продольные измерения: ошибка скорости , его интеграл , и продольная скорость ego-автомобиля .
Сигнал действия состоит из значений непрерывного ускорения от -3 до 2 м/с ^ 2.
Вознаграждение , предоставляется в каждый временной шаг является
Вот, является входом ускорения от предыдущего временного шага и:
если симуляция прекращена, в противном случае .
если , в противном случае .
Для бокового контроллера (RL Agent2):
Наблюдения от окружения содержат боковые измерения: боковое отклонение , относительный угол рыскания , их производные и , и их интегралы и .
Сигнал действия состоит из дискретных действий угла поворота, которые берут значения от -15 степеней (-0,2618 рад) до 15 степеней (0,2618 рад) в шагах 1 степень (0,0175 рад).
Вознаграждение , предоставляется в каждый временной шаг является
Вот, является управляющим входом от предыдущего временного шага, является входом ускорения от предыдущего временного шага и:
если симуляция прекращена, в противном случае .
, в противном случае .
Логические условия в функциях вознаграждения (, , и ) штрафовать агентов, если симуляция прекращается раньше, в то же время побуждая агентов сделать и латеральную ошибку, и ошибку скорости маленькими.
Создайте наблюдения и спецификации действия для продольных циклов управления.
obsInfo1 = rlNumericSpec([3 1]); actInfo1 = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2);
Создайте наблюдения и спецификации действия для боковых циклов управления.
obsInfo2 = rlNumericSpec([6 1]); actInfo2 = rlFiniteSetSpec((-15:15)*pi/180);
Объедините наблюдение и спецификации действия как массив ячеек.
obsInfo = {obsInfo1,obsInfo2}; actInfo = {actInfo1,actInfo2};
Создайте интерфейс окружения Simulink, задав пути блоков для обоих блоков агента. Порядок путей к блокам должен совпадать с порядком массивов ячеек наблюдений и спецификацией действия.
blks = mdl + ["/RL Agent1", "/RL Agent2"]; env = rlSimulinkEnv(mdl,blks,obsInfo,actInfo);
Задайте функцию сброса для окружения, используя ResetFcn
свойство. Функция pfcResetFcn
случайным образом устанавливает начальные положения ведущих и автомобилей , оборудованных датчиком в начале каждого эпизода во время обучения.
env.ResetFcn = @pfcResetFcn;
В данном примере вы создаете двух агентов обучения с подкреплением. Во-первых, исправьте случайный seed для воспроизводимости.
rng(0)
Оба агента работают в одном и том же шаге расчета в этом примере. Установите значение шага расчета (в секундах).
Ts = 0.1;
Агент для продольного цикла управления является агентом DDPG. Агент DDPG аппроксимирует долгосрочное вознаграждение, заданное наблюдения и действия, используя представление функции ценности критика и выбирает действия, используя представление политики актёра. Для получения дополнительной информации о создании функции ценности глубокой нейронной сети и представлений политики, смотрите, Создают представления политики и функции ценности.
Используйте createCCAgent
функция для создания агента DDPG для продольного управления. Структура этого агента подобна примеру Train DDPG Agent for Adaptive Cruise Control.
agent1 = createACCAgent(obsInfo1,actInfo1,Ts);
Агент для бокового цикла управления является агентом DQN. Агент DQN аппроксимирует долгосрочное вознаграждение, заданное наблюдениями и действиями, используя представление функции ценности критика.
Используйте createLKAAgent
функция для создания агента DQN для бокового управления. Структура этого агента подобна примеру Train DQN Agent for Lane Keeping Assist.
agent2 = createLKAAgent(obsInfo2,actInfo2,Ts);
Задайте опции обучения. В данном примере используйте следующие опции.
Запускайте каждый эпизод тренировки самое большее для 5000 эпизодов с каждым эпизодом, длящимся самое большее maxsteps
временные шаги.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Verbose
и Plots
опции).
Остановите обучение агентов DDPG и DQN, когда они получат среднее вознаграждение, больше 480 и 1195, соответственно. Когда один агент достигает своих критериев остановки, он моделирует свою собственную политику, не обучаясь, в то время как другой агент продолжает обучение.
Tf = 60; % simulation time maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',[480,1195]);
Обучите агентов, используя train
функция. Обучение этих агентов является интенсивным в вычислительном отношении процессом, который занимает несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train([agent1,agent2],env,trainingOpts); else % Load pretrained agents for the example. load('rlPFCAgents.mat') end
Следующий рисунок показывает моментальный снимок процесса обучения для этих двух агентов.
Чтобы подтвердить эффективность обученных агентов, симулируйте агентов в окружение Simulink, отключив следующие команды. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,[agent1, agent2],simOptions);
Чтобы продемонстрировать обученного агента с помощью детерминированных начальных условий, симулируйте модель в Simulink.
e1_initial = -0.4; e2_initial = 0.1; x0_lead = 80; sim(mdl)
Следующие графики показывают результаты, когда головной автомобиль опережает ego автомобиль на 70 м в начале симуляции.
Головной автомобиль периодически изменяет скорость с 24 м/с до 30 м/с (правый верхний график). ego car поддерживает безопасное расстояние на протяжении всей симуляции (нижний правый график).
От 0 до 30 секунд ego-автомобиль отслеживает заданную скорость (график справа сверху) и испытывает некоторое ускорение (график слева сверху). После этого ускорение уменьшается до 0.
На левом нижнем графике показано боковое отклонение. Как показано на графике, боковое отклонение значительно уменьшается в течение 1 секунды. Боковое отклонение остается меньше 0,1 м.