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

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

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

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

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

mdl = 'rlFlyingRobotEnv';
open_system(mdl)

Установите начальные переменные состояния модели.

theta0 = 0;
x0 = -15;
y0 = 0;

Задайте шаг расчета Ts и длительность симуляции Tf.

Ts = 0.4;
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.

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

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

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

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

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

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

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

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

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

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

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

rng(0)

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

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

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

observationPath = [
    featureInputLayer(numObs,'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 = [
    featureInputLayer(numAct,'Normalization','none','Name','action')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc5')];

% Create the layer graph.
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);

% Connect actionPath to observationPath.
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');

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

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

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

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

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

Создайте агента так же критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation.

actorNetwork = [
    featureInputLayer(numObs,'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 = rlDeterministicActorRepresentation(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 опция к false).

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

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 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 the pretrained agent for the example.
    load('FlyingRobotDDPG.mat','agent')       
end

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

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

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

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

|

Похожие темы