Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

DDPG 에이전트를 사용한 사족 보행 로봇 운동

이 예제에서는 DDPG(심층 결정적 정책 경사법) 에이전트를 사용하여 4족 보행 로봇이 걷도록 훈련시키는 방법을 보여줍니다. 이 예제의 로봇은 Simscape™ Multibody™를 사용하여 모델링됩니다. DDPG 에이전트에 대한 자세한 내용은 DDPG(심층 결정적 정책 경사법) 에이전트 항목을 참조하십시오.

필요한 파라미터를 MATLAB®의 기본 작업 공간으로 불러옵니다.

initializeRobotParameters

4족 보행 로봇 모델

이 예제에 대한 환경은 4족 보행 로봇이며, 훈련 목표는 최소한의 제어 노력으로 이 로봇이 직선 보행하도록 만드는 것입니다.

모델을 엽니다.

mdl = "rlQuadrupedRobot";
open_system(mdl)

이 로봇은 Simscape Multibody를 사용하여 모델링되었으며, 주요 구조적 구성요소는 네 개의 다리와 몸통으로 이루어져 있습니다. 다리는 몸통을 기준으로 다리를 회전할 수 있게 해주는 회전 조인트를 통해 몸통에 연결됩니다. 조인트는 RL Agent에서 제공되는 토크 신호로 작동됩니다.

관측값

이 로봇 환경은 각각 –1과 1 사이에서 정규화된 44개의 관측값을 에이전트에 제공합니다. 관측값은 다음과 같습니다.

  • 몸통 무게 중심의 Y(종방향) 및 Y(횡방향) 위치

  • 몸통의 방향을 나타내는 쿼터니언

  • 무게 중심에서 몸통의 X(진행방향), Y(종방향), Z(횡방향) 속도

  • 몸통의 롤, 피치, 요 레이트

  • 각 다리에 대한 힙 조인트 및 무릎 조인트의 각위치와 각속도

  • 각 다리의 지면 접촉으로 인한 수직 항력과 마찰력

  • 이전 시간 스텝의 행동 값(각 조인트의 토크)

네 다리 전부에 대해, 힙 조인트 각도와 무릎 조인트 각도의 초기값은 각각 –0.8234라디안과 1.6468라디안으로 설정됩니다. 조인트의 중립 위치는 0라디안으로 설정됩니다. 다리가 최대로 펴지고 지면과 수직으로 정렬되면 중립 위치에 있는 것입니다.

행동

에이전트는 –1과 1 사이에서 정규화된 8가지 행동을 생성합니다. 스케일링 인자를 곱하면 이러한 행동은 회전 조인트에 대한 8가지 조인트 토크 신호가 됩니다. 전체 조인트 토크 범위는 각 조인트에 대해 +/– 10Nm입니다.

보상

훈련 중 각 시간 스텝에서 다음 보상이 에이전트에 제공됩니다. 이 보상 함수는 양의 진행방향 속도에 대해 양의 보상을 제공하여 에이전트가 앞으로 이동하도록 합니다. 또한 각 시간 스텝에서 일정한 보상(25Ts/Tf25 Ts/Tf)을 제공함으로써 에이전트가 조기 종료되지 않도록 합니다. 보상 함수의 나머지 항은 원하는 높이 및 방향에서의 큰 편차 또는 과도한 조인트 토크 사용과 같이 원치 않는 상태를 억제하는 벌점입니다.

rt=vx+25TsTf-50yˆ2-20θ2-0.02iut-1i2r(t) = vx(t) + 25 * Ts/Tf - - 50 * ĥ(t)^2 - 20 * θ(t)2 - 0.02 * Σ u(t-1)^2

여기서

  • vxvx(t)는 x 방향으로의 몸통 무게 중심의 속도입니다.

  • TsTsTfTf는 각각 환경의 샘플 시간 및 최종 시뮬레이션 시간입니다.

  • yˆ는 원하는 높이 0.75m에서의 몸통 무게 중심의 높이 오차인데 스케일링된 값입니다.

  • θ는 몸통의 피치 각도입니다.

  • ut-1iu(t-1)은 이전 시간 스텝에서 조인트 i에 대한 행동 값입니다.

에피소드 종료

훈련 또는 시뮬레이션 중에 다음 상황 중 하나라도 발생하면 에피소드가 종료됩니다.

  • 지면에서 몸통 무게 중심의 높이가 0.5m 미만입니다(넘어짐).

  • 몸통의 머리나 꼬리가 지면 아래에 있습니다.

  • 모든 무릎 조인트가 지면 아래에 있습니다.

  • 롤, 피치 또는 요 각도가 범위를 벗어납니다(각각 +/– 0.1745라디안, +/– 0.1745라디안, +/– 0.3491라디안).

환경 인터페이스 만들기

관측값 세트에 대한 파라미터를 지정합니다.

numObs = 44;
obsInfo = rlNumericSpec([numObs 1]);
obsInfo.Name = "observations";

행동 세트에 대한 파라미터를 지정합니다.

numAct = 8;
actInfo = rlNumericSpec([numAct 1],LowerLimit=-1,UpperLimit= 1);
actInfo.Name = "torque";

강화 학습 모델을 사용하여 환경을 만듭니다.

blk = mdl + "/RL Agent";
env = rlSimulinkEnv(mdl,blk,obsInfo,actInfo);

훈련 중에 재설정 함수를 실행하면 초기 조인트 각도와 각속도에 무작위 편차가 발생합니다.

env.ResetFcn = @quadrupedResetFcn;

DDPG 에이전트 만들기

