В этом примере показано, как обучить агента обучения с подкреплением (RL) для помощника по хранению маршрута (LKA) с ограничениями, применяемыми с помощью блока с ограничениями.
В этом примере цель состоит в том, чтобы сохранить автомобиль , оборудованный датчиком, перемещающийся по осевой линии маршрута, путем регулировки угла поворота переднего руля. Этот пример использует ту же модель и параметры транспортного средства, что и пример Train DQN Agent for Lane Keeping Assist Using Parallel Computing (Reinforcement Learning Toolbox).
Установите случайный seed и сконфигурируйте параметры модели.
% set random seed rng(0); % paramters 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 = 0.1; % sample time (s) T = 15; % duration (s) rho = 0.001; % road curvature (1/m) e1_initial = 0.2; % initial lateral deviation from center line (m) e2_initial = -0.1; % initial yaw angle error (rad) steerLimit = 0.2618;% maximum steering angle for driver comfort (rad)
В этом примере функция ограничения, применяемая блоком Constraint Enforcement, неизвестна. Чтобы узнать функцию, необходимо сначала собрать обучающие данные из окружения.
Для этого сначала создайте окружение RL с помощью rlLearnConstraintLKA
модель. Эта модель применяет случайные внешние действия через блок Агент к окружению.
mdl = 'rlLearnConstraintLKA';
open_system(mdl)
Наблюдения от окружения являются боковым отклонением, относительным углом рыскания e2, их производными и их интегралами. Создайте непрерывное пространство наблюдений для этих шести сигналов.
obsInfo = rlNumericSpec([6 1]);
Действие от блока RL Agent является углом рулевого управления спереди, который может взять одно из 31 возможных значений от -15 до 15 степеней. Создайте дискретное пространство действий для этого сигнала.
actInfo = rlFiniteSetSpec((-15:15)*pi/180);
Создайте окружение RL для этой модели.
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
Задайте функцию сброса, которая случайным образом инициализирует боковое отклонение и относительный угол рыскания в начале каждого эпизода тренировки или симуляции.
env.ResetFcn = @(in)localResetFcn(in);
Затем создайте агента обучения с подкреплением DQN, который поддерживает дискретные действия и непрерывные наблюдения, используя createDQNAgentLKA
вспомогательная функция. Эта функция создает представление критика на основе действия и спецификаций наблюдений и использует представление для создания агента DQN.
agent = createDQNAgentLKA(Ts,obsInfo,actInfo);
В rlLearnConstraintLKA
модель, блок Агент не генерирует действия. Вместо этого он сконфигурирован для передачи случайного внешнего действия в окружение. Цель использования модели сбора данных с неактивным блоком RL Agent состоит в том, чтобы гарантировать, что модели окружения, строения сигналов действия и наблюдения и функция сброса модели, используемые во время набора данных, совпадают с теми, которые используются во время последующего обучения агента.
В этом примере сигнал безопасности является боковым отклонением . Ограничение для этого сигнала является ; то есть расстояние от осевой линии маршрута должно быть меньше 1. Ограничение зависит от состояний в : боковое отклонение и его производная, ошибка угла рыскания и его производная. Действие - передний угол рулевого управления. Отношения от состояний к боковому отклонению описываются следующим уравнением.
Чтобы позволить некоторое ослабление, установите максимальное боковое расстояние равным 0,9.
Блок Constraint Enforcement принимает ограничения формы . Для вышеприведенного уравнения и ограничений коэффициенты ограничительной функции:
Чтобы узнать неизвестные функции и агент RL передает случайное внешнее действие окружению, которая равномерно распределена в области значений [-0.2618,0.2618].
Чтобы собрать данные, используйте collectDataLKA
вспомогательная функция. Эта функция моделирует окружение и агента и собирает получившиеся входные и выходные данные. Получившиеся обучающие данные имеют восемь столбцов, первые шесть из которых являются наблюдениями для агента RL.
Интеграл бокового отклонения
Боковое отклонение
Интеграл ошибки угла рыскания
Ошибка угла рыскания
Производная от бокового отклонения
Производная ошибки угла рыскания
Угол поворота руля
Боковое отклонение на следующем временном шаге
В данном примере загружает предварительно собранные обучающие данные. Чтобы собрать данные самостоятельно, установите collectData
на true
.
collectData = false; if collectData count = 1050; data = collectDataLKA(env,agent,count); else load trainingDataLKA data end
В данном примере динамика эго-автомобиля линейная. Поэтому можно найти решение методом наименьших квадратов для ограничений бокового отклонения.
Линейные приближения могут быть применены, чтобы узнать неизвестные функции и .
% Extract state and input data. inputData = data(1:1000,[2,5,4,6,7]); % Extract data for the lateral deviation in the next time step. outputData = data(1:1000,8); % Compute the relation from the state and input to the lateral deviation. relation = inputData\outputData; % Extract the components of the constraint function coefficients. Rf = relation(1:4)'; Rg = relation(5);
Проверьте выученные ограничения с помощью validateConstraintACC
вспомогательная функция. Эта функция обрабатывает входные обучающие данные, используя выученные ограничения. Затем он сравнивает вывод сети с выходом обучения и вычисляет корневую среднеквадратичную ошибку (RMSE).
validateConstraintLKA(data,Rf,Rg);
Test Data RMSE = 8.569169e-04
Маленькое значение RMSE указывает на успешное обучение с ограничениями.
Чтобы обучить агента с ограничениями, используйте rlLKAWithConstraint
модель. Эта модель ограничивает действия от агента перед применением их к окружению.
mdl = 'rlLKAwithConstraint';
open_system(mdl)
Чтобы просмотреть реализацию ограничений, откройте Подсистему ограничений. Здесь модель генерирует значения и от линейных ограничительных уравнений. Эти значения вместе с ограничениями отправляются в блок «Принудительное применение ограничений».
Создайте окружение RL с помощью этой модели. Спецификации действия те же, что и для окружения ограничения-обучения.
Подсистема Окружения создает isDone
сигнал, который true
когда боковое отклонение превышает заданное ограничение. Блок Агент использует этот сигнал для раннего завершения эпизодов тренировки.
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);
Укажите опции для настройки агента. Обучите агента на самое большее 5000 эпизодов. Остановите обучение, если вознаграждение эпизода превышает -1.
maxepisodes = 5000; maxsteps = ceil(T/Ts); trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue',-1);
Обучите агента. Обучение является длительным процессом. В данном примере загружает предварительно обученный агент. Чтобы обучить агента самостоятельно, установите trainAgent
на true
.
trainAgent = false; if trainAgent trainingStats = train(agent,env,trainingOpts); else load rlAgentConstraintLKA agent end
Следующий рисунок показывает результаты обучения.
Поскольку общее количество шагов равняется продукту числа эпизодов и шагов эпизодов, каждый эпизод тренировки запусков до конца без раннего прекращения. Поэтому блок Constraint Enforcement гарантирует, что боковое отклонение никогда не нарушает его ограничений.
Запустите обученного агента и просмотрите результаты симуляции.
e1_initial = -0.4; e2_initial = 0.2; sim(mdl)
bdclose('rlLearnConstraintLKA') bdclose('rlLKAwithConstraint')
function in = localResetFcn(in) % Set initial lateral deviation to random value. in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % Set initial relative yaw angle to random value. in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); end