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

Этот пример использует обучение с подкреплением на основе глубокой детерминированной политики (DDPG) для разработки стратегии для мобильного робота, чтобы избежать препятствий. Краткие сводные данные алгоритма DDPG смотрите в Deep Deterministic Policy Gradient Agents (Reinforcement 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.

Интерфейс окружения

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

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

agentBlk = mdl + "/Agent";

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

open_system(mdl)

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

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

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 (Reinforcement Learning Toolbox). Задайте модель, имя блока агента, параметры наблюдения и параметры действия. Установите функцию сброса для симуляции используя exampleHelperRLAvoidObstaclesResetFcn. Эта функция перезапускает симуляцию, поместив робота в новое случайное место, чтобы начать избегать препятствий.

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

Для другого примера, который настраивает окружение Simulink ® для обучения, смотрите Создать окружение Simulink и Обучить Агента (Reinforcement Learning Toolbox).

Агент DDPG

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

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 (Reinforcement Learning Toolbox).

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

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

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

Наконец, создайте актёра так же, как и критика. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation (Reinforcement Learning Toolbox).

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 объект. The obstacleAvoidanceAgent переменная используется в модели для Agent блок.

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

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

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

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

Обучите агента

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

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

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

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

Для получения дополнительной информации смотрите rlTrainingOptions (Reinforcement Learning Toolbox).

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

Обучите агента с помощью train (Reinforcement Learning Toolbox) функция. Обучение является интенсивным в вычислительном отношении процессом, который занимает несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки 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.

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

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

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

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.