DDPG 에이전트는 주어진 관측값과 행동에 대해 크리틱 가치 함수 표현을 사용하여 장기 보상을 근사합니다. 또한 주어진 관측값에 대해 액터 표현을 사용하여 어떤 행동을 수행할지 결정합니다. 이 예제의 액터 및 크리틱 신경망은 [2]에서 영감을 받았습니다.

심층 신경망 가치 함수 표현을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오. DDPG 에이전트의 신경망을 생성하는 예제는 Compare DDPG Agent to LQR Controller 항목을 참조하십시오.

난수 시드값을 설정합니다.

rng(0)

createNetworks 헬퍼 함수를 사용하여 MATLAB 작업 공간에 신경망을 만듭니다.

createNetworks

심층 신경망 디자이너 앱을 사용하여 대화형 방식으로 액터 및 크리틱 신경망을 만들 수도 있습니다.

크리틱 신경망 구성을 확인합니다.

plot(criticNetwork)

액터 신경망 구성을 확인합니다.

plot(actorNetwork)

rlDDPGAgentOptions를 사용하여 에이전트 옵션을 지정합니다.

agentOptions = rlDDPGAgentOptions();
agentOptions.SampleTime = Ts;
agentOptions.DiscountFactor = 0.99;
agentOptions.MiniBatchSize = 128;
agentOptions.ExperienceBufferLength = 1e6;
agentOptions.TargetSmoothFactor = 1e-3;
agentOptions.NoiseOptions.MeanAttractionConstant = 0.15;
agentOptions.NoiseOptions.Variance = 0.1;

액터와 크리틱에 대한 최적화 함수 옵션을 지정합니다.

agentOptions.ActorOptimizerOptions.Algorithm = "adam";
agentOptions.ActorOptimizerOptions.LearnRate = 1e-4;
agentOptions.ActorOptimizerOptions.GradientThreshold = 1;
agentOptions.ActorOptimizerOptions.L2RegularizationFactor = 1e-5;

agentOptions.CriticOptimizerOptions.Algorithm = "adam";
agentOptions.CriticOptimizerOptions.LearnRate = 1e-3;
agentOptions.CriticOptimizerOptions.GradientThreshold = 1;
agentOptions.CriticOptimizerOptions.L2RegularizationFactor = 2e-4;

에이전트에 대한 rlDDPGAgent 객체를 만듭니다.

agent = rlDDPGAgent(actor,critic,agentOptions);

훈련 옵션 지정하기

에이전트를 훈련시키려면 먼저 다음 훈련 옵션을 지정하십시오.

  • 최대 10,000개의 에피소드에 대해 훈련을 실행하며, 각 에피소드마다 최대 maxSteps개의 시간 스텝이 지속됩니다.

  • 에피소드 관리자 대화 상자에 훈련 진행 상황을 표시합니다(Plots 옵션 설정).

  • 연속 250개의 에피소드 동안 에이전트가 받은 평균 누적 보상이 190보다 크면 훈련을 중지합니다.

trainOpts = rlTrainingOptions(...
    MaxEpisodes=10000,...
    MaxStepsPerEpisode=floor(Tf/Ts),...
    ScoreAveragingWindowLength=250,...
    Plots="training-progress",...
    StopTrainingCriteria="AverageReward",...
    StopTrainingValue=210);

에이전트를 병렬로 훈련시키려면 다음 훈련 옵션을 지정하십시오. 병렬로 훈련시키려면 Parallel Computing Toolbox™가 필요합니다. Parallel Computing Toolbox™가 설치되어 있지 않으면 UseParallelfalse로 설정하십시오.

  • UseParallel 옵션을 true로 설정합니다.

  • 에이전트를 비동기식으로 병렬로 훈련시킵니다.

trainOpts.UseParallel = true;                    
trainOpts.ParallelizationOptions.Mode = "async";

에이전트 훈련시키기

train 함수를 사용하여 에이전트를 훈련시킵니다. 로봇 모델의 복잡성으로 인해 이는 완료하는 데 몇 시간이 소요되는 계산 집약적인 절차입니다. 이 예제를 실행하는 동안 시간을 절약하려면 doTrainingfalse로 설정하여 사전 훈련된 에이전트를 불러오십시오. 에이전트를 직접 훈련시키려면 doTrainingtrue로 설정하십시오. 병렬 훈련의 임의성으로 인해 아래 플롯에서 다른 훈련 결과가 나올 수 있습니다.

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load pretrained agent parameters for the example.
    load("rlQuadrupedAgentParams.mat","params")
    setLearnableParameters(agent, params);
end

훈련된 에이전트 시뮬레이션하기

재현이 가능하도록 난수 생성기 시드값을 고정합니다.

rng(0)

훈련된 에이전트의 성능을 검증하려면 로봇 환경 내에서 에이전트를 시뮬레이션하십시오. 에이전트 시뮬레이션에 대한 자세한 내용은 rlSimulationOptions 항목과 sim 항목을 참조하십시오.

simOptions = rlSimulationOptions(MaxSteps=floor(Tf/Ts));
experience = sim(env,agent,simOptions);

참고 문헌

[1] Heess, Nicolas, Dhruva TB, Srinivasan Sriram, Jay Lemmon, Josh Merel, Greg Wayne, Yuval Tassa, et al. ‘Emergence of Locomotion Behaviours in Rich Environments’. ArXiv:1707.02286 [Cs], 10 July 2017. https://arxiv.org/abs/1707.02286.

[2] Lillicrap, Timothy P., Jonathan J. Hunt, Alexander Pritzel, Nicolas Heess, Tom Erez, Yuval Tassa, David Silver, and Daan Wierstra. ‘Continuous Control with Deep Reinforcement Learning’. ArXiv:1509.02971 [Cs, Stat], 5 July 2019. https://arxiv.org/abs/1509.02971.

참고 항목

함수

객체

블록

관련 예제

세부 정보