В этом примере показано, как обучить агента обучения усилению (RL) для помощи по поддержанию полосы движения (LKA) ограничениям, применяемым с помощью блока «Применение ограничений» (Constraint Enforcement).
В этом примере цель заключается в удержании эго-транспортного средства, движущегося вдоль осевой линии полосы движения, путем регулировки угла поворота переднего рулевого управления. В этом примере используется та же модель транспортного средства и те же параметры, что и в примере "Train DQN Agent for Lane Keeping Assist Using Parallel Computing" ("Training DQN Agent for Lane Keeping Assist Using Parallel Computing
Задайте случайное начальное значение и настройте параметры модели.
% 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)
В этом примере функция ограничения, выполняемая блоком «Применение ограничения», неизвестна. Для изучения функции необходимо сначала собрать данные обучения из среды.
Для этого сначала создайте среду RL с помощью rlLearnConstraintLKA модель. Эта модель применяет к среде случайные внешние действия через блок агента RL.
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 является обеспечение соответствия модели среды, конфигураций сигналов действий и наблюдений и функции сброса модели, используемой во время сбора данных, тем, которые используются во время последующего обучения агента.
В этом примере сигнал безопасности представляет собой боковое отклонение . Ограничение для этого сигнала - e1≤1; то есть расстояние от осевой линии полосы движения должно быть меньше 1. Ограничение зависит от состояний в x: боковое отклонение и его производная, погрешность угла рыскания и его производная. Действие u представляет собой передний угол поворота рулевого управления. Отношения от состояний к боковому отклонению описываются следующим уравнением.
g (xk) uk
Чтобы обеспечить некоторое ослабление, установите максимальное боковое расстояние равным 0,9.
Блок «Применение ограничений» принимает ограничения формы. Для вышеприведенного уравнения и ограничений коэффициенты функции ограничения:
, c = [0,90.9]
Чтобы узнать неизвестные функции и , агент RL передает случайное внешнее действие в среду, которая равномерно распределена в диапазоне [-.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 с помощью этой модели. Характеристики наблюдения и действия те же, что и для среды обучения ограничениям.
Подсистема Environment создает isDone сигнал, который является true если боковое отклонение превышает заданное ограничение. Блок агента RL использует этот сигнал для раннего завершения обучающих эпизодов.
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