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

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

Обзор

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

Установите случайный seed и сконфигурируйте параметры модели.

% 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 сигналами безопасности являются скорость ego-автомобиля v и относительное расстояние d между эго-машиной и ведущей машиной. В этом примере ограничения для этих сигналов 10v30.5 и d5. Ограничения зависят от следующих состояний в x: ego автомобиль фактическое ускорение, скорость ego автомобиль, относительное расстояние, и скорость свинцового автомобиля.

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

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

Блок Constraint Enforcement принимает ограничения формы fx+gxuc. В данном примере коэффициенты этой ограничительной функции следующие.

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 Agent состоит в том, чтобы гарантировать, что модели окружения, строения сигналов действия и наблюдения и функция сброса модели, используемые во время набора данных, совпадают с теми, которые используются во время последующего обучения агента.

Случайный сигнал внешнего действия равномерно распределен в области значений [-10,6]; то есть эго-автомобиль имеет максимальную степень торможения -10 m/s ^ 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 автомобиль фактическое ускорение

  • Команда ускорения Ego

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

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

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

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

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

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

В данном примере динамика ego-автомобиля и свинцового автомобиля линейная. Поэтому можно найти решение методом наименьших квадратов для ограничений сигнала безопасности; то есть, 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 с помощью этой модели. Спецификация действия такая же, как и для окружения ограничения-обучения. Для обучения существует три наблюдения от окружения: интеграл ошибки скорости, ошибка скорости и скорость ego-car.

Подсистема Окружения генерирует isDone сигнал, когда критические ограничения нарушены - Либо ego автомобиль имеет отрицательную скорость (движется назад), либо относительное расстояние меньше нуля (ego автомобиль сталкивается с ведущим автомобилем). Агент 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

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

Поскольку общее количество шагов равняется продукту числа эпизодов и шагов эпизодов, каждый эпизод тренировки запусков до конца без раннего прекращения. Поэтому блок Constraint Enforcement гарантирует, что ego car никогда не нарушает критические ограничения.

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

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

См. также

Блоки

Похожие темы