본문 바로가기

Others

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

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

 

주말동안 Baxter의 mjcf를 분석하고 정리해보았다.

 

우선 MJCF 파일 분석(1)에서 control이 안되는 이유는 구글링해서 얻을 수 있는 XML 파일에는 actuator가 선언되어 있지 않기 때문이다.

 

actuator를 추가한 이후에 MJCF 파일 분석(1) ./simulator로 baxter를 실행시켜보면 다음과 같다.

 

<actuator 추가>

    <actuator>
	    <motor ctrllimited="true" ctrlrange="-50 50" joint="right_s0" name="torq_right_j0"/>
	    <motor ctrllimited="true" ctrlrange="-100 100" joint="right_s1" name="torq_right_j1"/>
	    <motor ctrllimited="true" ctrlrange="-50 50" joint="right_e0" name="torq_right_j2"/>
	    <motor ctrllimited="true" ctrlrange="-50 50" joint="right_e1" name="torq_right_j3"/>
	    <motor ctrllimited="true" ctrlrange="-15 15" joint="right_w0" name="torq_right_j4"/>
	    <motor ctrllimited="true" ctrlrange="-15 15" joint="right_w1" name="torq_right_j5"/>
	    <motor ctrllimited="true" ctrlrange="-15 15" joint="right_w2" name="torq_right_j6"/>
	    <motor ctrllimited="true" ctrlrange="-1.0 1.0" joint="r_gripper_r_finger_joint" name="torq_right_j7"/>
 	    <motor ctrllimited="true" ctrlrange="-1.0 1.0" joint="r_gripper_l_finger_joint" name="torq_right_j8"/>
	    <motor ctrllimited="true" ctrlrange="-50 50" joint="left_s0" name="torq_left_j0"/>
	    <motor ctrllimited="true" ctrlrange="-100 100" joint="left_s1" name="torq_left_j1"/>
	    <motor ctrllimited="true" ctrlrange="-50 50" joint="left_e0" name="torq_left_j2"/>
	    <motor ctrllimited="true" ctrlrange="-50 50" joint="left_e1" name="torq_left_j3"/>
	    <motor ctrllimited="true" ctrlrange="-15 15" joint="left_w0" name="torq_left_j4"/>
	    <motor ctrllimited="true" ctrlrange="-15 15" joint="left_w1" name="torq_left_j5"/>
	    <motor ctrllimited="true" ctrlrange="-15 15" joint="left_w2" name="torq_left_j6"/>
	    <motor ctrllimited="true" ctrlrange="-1.0 1.0" joint="l_gripper_r_finger_joint" name="torq_left_j7"/>
 	    <motor ctrllimited="true" ctrlrange="-1.0 1.0" joint="l_gripper_l_finger_joint" name="torq_left_j8"/>	    
    </actuator>

 

나만의 Task를 만들기 위해서는 다른 object를 넣어야하는데 기존 Baxter는 asset과 actuator, body등이 모두 한 XML 파일 안에 들어가 있기 때문에 추후 다른 environment를 생성하는데 까다롭다. (이런 면에서 robosuite가 잘 만들어졌다는 걸 새삼 깨닫습니다-merge로 여러 object 추가 가능)

 

object추가를 깔끔하게 하기 위해 다음과 같이 xml 파일을 정리해주었다.

(바로 아래것은 main이 되는 baxter.xml 파일이고 그 밑 assets.xml은 main에서 참조하는 "include/baxter/assets.xml" 파일입니다.)

 

<baxter.xml>

