exponenta event banner

Избегайте препятствий с помощью обучения усилению для мобильных роботов

В этом примере используется обучение усилению на основе Deep Deterministic Policy Gradient (DDPG) для разработки стратегии для мобильного робота, чтобы избежать препятствий. Краткое описание алгоритма DDPG см. в разделе Deep Deterministic Policy Gradient Agents (Enhancement Learning Toolbox).

В этом примере сценарий обучает мобильного робота избегать препятствий, заданных датчиками дальности, которые обнаруживают препятствия на карте. Целью алгоритма обучения усилению является изучение того, какие средства управления (линейную и угловую скорость) робот должен использовать, чтобы избежать столкновения с препятствиями. В этом примере используется карта занятости известной среды для формирования показаний датчика дальности, обнаружения препятствий и проверки столкновений, которые может производить робот. Показания датчика дальности являются наблюдениями для агента DDPG, а управление линейной и угловой скоростью - действием.

Карта загрузки

Загрузите матрицу карты, simpleMap, которая представляет среду для робота.

load exampleMaps simpleMap 
load exampleHelperOfficeAreaMap office_area_map
mapMatrix = simpleMap;
mapScale = 1;

Параметры датчика диапазона

Затем настройте rangeSensor объект, имитирующий датчик шумового диапазона. Показания датчиков дальности считаются наблюдениями агента. Определите угловое положение показаний диапазона, максимальный диапазон и параметры шума.

scanAngles = [-3*pi/8 : pi/8 :3*pi/8];
maxRange = 12;
lidarNoiseVariance = 0.1^2;
lidarNoiseSeeds = randi(intmax,size(scanAngles));

Параметры робота

Действие агента представляет собой двумерный вектор a = [v, λ], где v и λ - линейные и угловые скорости нашего робота. Агент DDPG использует нормализованные входы как для угловых, так и для линейных скоростей, что означает, что действия агента являются скаляром между -1 и 1, который умножается наmaxLinSpeed и maxAngSpeed параметры для получения фактического контроля. Укажите максимальную линейную и угловую скорость.

Также укажите исходное положение робота как [x y theta].

% Max speed parameters
maxLinSpeed = 0.3;
maxAngSpeed = 0.3;

% Initial pose of the robot
initX = 17;
initY = 15;
initTheta = pi/2;

Показать положение карты и робота

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

fig = figure("Name","simpleMap");
set(fig, "Visible", "on");
ax = axes(fig);

show(binaryOccupancyMap(mapMatrix),"Parent",ax);
hold on
plotTransforms([initX, initY, 0], eul2quat([initTheta, 0, 0]), "MeshFilePath","groundvehicle.stl", "View", "2D");
light;
hold off

Figure simpleMap contains an axes. The axes with title Binary Occupancy Grid contains 5 objects of type patch, line, image.

Интерфейс среды

Создайте модель среды, которая выполняет действие и выдает сигналы наблюдения и вознаграждения. Укажите предоставленное имя модели примера, напримерampleHelperAvoidObstaclesMobileRobot, параметры времени моделирования и имя блока агента.

mdl = "exampleHelperAvoidObstaclesMobileRobot";
Tfinal = 100;
sampleTime = 0.1;

agentBlk = mdl + "/Agent";

Откройте модель.

open_system(mdl)

Модель содержит Environment и Agent блоки. Agent блок еще не определен.

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

open_system(mdl + "/Environment")

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

obsInfo = rlNumericSpec([numel(scanAngles) 1],...
    "LowerLimit",zeros(numel(scanAngles),1),...
    "UpperLimit",ones(numel(scanAngles),1)*maxRange);
numObservations = obsInfo.Dimension(1);

Определение параметров действий, actInfo. Действие представляет собой управляющий командный вектор, a = [v, λ], нормализованный к [-1,1].

numActions = 2;
actInfo = rlNumericSpec([numActions 1],...
    "LowerLimit",-1,...
    "UpperLimit",1);

Построение объекта интерфейса среды с помощью rlSimulinkEnv(Панель инструментов для обучения усилению). Укажите модель, имя блока агента, параметры наблюдения и параметры действия. Установка функции сброса для моделирования с помощью exampleHelperRLAvoidObstaclesResetFcn. Эта функция перезапускает моделирование, помещая робота в новое случайное положение, чтобы начать избегать препятствий.

env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);
env.ResetFcn = @(in)exampleHelperRLAvoidObstaclesResetFcn(in,scanAngles,maxRange,mapMatrix);
env.UseFastRestart = "Off";

Другой пример настройки среды Simulink ® для обучения см. в разделе Создание среды Simulink и агента обучения (инструментарий обучения по усилению).

Агент DDPG

Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдениям и действиям, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом. Дополнительные сведения о создании представления функции значений глубоких нейронных сетей см. в разделе Создание представлений функций политик и значений (панель обучения усилению).

statePath = [
    featureInputLayer(numObservations, "Normalization", "none", "Name", "State")
    fullyConnectedLayer(50, "Name", "CriticStateFC1")
    reluLayer("Name", "CriticRelu1")
    fullyConnectedLayer(25, "Name", "CriticStateFC2")];
actionPath = [
    featureInputLayer(numActions, "Normalization", "none", "Name", "Action")
    fullyConnectedLayer(25, "Name", "CriticActionFC1")];
