exponenta event banner

Подготовка агента RL для адаптивного круиз-контроля с применением ограничений

В этом примере показано, как обучить агента обучения усилению (RL) адаптивному круиз-контролю (ACC) с использованием управляемого исследования с помощью блока «Обеспечение ограничений».

Обзор

В этом примере целью является обеспечение движения эго-автомобиля с заданной скоростью при сохранении безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением. В этом примере используются те же модели транспортных средств и те же параметры, что и в примере Train DDPG Agent for Adaptive Cruise Control (Achimentation Learning Toolbox).

Задайте случайное начальное значение и настройте параметры модели.

% set random seed
rng('default')
% parameters
x0_lead = 50;   % initial position for lead car (m)
v0_lead = 25;   % initial velocity for lead car (m/s)
x0_ego = 10;    % initial position for ego car (m)
v0_ego = 20;    % initial velocity for ego car (m/s)
D_default = 10; % default spacing (m)
t_gap = 1.4;    % time gap (s)
v_set = 30;     % driver-set velocity (m/s)
amin_ego = -3;  % minimum acceleration for driver comfort (m/s^2)
amax_ego = 2;   % maximum acceleration for driver comfort (m/s^2)
Ts = 0.1;       % sample time (s)     
Tf = 60;        % duration (s)

Изучение уравнения ограничения

Для приложения ACC сигналами безопасности являются скорость v эго-автомобиля и относительное расстояние d между эго-автомобилем и ведущим автомобилем. В этом примере ограничения для этих сигналов являются 10≤v≤30.5 и d≥5. Ограничения зависят от следующих состояний в x: фактическое ускорение эго-автомобиля, скорость эго-автомобиля, относительное расстояние и скорость ведущего автомобиля.

Действие u - это команда ускорения эго-автомобиля. Следующее уравнение описывает сигналы безопасности в терминах действия и состояний.

[vk + 1dk + 1] = [f1 (xk) f2 (xk)] + [g1 (xk) g2 (xk)] uk

Блок «Применение ограничений» принимает ограничения fx+gxu≤c формы. Для этого примера коэффициенты этой функции ограничения следующие.

fx = [-f1 (xk) -f2 (xk) f1 (xk)], gx = [-g1 (xk) -g2 (xk) g1 (xk)], c = [-10-530.5]

Для изучения неизвестных функций fi и gi необходимо сначала собрать данные обучения из среды. Для этого сначала создайте среду RL с помощью rlLearnConstraintACC модель.

mdl = 'rlLearnConstraintACC';
open_system(mdl)

В этой модели блок агента RL не генерирует действия. Вместо этого он конфигурируется для передачи случайного внешнего действия в среду. Целью использования модели сбора данных с неактивным блоком агента RL является обеспечение соответствия модели среды, конфигураций сигналов действий и наблюдений и функции сброса модели, используемой во время сбора данных, тем, которые используются во время последующего обучения агента.

Сигнал случайного внешнего воздействия равномерно распределяется в диапазоне [-10,6]; то есть эго-автомобиль имеет максимальную тормозную мощность -10 м/с ^ 2 и максимальную ускорительную мощность 6 м/с ^ 2.

Для обучения четырьмя наблюдениями из окружающей среды являются относительное расстояние между транспортными средствами, скорости свинцовых и эго-автомобилей и ускорение эго-автомобилей. Определите непрерывное пространство наблюдения для этих значений.

obsInfo = rlNumericSpec([4 1]);

Действием, выводимым агентом, является команда ускорения. Создайте соответствующее непрерывное пространство действий с ограничениями ускорения.

actInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2);

Создайте среду RL для этой модели. Укажите функцию сброса, чтобы задать случайное положение ведущего автомобиля в начале каждого учебного эпизода или моделирования.

agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Затем создайте агент обучения усилению DDPG, который поддерживает непрерывные действия и наблюдения, используя createDDPGAgentBACC функция помощника. Эта функция создает представления критиков и актеров на основе спецификаций действий и наблюдений и использует представления для создания агента DDPG.

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);

Для сбора данных используйте collectDataACC функция помощника. Эта функция моделирует среду и агента и собирает результирующие входные и выходные данные. Полученные данные обучения содержат девять столбцов.

  • Относительное расстояние между вагонами

  • Скорость ведущего вагона

  • Скорость эго-автомобиля

  • Фактическое ускорение автомобиля Ego

  • Команда Ego acceleration

  • Относительное расстояние между автомобилями на следующем шаге времени

  • Скорость ведущего автомобиля на следующем шаге

  • Скорость автомобиля Ego на следующем шаге времени

  • Фактическое ускорение автомобиля Ego на следующем шаге времени

В этом примере выполняется загрузка предварительно собранных учебных данных. Чтобы собрать данные самостоятельно, установите collectData кому true.

collectData = false;
if collectData
    count = 1000;
    data = collectDataACC(env,agent,count);
else
    load trainingDataACC data