<mujoco>
    <compiler coordinate="local" angle="radian" meshdir="./meshes/" strippath="false" texturedir="./textures/"/>
    <size njmax="795" nconmax="250" nstack="631875" />
    <default>
		 <geom margin="0.001"/>
         <joint limited="true" damping="0.2" armature=".01"/>
  		 <default class="viz">
			 <geom contype="0" conaffinity="0" group="1" type="mesh"/>
		 </default>
    </default>
    
    <default class="dump_joint">
        <joint damping='10'/>
    </default>

    
    <!-- Assets -->
    <asset>
	<include file="include/baxter/assets.xml"/>
	<include file="include/object/arena_base_asset.xml"/>
        <include file="include/object/twotable_asset.xml"/>
    </asset>
    
    <visual>
        <map fogstart="1.5" fogend="3"/>
        <quality shadowsize="2048"/>
    </visual>
    
    
    <contact>       
         <exclude body1="right_upper_shoulder" body2="torso"/>
	 	 <exclude body1="right_upper_shoulder" body2="right_upper_elbow"/>
		 <exclude body1="right_lower_shoulder" body2="torso"/>

		 <exclude body1="left_upper_shoulder" body2="torso"/>
		 <exclude body1="left_upper_shoulder" body2="left_upper_elbow"/>
		 <exclude body1="left_lower_shoulder" body2="torso"/>
		
		 <exclude body1="collision_head_link_1" body2="torso"/>
		 <exclude body1="collision_head_link_2" body2="torso"/>
		 <exclude body1="r_gripper_r_finger" body2="r_gripper_l_finger"/>
		 <exclude body1="l_gripper_r_finger" body2="l_gripper_l_finger"/>
    </contact>
       
    <worldbody>
        <light directional="false" cutoff="90" exponent="1" diffuse="1 1 1" specular="0 0 0" pos="1 0 1.5" dir="-1 0 -2.5"/>
        <geom name="ground" type="plane" pos="0 0 -0.925" size="5 5 .05" rgba="0.7 0.6 0.5 1"/>
       
        
        <include file="include/baxter/body.xml"/>
        <include file="include/object/arena_base_body.xml"/>
        <include file="include/object/twotable_body.xml"/>

	<!-- Box object -->
	<body name="object0" pos="0.8 0.5 -0.08">
		<joint name="object0:joint" type="free" damping="0.01" limited="false"></joint>
		<geom  pos="0.0 0.0 0.0" size="0.025 0.025 0.025" type="box" condim="3" name="object0_geom" mass="2" rgba="0 0 0 1"></geom>
		<site name="object0" pos="0.0 0.0 0.0" size="0.02 0.02 0.02" rgba="0.9 0.9 0.9 1" type="sphere"></site>
	</body>
	<body name="target0" pos="0.8 -0.5 -0.105">
		<site name="target0" pos="0.0 0.0 0.0" size="0.02 0.02 0.02" rgba="1 0 0 1" type="sphere"></site>
	</body>


    </worldbody>
    
    <actuator>
        <include file="include/baxter/actuator.xml"/>
    </actuator>
</mujoco>

 

 

<assets.xml>

<mujocoinclude>
	<mesh name="base_link" file="baxter/torso/base_link.STL"/>
	<mesh name="base_link_collision" file="baxter/torso/base_link_collision.STL"/>
	<mesh name="PEDESTAL" file="baxter/base/PEDESTAL.STL"/>
	<mesh name="pedestal_link_collision" file="baxter/base/pedestal_link_collision.STL"/>
	<mesh name="H0" file="baxter/head/H0.STL"/>
	<mesh name="H1" file="baxter/head/H1.STL"/>
	<mesh name="S0" file="baxter/upper_shoulder/S0.STL"/>
	<mesh name="S1" file="baxter/lower_shoulder/S1.STL"/>
	<mesh name="E0" file="baxter/upper_elbow/E0.STL"/>
	<mesh name="E1" file="baxter/lower_elbow/E1.STL"/>
	<mesh name="W0" file="baxter/upper_forearm/W0.STL"/>
	<mesh name="W1" file="baxter/lower_forearm/W1.STL"/>
	<mesh name="W2" file="baxter/wrist/W2.STL"/>
	<mesh name="half_round_tip" file="baxter/electric_gripper/fingers/half_round_tip.STL" />
	<mesh name="electric_gripper_base" file="baxter/electric_gripper/electric_gripper_base.STL" />
	<mesh name="extended_narrow" file="baxter/electric_gripper/fingers/extended_narrow.STL"/>
	<mesh name="paddle_tip" file="baxter/electric_gripper/fingers/paddle_tip.STL"/>        
</mujocoinclude>

 

 

위 xml 파일은 robosuite의 arena와 table을 가져와서 추가해주고 box와 target등을 추가해준 xml 파일이다.

(당연히 acuator나 body파일을 같이 업로드 한것이 아니기 때문에 위 코드를 복사한다고 해서 ./simulator 에서 동작하지 않습니다. 참고용으로 사용하시고 혹시 도움이 필요하시면 메일이나 댓글을 남겨주세요.)

 

이를 ./simulator로 실행시켜보면 다음과 같은 environment가 생성된다.

 

 

위와 같이 simulator 환경을 만들었다면 이제 robosuite나 gym과 같이 RL 알고리듬을 테스트할 수 있는 환경을 만들어 주어야 한다.

 

이번 글은 여기까지.