commonPath = [
    additionLayer(2,"Name", "add")
    reluLayer("Name","CriticCommonRelu")
    fullyConnectedLayer(1, "Name", "CriticOutput")];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
criticNetwork = connectLayers(criticNetwork,"CriticStateFC2","add/in1");
criticNetwork = connectLayers(criticNetwork,"CriticActionFC1","add/in2");

Затем задайте параметры критического представления с помощью rlRepresentationOptions(Панель инструментов для обучения усилению).

Наконец, создайте критическое представление, используя заданную глубокую нейронную сеть и опции. Необходимо также указать параметры действий и наблюдения для критика, которые будут получены из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation(Панель инструментов для обучения усилению).

criticOpts = rlRepresentationOptions("LearnRate",1e-3,"L2RegularizationFactor",1e-4,"GradientThreshold",1);
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,"Observation",{'State'},"Action",{'Action'},criticOpts);

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

Наконец, построить актера в такой же манере, как критик. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation(Панель инструментов для обучения усилению).

actorNetwork = [
    featureInputLayer(numObservations, "Normalization", "none", "Name", "State")
    fullyConnectedLayer(50, "Name", "actorFC1")
    reluLayer("Name","actorReLU1")
    fullyConnectedLayer(50, "Name", "actorFC2")
    reluLayer("Name","actorReLU2")
    fullyConnectedLayer(2, "Name", "actorFC3")
    tanhLayer("Name", "Action")];


actorOptions = rlRepresentationOptions("LearnRate",1e-4,"L2RegularizationFactor",1e-4,"GradientThreshold",1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,"Observation",{'State'},"Action",{'Action'},actorOptions);

Создание объекта агента DDPG

Укажите параметры агента.

agentOpts = rlDDPGAgentOptions(...
    "SampleTime",sampleTime,...
    "TargetSmoothFactor",1e-3,...
    "DiscountFactor",0.995, ...
    "MiniBatchSize",128, ...
    "ExperienceBufferLength",1e6); 

agentOpts.NoiseOptions.Variance = 0.1;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;

Создать rlDDPGAgent объект. obstacleAvoidanceAgent используется в модели для Agent блок.

obstacleAvoidanceAgent = rlDDPGAgent(actor,critic,agentOpts);
open_system(mdl + "/Agent")

Вознаграждение

Функция вознаграждения для агента смоделирована, как показано на рисунке.

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

Агент поезда

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

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

  • Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и включите отображение командной строки (установите Verbose значение true).

  • Прекратите обучение, когда агент получит среднее совокупное вознаграждение более 400 в течение пятидесяти последовательных эпизодов.

Дополнительные сведения см. в разделе rlTrainingOptions(Панель инструментов для обучения усилению).

maxEpisodes = 10000;
maxSteps = ceil(Tfinal/sampleTime);
trainOpts = rlTrainingOptions(...
    "MaxEpisodes",maxEpisodes, ...
    "MaxStepsPerEpisode",maxSteps, ...
    "ScoreAveragingWindowLength",50, ...
    "StopTrainingCriteria","AverageReward", ...
    "StopTrainingValue",400, ...
    "Verbose", true, ...
    "Plots","training-progress");

Обучение агента с помощью train(Панель инструментов обучения для усиления). Обучение - это ресурсоемкий процесс, который занимает несколько минут. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.

doTraining = false; % Toggle this to true for training. 

if doTraining
    % Train the agent.
    trainingStats = train(obstacleAvoidanceAgent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load exampleHelperAvoidObstaclesAgent obstacleAvoidanceAgent
end

Менеджер обучающих эпизодов с усилением может использоваться для отслеживания хода обучения по эпизодам. По мере увеличения номера эпизода вы хотите видеть увеличение стоимости вознаграждения.

Моделировать

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

out = sim("exampleHelperAvoidObstaclesMobileRobot.slx");

Визуализировать

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

for i = 1:5:size(out.range, 3)
    u = out.pose(i, :);
    r = out.range(:, :, i);
    exampleHelperAvoidObstaclesPosePlot(u, mapMatrix, mapScale, r, scanAngles, ax);
end

Figure simpleMap contains an axes. The axes with title Binary Occupancy Grid contains 6 objects of type patch, line, image.

Расширяемость

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

Изменение карты

mapMatrix = office_area_map.occupancyMatrix > 0.5;
mapScale = 10;
initX = 20;
initY = 30;
initTheta = 0;
fig = figure("Name","office_area_map");
set(fig, "Visible", "on");
ax = axes(fig);
show(binaryOccupancyMap(mapMatrix, mapScale),"Parent",ax);
hold on
plotTransforms([initX, initY, 0], eul2quat([initTheta, 0, 0]), "MeshFilePath","groundvehicle.stl", "View", "2D");
light;
hold off

Figure office_area_map contains an axes. The axes with title Binary Occupancy Grid contains 5 objects of type patch, line, image.

Моделировать

out = sim("exampleHelperAvoidObstaclesMobileRobot.slx");

Визуализировать

for i = 1:5:size(out.range, 3)
    u = out.pose(i, :);
    r = out.range(:, :, i);
    exampleHelperAvoidObstaclesPosePlot(u, mapMatrix, mapScale, r, scanAngles, ax);
end

Figure office_area_map contains an axes. The axes with title Binary Occupancy Grid contains 6 objects of type patch, line, image.