본문 바로가기

Others

MJCF 파일 분석(4) - 나만의 Manipulator task를 mujoco에서 만들자

작성자 : 김한결 / 석박통합과정 (gksruf621@postech.ac.kr)

 

MJCF 파일 분석(3)까지 내용으로 MJCF 파일에 대한 분석은 대부분 끝이 났다.

이제부터는 python으로 environment를 만들때 어떻게 해야되는 지를 살펴보면 된다.(reward design이나 observation 가져오기 등등)

 

연구실 형이 최근에 quadruped 로봇을 gym으 불러오게끔 만들어 놓은게 있는데 이를 사용해보기로 했다. (MJCF 파일 분석(1)에서 최대한 library dependency를 줄이고자 한다고 해놓고...그래도 gym이 하는 일이 거의 없기 때문에...)

 

그래서 이번 글은 반성의 의미로 gym이 어떻게 모델을 불러오는지 간단히 정리해보려고 한다.

 

우선 gym은 패키지이기 때문에 import하는 것 만으로 패키지 안의 __init__.py가 실행된다.

gym을 실행시키면 그 안에 다음 코드가 있는데 env 또한 __init__.py 가 있고

from gym.envs import make, spec, register

아래와 같은 resgister들이 생성된다.(한번 확인해보세요)

register(
    id='CartPole-v0',
    entry_point='gym.envs.classic_control:CartPoleEnv',
    max_episode_steps=200,
    reward_threshold=195.0,
)

여기서 register는 gym.envs.registration에 선언되어 있는데 다음 함수를 실행한다는 의미이다

def register(id, **kwargs):
    return registry.register(id, **kwargs)

또 여기서 registry는 다음과 같다

registry = EnvRegistry()

EnvRegistry()는 꽤 길어서 여기서는 EnvRegistry로 모델을 어떻게 불러오는지만 고려하자registry.register(id, **kwargs)를 사용하면 결과적으로 self.env_specs(이친구는 dictionary)에 EnvSpec class의 객체를 추가하게 된다.

self.env_specs[id] = EnvSpec(id, **kwargs)

 

 

여기까지 간단하게 정리하자면 gym/envs/__init__.py안에 있는 환경들을 전부 등록해주는 과정이다.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

gym.make를 하게 되면 어떻게 될까? (gym.make를 감싸고 있는 ENV는 차원 정리해주려고 따로 만든 모듈이니 신경쓰지 말자)

env = ENV(gym.make("Indy7_OpenDoor-v1"))

정답은 .../site-packages/gym/envs/registration.py에 있는 아래 함수를 실행한다.

def make(id, **kwargs):
    return registry.make(id, **kwargs)

여기서 registry는 뭐냐고 하면 EnvRegistry이다.(왠지 데자뷰가...)

registry = EnvRegistry()

 

그럼 registry.make를 실행하면 spec = self.spec(path)를 하게 되는데 여기서 self.spec(path)는 정상적으로 실행됐을 시에 self.specs[id]를 반환한다. 즉 registry안에 등록된 환경 중에 정확히 어떤 환경을 쓰는지를 반환한다고 생각하면 된다.

그 다음 줄로는 spec.make(**kwargs)라는 함수를 사용하는데 전술했던 것처럼 self.specs[id]에는 EnvSpec이 들어가 있기 때문에 EnvSpec.make가 뭘하는 지 살펴보자.

 

EnvSpec.make는 첫째로 args를 update해준다. 둘째로는 self.entry_point(일반적인 경우 아래 코드와 같이 register에 등록되어 있는 entry_point를 의미한다)를 이용해서 모델을 load한다.

register(
    id='InvertedTriplePendulumSwing-v2',
    entry_point='gym.envs.mujoco:InvertedTriplePendulumSwingEnv',
    max_episode_steps=1000,
    reward_threshold=910.0,
)

모델을 로드한다는 건 register에 등록했던 entry_point의 모델을 불러온다는 것.

 

load했던 것을 print해서 보면 다음과 같은 class가 나온다

<class 'environment.mujoco.Indy7_OpenDoor_v1.Indy7_OpenDoorEnv'>

이건 register에 등록한 내가 만든 환경이다.(HalfCheetah와 같은 환경을 실행시켜보면 이해 할 수 있습니다)

 

여기까지가 gym이 mujoco 모델을 어떻게 불러오는지 간단하게 살펴본 내용이다.

 

마지막으로 gym의 역할을 2줄 요약하자면

1. Env 등록

2. 등록한 환경 중 main에서 불러오라는 것 명령준 것 찾아서 불러오기

(다른 역할들도 있지만 위 두개가 가장 중요하다고 생각합니다.)

 

이번 글은 여기까지.

 

추가적으로 MJCF 파일 분석(1)에서는 baxter를 이용해 pick and place 하는 xml을 설명했는데, 연구실 형의 부탁으로 Indy7으로 OpenDoor를 하는 환경을 먼저 만들어야되서 다음 글에서는 위에서 불러왔던 Indy7_OpenDoorEnv를 어떻게 만들어야 하는지 살펴볼 예정이다.