본문 바로가기

Others

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

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

 

MJCF 파일 분석(2)에 이어서 environment를 만들어 보려고 한다.

 

처음에는 아래 링크에 reference가 아주 친절하게 나와있기 때문에 만만히 봤는데, API가 C++ 기반으로 작성되었다보니 생각보다 까다로웠다. 그래도 mujoco 라이브러리안에 "robotics"나 "mujoco"를 참고하면 비교적 쉽게  따라할 수 있으며, mujoco-py 1.50.0버전 refer도 제공하고 있다.

 

MuJoCo reference

https://mujoco.readthedocs.io/en/latest/APIreference.html#mjmodel

 

API Reference — MuJoCo documentation

These are support functions that need access to mjModel and mjData, unlike the utility functions which do not need such access. Support functions are called within the simulator but some of them can also be useful for custom computations, and are documente

mujoco.readthedocs.io

MuJoCo-py reference

https://openai.github.io/mujoco-py/build/html/reference.html

 

API reference — mujoco-py 1.50.1.0 documentation

Docs » API reference View page source API reference mujoco_py.load_model_from_path(path) Loads model from path. mujoco_py.load_model_from_xml(xml_string) Loads and returns a PyMjModel model from a string containing XML markup. Saves the XML string used to

openai.github.io

 

그래서 이번 글은 mujoco 함수들을 예시와 함께 기록하려고 한다.

참고로 여기서 env는 gym wraper로 한번 감싼 형태이며 다른 refer는 볼 필요 없이 Data structure 부분만을 이용해 observation design, reward design을 할 것이기 때문에 해당 부분과 관련된 함수를 위주로 언급한다

 

1. body name으로 index 가져오고 해당 body pos 접근하기(찾아보니 body pos는 변경할 수 없다고 한다. 또 막상써보니 refer에 있는 get body xpos가 훨씬 나은것 같다...)  (Baxter로 pick&place를 만들때는 object의 position을 변경시켜도 반영이 되지않았는데 Indy7의 open door는 변경이 잘 됩니다...혼란을 드려 죄송합니다)

self.env.sim.model.body_pos[self.env.sim.model.body_name2id("target0")]

<body pos 변경하는 법>

#=====================init object pos==================
init_obj_pos = np.array([0.0, 0.0, 0.0], dtype=np.float32)
init_obj_pos[:2] += 0.2*(np.random.rand(2)-0.5)
self.sim.model.body_pos[self.model.body_name2id('object')] = init_obj_pos
#=======================================================

 

2. site name으로 index 가져오고 해당 site pos 접근하기(변경 가능)

site_id = self.env.sim.model.site_name2id("object0")
self.env.sim.model.site_pos[site_id]

3. site position data로 한번에 접근하기(이건 refer에도 있어서 예시용)

self.sim.data.get_site_xpos("l_gripper_l_finger")

 

 

 

Pick and Place를 구현해보려고 1,2 번 사용하는데 나름 애를 먹었는데(document에 없음) 어려웠던 부분들에 대해 막상 글을 써보니 다른 것들은 전부 레퍼에 있고 쓸만한게 없는 것 같다...

 

추후에 또 추가할 사항이 있으면 추가해야겠다.

 

이번 글은 여기까지.