Обучите агента DDPG управлять летающим роботом

В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) генерировать траектории для летающего робота, смоделированного в Simulink®. Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики (Reinforcement Learning Toolbox).

Полет моделью робота

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

Откройте модель и начальную букву настройки переменные модели.

mdl = 'rlFlyingRobotEnv';
open_system(mdl)

% initial model state variables
theta0 = 0;
x0 = -15;
y0 = 0;

% sample time
Ts = 0.4;

% simulation length
Tf = 30;

Для этой модели:

  • Целевой ориентацией является 0 радианы (направление робота на восток).

  • Тяга от каждого привода ограничена от -1 к 1 N

  • Наблюдения средой являются положением, ориентация (синус и косинус ориентации), скорость и скорость вращения робота.

  • Вознаграждение rt, если на каждом временном шаге:

r1=10((xt2+yt2+θt2)<0.5)

r2=-100(|xt|20 |||yt|20)

r3=-(0.2(Rt-1+Lt-1)2 +0.3(Rt-1-Lt-1)2+0.03xt2+0.03yt2+0.02θt2)

rt=r1+r2+r3

где:

  • xt положение робота вдоль оси X.

  • yt положение робота вдоль оси Y.

  • θt ориентация робота.

  • Lt-1 усилие по управлению от левого ускорителя.

  • Rt-1 усилие по управлению от правильного ускорителя.

  • r1 вознаграждение, когда робот близко к цели.

  • r2 штраф, когда робот управляет вне 20 m или в x или в направлении Y. Симуляция отключена когда r2<0.

  • r3 штраф QR, который штрафует расстояние от усилия по управлению и цели.

Создайте интегрированную модель

Обучать агента FlyingRobotEnv модель, используйте createIntegratedEnv функционируйте, чтобы автоматически сгенерировать интегрированную модель с блоком RL Agent, который готов к обучению.

integratedMdl = 'IntegratedFlyingRobot';
[~,agentBlk,observationInfo,actionInfo] = createIntegratedEnv(mdl,integratedMdl);

Действия и наблюдения

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

Сигналы наблюдения для этой среды наблюдение=[xyx˙y˙sin(θ)потому что(θ)θ˙]T.

numObs = prod(observationInfo.Dimension);
observationInfo.Name = 'observations';

Сигналы действия для этой среды действие=[TRTL]T .

numAct = prod(actionInfo.Dimension);
actionInfo.LowerLimit = -ones(numAct,1);
actionInfo.UpperLimit =  ones(numAct,1);
actionInfo.Name = 'thrusts';

Создайте интерфейс среды

Создайте интерфейс среды для летающего робота с rlSimulinkEnv со сгенерированной моделью.

env = rlSimulinkEnv(integratedMdl,agentBlk,observationInfo,actionInfo);

Сбросьте функцию

Создайте пользовательскую функцию сброса, которая рандомизирует исходное положение робота вдоль звонка радиуса 15 m и начальная ориентация. Смотрите flyingRobotResetFcn для деталей функции сброса.

env.ResetFcn = @(in) flyingRobotResetFcn(in);

Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.

rng(0)

Создайте агента DDPG

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

% specify the number of outputs for the hidden layers.
hiddenLayerSize = 100; 

observationPath = [
    imageInputLayer([numObs 1 1],'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')];
actionPath = [
    imageInputLayer([numAct 1 1],'Normalization','none','Name','action')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc5')];

% create the layerGraph
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);

% connect actionPath to obervationPath
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');

Задайте опции для критика, использующего rlRepresentationOptions.

criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также задать спецификацию действия и наблюдения для критика. Для получения дополнительной информации смотрите rlRepresentation.

critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);

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

Создайте агента подобным образом критику.

actorNetwork = [
    imageInputLayer([numObs 1 1],'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(numAct,'Name','fc4')
    tanhLayer('Name','tanh1')];

actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);

actor = rlRepresentation(actorNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'tanh1'},actorOptions);

Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions.

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6 ,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',256);
agentOptions.NoiseOptions.Variance = 1e-1;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;

Затем создайте агента с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent.

agent = rlDDPGAgent(actor,critic,agentOptions);

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

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

  • Запустите каждое обучение самое большее 20000 эпизоды, с каждым эпизодом, длящимся в большей части ceil(Tf/Ts) временные шаги.

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

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

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 415.

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

maxepisodes = 20000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'StopOnError',"on",...
    'Verbose',false,...
    'Plots',"training-progress",...
    'StopTrainingCriteria',"AverageReward",...
    'StopTrainingValue',415,...
    'ScoreAveragingWindowLength',10,...
    'SaveAgentCriteria',"EpisodeReward",...
    'SaveAgentValue',415); 

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

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOptions);
else
    % Load pretrained agent for the example.
    load('FlyingRobotDDPG.mat','agent')       
end

Симулируйте агента DDPG

Чтобы подтвердить производительность обученного агента, симулируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

simOptions = rlSimulationOptions('MaxSteps',maxsteps);
experience = sim(env,agent,simOptions);

Смотрите также

|

Похожие темы