В этом примере показано, как обучить агента обучения с подкреплением (RL) хранению маршрута помогает (LKA) с ограничениями, осуществленными с помощью с блоком Constraint Enforcement.
В этом примере цель состоит в том, чтобы сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрута путем корректировки переднего руководящего угла. Этот пример использует ту же модель транспортного средства и параметры, как Обучение Агента DQN для Хранения Маршрута Помогает Используя Параллельные вычисления (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
модель. Эта модель применяет случайные внешние действия через блок RL Agent к среде.
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 не генерирует действия. Вместо этого это сконфигурировано, чтобы передать случайное внешнее действие среде. Цель для использования модели сбора данных с неактивным блоком 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)
Чтобы просмотреть ограничительную реализацию, откройте Ограничительную подсистему. Здесь, модель генерирует значения и от линейных ограничительных отношений. Эти значения наряду с ограничительными границами отправляются в блок Constraint Enforcement.
Создайте среду RL с помощью этой модели. Спецификации наблюдений и спецификации действия эквивалентны для ограничительной среды обучения.
Подсистема Среды создает isDone
сигнал, который является true
когда боковое отклонение превышает заданное ограничение. Блок RL Agent использует этот сигнал отключить эпизоды тренировки рано.
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);
Задайте опции для обучения агент. Обучите агента самое большее 5 000 эпизодов. Остановите обучение, если вознаграждение эпизода превышает –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