end

Для этого примера динамика эго-автомобиля и ведущего автомобиля линейна. Поэтому можно найти решение с наименьшими квадратами для ограничений сигнала безопасности; то есть v = RvI и d = RdI, где I - [xk; uk].

% Extract state and input data.
I = data(1:1000,[4,3,1,2,5]);
% Extract data for the relative distance in the next time step
d = data(1:1000,6);
% Compute the relation from the state and input to relative distance.
Rd = I\d;
% Extract data for actual ego car velocity.
v = data(1:1000,8);
% Compute the relation from the state and input to ego car velocity.
Rv = I\v;

Проверка изученных ограничений с помощью validateConstraintACC функция помощника. Эта функция обрабатывает входные учебные данные с использованием изученных ограничений. Затем он сравнивает сетевой выход с учебным и вычисляет корневую среднеквадратичную ошибку (RMSE).

validateConstraintACC(data,Rd,Rv)
Test Data RMSE for Relative Distance  = 8.118162e-04
Test Data RMSE for Ego Velocity = 3.798159e-15

Небольшие значения RMSE указывают на успешное изучение ограничений.

Подготовка агента с применением ограничений

Для обучения агента применению ограничений используйте rlACCwithConstraint модель. Эта модель ограничивает команду ускорения от агента перед ее применением в среде.

mdl = 'rlACCwithConstraint';
open_system(mdl)

Чтобы просмотреть реализацию ограничения, откройте подсистему ограничения. Здесь модель генерирует значения fi и gi из уравнений линейных ограничений. Эти значения вместе с границами ограничений отправляются в блок «Применение ограничений».

Создайте среду RL с помощью этой модели. Спецификация действия та же, что и для среды обучения ограничениям. Для обучения существует три наблюдения из окружающей среды: интеграл ошибки скорости, ошибки скорости и скорости эго-вагона.

Подсистема Environment генерирует isDone сигнал при нарушении критических ограничений - Либо эго-автомобиль имеет отрицательную скорость (движется назад), либо относительное расстояние меньше нуля (эго-автомобиль сталкивается с ведущим автомобилем). Агент RL использует этот сигнал для раннего завершения обучающих эпизодов.

obsInfo = rlNumericSpec([3 1]);
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Поскольку параметры наблюдения отличаются для обучения, необходимо также создать новый агент DDPG.

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);

Укажите параметры обучения агента. Тренируйте агента максимум на 5000 эпизодов. Прекратите обучение, если награда за эпизод превышает 260.

maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue',260);

Тренируйте агента. Обучение занимает много времени. В этом примере следует загрузить предварительно обученный агент. Чтобы обучить агента самостоятельно, установите trainAgent кому true.

trainAgent = false;
if trainAgent
    trainingStats = train(agent,env,trainingOpts);
else
    load rlAgentConstraintACC agent
end

На следующем рисунке показаны результаты обучения.

Поскольку общее количество шагов равно произведению номера эпизода и шагов эпизода, каждый учебный эпизод проходит до конца без досрочного прекращения. Поэтому блок «Применение ограничений» гарантирует, что эго-автомобиль никогда не нарушает критических ограничений.

Запустите обученного агента и просмотрите результаты моделирования.

x0_lead = 80;
sim(mdl)

Агент поезда без ограничений

Чтобы увидеть преимущества обучения агента с применением ограничений, можно обучить агента без ограничений и сравнить результаты обучения со случаем применения ограничений.

Для обучения агента без ограничений используйте rlACCwithoutConstraint модель. Эта модель применяет действия от агента непосредственно к среде, и агент использует те же действия и спецификации наблюдения.

mdl = 'rlACCwithoutConstraint';
open_system(mdl)

Создайте среду RL с помощью этой модели.

agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Создайте новый агент DDPG для обучения. Этот агент имеет ту же конфигурацию, что и агент, использовавшийся в предыдущем обучении.

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);

Обучение агента с использованием тех же параметров обучения, что и в случае применения ограничений. Для этого примера, как и при предыдущем обучении, загрузите предварительно обученного агента. Чтобы обучить агента самостоятельно, установите trainAgent к true.

trainAgent = false;
if trainAgent
    trainingStats2 = train(agent,env,trainingOpts);
else
    load rlAgentACC agent
end

На следующем рисунке показаны результаты обучения.

Так как общее количество шагов меньше, чем произведение номера эпизода и шагов эпизода, обучение включает эпизоды, которые были досрочно прекращены из-за нарушений ограничений.

Запустите обученного агента и постройте график результатов моделирования.

x0_lead = 80;
sim(mdl)

bdclose('rlLearnConstraintACC')
bdclose('rlACCwithConstraint')
bdclose('rlACCwithoutConstraint')

Функция локального сброса

function in = localResetFcn(in)
% Reset the initial position of the lead car.
in = setVariable(in,'x0_lead',40+randi(60,1,1));
end

См. также

Блоки

Связанные темы