ð Unityãšã³ãžãã¢ã®èŠç¹ã§åŠã¶MuJoCoå ¥é
ãããããã®åäœããªã¢ã«ã«ã·ãã¥ã¬ãŒã·ã§ã³ãããïŒã
ããæã£ãããšã¯ãããŸãããïŒ
Unityã¯ããªã¢ã«ã¿ã€ã ã¬ã³ããªã³ã°ãçŽæçãªéçºç°å¢ã掻ãããŠãã²ãŒã ãVRã¢ããªéçºã«æé©ãªãã©ãããã©ãŒã ã§ããããããç©çã·ãã¥ã¬ãŒã·ã§ã³ã®ç²ŸåºŠããããã£ã¯ã¹åãã®æ©èœã«ãããŠã¯ãããç¹åããããŒã«ãæ±ããããŸãã
ããã§ç»å Žããã®ããMuJoCoïŒMulti-Joint dynamics with ContactïŒ ã§ãã
MuJoCoã¯ãé«éãã€ç²ŸåºŠã®é«ãç©çã·ãã¥ã¬ãŒã·ã§ã³ãæäŸããããããã®åäœãç©äœéã®æ¥è§Šèšç®ã«åªããŠããŸããGoogle DeepMindãã¯ãããšããç ç©¶æ©é¢ãäŒæ¥ã§ãåºã䜿ãããŠããã匷ååŠç¿ããããã£ã¯ã¹åéã§ã®å¿çšãé²ãã§ããŸãã
ãããªäººã«ãªã¹ã¹ã¡ïŒ
â
Unityã§ç©çã·ãã¥ã¬ãŒã·ã§ã³ã詊ããããšããããã粟床ã«äžæºããã人
â
MuJoCoã«èå³ãããããã©ãããå§ããã°ãããåãããªã人
â
XMLã®æžãæ¹ãåŠã³ã€ã€ãã·ãã¥ã¬ãŒã·ã§ã³ãæ¹é ããŠã¿ãã人
ð¹ UnityãšMuJoCoãäœãéãã®ïŒ
UnityãšMuJoCoã¯ãã©ã¡ããç©çã·ãã¥ã¬ãŒã·ã§ã³ãå¯èœã§ããããã®ç®çãç°ãªããŸãã
Unity | MuJoCo | |
---|---|---|
çšé | ã²ãŒã ã»VRã»ã€ã³ã¿ã©ã¯ãã£ãã³ã³ãã³ã | ãããã£ã¯ã¹ã»åŒ·ååŠç¿ã»ç§åŠã·ãã¥ã¬ãŒã·ã§ã³ |
ç©çãšã³ãžã³ | NVIDIA PhysX | å°çšã®é«ç²ŸåºŠãšã³ãžã³ |
æäœæ¹æ³ | GUIïŒãšãã£ã¿ã§ãªããžã§ã¯ãé çœ®ïŒ | XMLãã¹ã¯ãªããã§å®çŸ© |
èšç®ç²ŸåºŠ | ãªã¢ã«ã¿ã€ã åŠçåãïŒè¿äŒŒèšç®ïŒ | é«ç²ŸåºŠãªç©çèšç® |
ã€ãŸãããèŠãç®ãã²ãŒã åãã®ç©çãªãUnityããããããé«ç²ŸåºŠãªã·ãã¥ã¬ãŒã·ã§ã³ãªãMuJoCoã ãšãã䜿ãåããé©ããŠããŸãã
ããå ·äœçã«ã¯äŸãããšããã§ãããã
- Unityã®PhysXã¯ãåäœã·ãã¥ã¬ãŒã·ã§ã³ã®ãããé¢ç¯ã®æè»æ§ãæ¥è§Šèšç®ãç²ãã
- MuJoCoã¯ãæ¥è§Šåã»æ©æŠã®èšç®ç²ŸåºŠãé«ããéåååŠè§£æãå¯èœã
- 匷ååŠç¿ã«ãããŠãUnity ML-Agentsã§ã¯MuJoCoã®ãããªç²Ÿå¯ãªæ¥è§Šèšç®ãã§ããªãã
ä»åã¯ããŸã ãMuJoCoã®åºæ¬ã ãåŠã³ããµã³ãã«XMLãã¡ã€ã«ãè§£æããªããããã®ä»çµã¿ãçè§£ããŠãããŸãã
MuJoCoãã©ã®ããã«åäœããã®ããäœéšããªãããæ¬¡å以éã®ãããããã¢ãã«ã®äœæãã«ç¹ããŠãããŸãããïŒ
ð ãŸãã¯MuJoCoãè§Šã£ãŠã¿ããïŒ
ããã§ã¯ãæåã«MuJoCoã®ãµã³ãã«ã·ãã¥ã¬ãŒã·ã§ã³ãèŠãŠãã¢ãããŒã·ã§ã³ãäžããŸãããïŒ
ðº åèåç»:
ãã®åç»ã§ã¯ãMuJoCoã䜿ã£ããªã¢ã«ãªã·ãã¥ã¬ãŒã·ã§ã³ã®äŸãèŠãããšãã§ããŸãã
ããããªã·ãã¥ã¬ãŒã·ã§ã³ãäœããã®ãïŒããšæããããæ©éMuJoCoãè§Šã£ãŠãããŸãããã
ð MuJoCoã®ã·ãã¥ã¬ãŒã¿ãŒã䜿ã£ãŠã¿ã
MuJoCoã«ã¯ãXMLãã¡ã€ã«ãèªã¿èŸŒãã§ã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ã§ãããæšæºã®ã·ãã¥ã¬ãŒã¿ãŒã ãä»å±ããŠããŸãã
ãŸãã¯ããã䜿ã£ãŠããµã³ãã«XMLãéããŠã¿ãŸãããã
ð¡ æé
-
MuJoCoãã€ã³ã¹ããŒã«ãããšãäžå³ã®ã¢ã€ã³ã³ããã¹ã¯ããããŸãã¯ã¢ããªã±ãŒã·ã§ã³ãã©ã«ãã«è¿œå ãããŸãã
ãã®ã¢ã€ã³ã³ãããã«ã¯ãªãã¯ããŠãã·ãã¥ã¬ãŒã¿ãŒãèµ·åããŸãããã -
ã·ãã¥ã¬ãŒã¿ãŒãèµ·åãããšãäžå³ã®ãããªãŠã£ã³ããŠã衚瀺ãããŸãã
-
ãµã³ãã«ã®XMLãã¡ã€ã«ããã©ãã°ïŒãããã ãããšãã·ãã¥ã¬ãŒã·ã§ã³ãéå§ãããŸãïŒ
ããã§ãMuJoCoã®ã·ãã¥ã¬ãŒã·ã§ã³ç°å¢ãæŽããŸããïŒ
次ã«ãXMLãã¡ã€ã«ã®äžèº«ãè§£æããã·ãã¥ã¬ãŒã·ã§ã³ã®ä»çµã¿ãçè§£ããŠãããŸãããã
âïž ãµã³ãã«XMLãã¡ã€ã«ãçè§£ããã
MuJoCoã§ã¯ã¢ãã«ã®å®çŸ©ã«XMLãã¡ã€ã«ãçšããŸãããããŠããµã³ãã«ãšããŠéžãã xml ãã¡ã€ã«ã¯ãã«ãŒã³ã®ãµã³ãã«ã§ãã
ãã®XMLãã¡ã€ã«ã¯ãMuJoCoã§ãã«ãŒã³ïŒé¢šè¹ïŒãçšããã·ãã¥ã¬ãŒã·ã§ã³ãå®çŸããããã®èšå®ãã¡ã€ã«ã§ãããã®XMLãã¡ã€ã«ã¯ãMuJoCoã®ã·ãã¥ã¬ãŒã·ã§ã³ã«ãããåºæ¬çãªèšå®ãäžéãç¶²çŸ ããŠããŸãã
- ãªãã·ã§ã³ã§ã·ãã¥ã¬ãŒã·ã§ã³ã®åºæ¬ãã©ã¡ãŒã¿ãèšå®ãã
- ããžã¥ã¢ã«ã§èŠãç®ã調æŽã
- ããã©ã«ãã§åèŠçŽ ã®å ±éããããã£ããŸãšãã
- ã¢ã»ããã§ã·ãŒã³ã«äœ¿çšãããªãœãŒã¹ãå®çŸ©ãã
- ã¯ãŒã«ãããã£ã§å®éã®ã·ãŒã³ã®ãªããžã§ã¯ããé 眮ã
- è ±ã§åãªããžã§ã¯ãéã®é£çµãå®çŸããŠããŸãã
balloons.xmlïŒ
<mujoco>
<option density="1.204" viscosity="1.8e-5" integrator="implicit"/>
<visual>
<global elevation="-10"/>
</visual>
<default>
<tendon limited="true" width="0.003" rgba="1 1 1 1"/>
<geom friction=".2"/>
<default class="weight">
<geom rgba=".8 .4 .8 1"/>
<site rgba=".8 .4 .8 1"/>
</default>
<default class="balloon">
<!--
0.167 is the MKS density of helium at room temperature.
Note this does not take into account the mass of the rubber,
which is likely not insignificant.
-->
<geom density="0.167" fluidshape="ellipsoid"/>
<default class="pink">
<geom rgba="1 .6 .7 1"/>
<site rgba="1 .6 .7 1"/>
</default>
<default class="blue">
<geom rgba=".3 .7 .9 1"/>
<site rgba=".3 .7 .9 1"/>
</default>
<default class="green">
<geom rgba=".4 .9 .5 1"/>
<site rgba=".4 .9 .5 1"/>
</default>
<default class="orange">
<geom rgba="1 .4 0 1"/>
<site rgba="1 .4 0 1"/>
</default>
</default>
</default>
<asset>
<texture name="grid" type="2d" builtin="checker" width="512" height="512" rgb2="0 0 0" rgb1="1 1 1"/>
<material name="grid" texture="grid" texrepeat="2 2" texuniform="true" reflectance=".6"/>
</asset>
<worldbody>
<geom name="ground" type="plane" size="5 5 .05" pos="0 0 -.5" material="grid"/>
<geom name="ramp" type="box" size=".4 .2 .03" pos="0 0 -.4" euler="0 20 0" rgba="1 1 1 1"/>
<body name="weight" childclass="weight" pos=".3 0 .2">
<freejoint/>
<light pos="1 0 3" dir="-1 0 -3" mode="trackcom"/>
<light pos="-1 0 3" dir="1 0 -3" mode="trackcom"/>
<!-- The mass of the weight was chosen to be slightly bigger than the total buoyancy of the balloons. -->
<geom name="weight" type="box" size=".015 .015 .015" mass=".0347"/>
<site name="weight1" pos=" .013 .013 .013" size="0.005"/>
<site name="weight2" pos="-.013 -.013 .013" size="0.005"/>
</body>
<!-- The gravcomp value of 7.2 is the ratio of air and helium densities at room temperature. -->
<body name="pink" gravcomp="7.2" pos="-.2 .1 .2" childclass="pink">
<freejoint />
<geom name="pink" type="ellipsoid" size=".11 .11 .15"/>
<geom name="pink_knot" pos="0 0 -.15" size=".02"/>
<site name="pink" pos="0 0 -.17" size="0.01"/>
</body>
<body name="blue" gravcomp="7.2" pos=".1 .1 .2" childclass="blue">
<freejoint />
<geom name="blue" type="ellipsoid" size=".12 .12 .15"/>
<geom name="blue_knot" pos="0 0 -.15" size=".02"/>
<site name="blue" pos="0 0 -.17" size="0.01"/>
</body>
<body name="green" gravcomp="7.2" pos=".1 -.1 .2" childclass="green">
<freejoint />
<geom name="green" type="ellipsoid" size=".12 .12 .14"/>
<geom name="green_knot" pos="0 0 -.14" size=".02"/>
<site name="green" pos="0 0 -.16" size="0.01"/>
</body>
<body name="orange" gravcomp="7.2" pos="-.12 -.12 .2" childclass="orange">
<freejoint />
<geom name="orange" type="ellipsoid" size=".12 .12 .13"/>
<geom name="orange_knot" pos="0 0 -.13" size=".02"/>
<site name="orange" pos="0 0 -.15" size="0.01"/>
</body>
</worldbody>
<tendon>
<spatial range="0 0.6">
<site site="pink"/>
<site site="weight1"/>
</spatial>
<spatial range="0 0.4">
<site site="blue"/>
<site site="weight1"/>
</spatial>
<spatial range="0 0.3">
<site site="green"/>
<site site="weight2"/>
</spatial>
<spatial range="0 0.5">
<site site="orange"/>
<site site="weight2"/>
</spatial>
</tendon>
</mujoco>
å
šäœã¯ <mujoco>
ã¿ã°ã§å²ãŸããŠããããã®äžã§ã·ãã¥ã¬ãŒã·ã§ã³ã®ãªãã·ã§ã³ãããžã¥ã¢ã«èšå®ãããã©ã«ãã®ããããã£ããªãœãŒã¹ïŒã¢ã»ããïŒãã·ãŒã³ïŒã¯ãŒã«ãããã£ïŒããããŠé£çµçšã®è
±ïŒtendonïŒãå®çŸ©ãããŠããŸãã
詳现ã¯ãä»é²ãåç §ãã ããã
ã¡ãã£ãšçè§£ã確ããã
ãããŸã§ChatGPTãªã©ã掻çšããŠãMuJoCoã®åºæ¬çãªèšå®ãXMLãã¡ã€ã«ã®æ§é ã«ã€ããŠå€§äœã®æŠèŠãæŽãããšãã§ããŸãããããããã¯ãå®éã«èªåã§æãåãããŠåŸãå®è·µçãªçè§£ãã玹ä»ããŸãã
ãã®ãµã³ãã«ã§ã¯ããã«ãŒã³ãããã®ã«æµ®ãã³äžãããªãçŸè±¡ã«æ°ã¥ããã®ã§ããã©ã¡ãŒã¿ã倿ŽããŠãå®éã«ãã«ãŒã³ãæµ®ãã¹ãŠã¿ãããšã«ããŸããã
ãã€ã³ãã¯ãgravcomp
ã§ããXMLå
ã®ã³ã¡ã³ãã«ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãïŒ
he gravcomp value of 7.2 is the ratio of air and helium densities at room temperature.
ã€ãŸããããã¯ããªãŠã ã®æµ®åã«é¢ãããã©ã¡ãŒã¿ã§ããããã®å€ã調æŽããã°ãã«ãŒã³ã®æµ®åã倧ãããªãã¯ãã§ããå®éã«ãã®å€ã倿ŽããŠã¿ãçµæããã«ãŒã³ãèŠäºã«æµ®ãã³äžããããã«ãªããŸããã
ãã®çµæã¯ãäžèšã®åç»ã§ã確èªããã ããŸãïŒ
ð ãŸãšã
ä»åã¯ãMuJoCoã®åºæ¬æŠå¿µãšXMLã®è§£æãè¡ããå®éã«ãã«ãŒã³ã®ã·ãã¥ã¬ãŒã·ã§ã³ãä¿®æ£ããŠã¿ãŸããã
MuJoCoã¯ãXMLã䜿ã£ãŠã¢ãã«ãå®çŸ©ããç©çã·ãã¥ã¬ãŒã·ã§ã³ãåãã ãšããæµããåºæ¬ã§ãã
äžèŠã·ã³ãã«ã§ããã现ãããã©ã¡ãŒã¿èª¿æŽãã§ããã®ã§ãããããã·ãã¥ã¬ãŒã·ã§ã³ãAIåŠç¿ã«ãå¿çšã§ããŸãã
次åã¯ãTurtleBot3ã®ã¢ãã«ãMuJoCoã§äœæããå®éã«ããããã®ç©çã·ãã¥ã¬ãŒã·ã§ã³ãåãããŠã¿ãŸãïŒ
ãå®éã®ãããããã·ãã¥ã¬ãŒãããã«ã¯ã©ãããã°ããïŒããèããªããé²ããŠãããŸãããã
ð æ¬¡åïŒãMuJoCoã§TurtleBot3ãäœã£ãŠã¿ãã ããæ¥œãã¿ã«ïŒ
ä»é²
ããã§ã¯ãballoons.xmlã®çްããªèšå®å 容ã解説ããŸãã
1. ã·ãã¥ã¬ãŒã·ã§ã³ã®åºæ¬ãªãã·ã§ã³ãšããžã¥ã¢ã«èšå®
<option>
ã¿ã°
<option density="1.204" viscosity="1.8e-5" integrator="implicit"/>
- density: ã·ãã¥ã¬ãŒã·ã§ã³å ã§äœ¿çšãã空æ°ãªã©ã®æµäœã®å¯åºŠãæå®ããŠããŸããããã§ã¯ 1.204ïŒãããã kg/m³ïŒãšèšå®ãããŠããŸãã
- viscosity: æµäœã®ç²æ§ã瀺ããã©ã¡ãŒã¿ã§ããå€ã¯ 1.8e-5 ãšãªã£ãŠãããçŸå®ã®ç©ºæ°ã®ç²æ§ã«è¿ãå€ã§ãã
- integrator: æ°å€ç©åã®æ¹æ³ãæå®ããŠããŸãããimplicitãã¯ãåæ§ã®é«ãã·ãã¥ã¬ãŒã·ã§ã³ã«ãããŠå®å®æ§ãé«ããããã«éžã°ããæ¹æ³ã§ãã
<visual>
ã¿ã°
<visual>
<global elevation="-10"/>
</visual>
- global elevation: ã«ã¡ã©ã®èŠç¹ãã·ãŒã³å šäœã®èŠãæ¹ã«åœ±é¿ããŸããããã§ã¯ã·ãŒã³ãå°ãèŠäžãã圢ã«ãããããelevation ã -10 ã«èšå®ããŠããŸãã
2. ããã©ã«ãèšå®ãšã¯ã©ã¹
<default>
ã¿ã°
ããã©ã«ãèšå®ã§ã¯ãå ±éã§äœ¿çšãããã©ã¡ãŒã¿ãã¹ã¿ã€ã«ãå®çŸ©ããŠããŸããããã«ãããåèŠçŽ ã§åãèšå®ãç¹°ãè¿ããã«æžãããã«ãªã£ãŠããŸãã
<default>
<tendon limited="true" width="0.003" rgba="1 1 1 1"/>
<geom friction=".2"/>
...
</default>
-
tendon: è
±ïŒtendonïŒã®ããã©ã«ãèšå®ã
limited="true"
ã«ãããè ±ã®äŒžã³çž®ã¿ãå¶éãããwidth
ãrgba
ã§èŠãç®ã®å€ªããè²ãæå®ããŠããŸãã - geom: 幟äœåŠèŠçŽ ã®ããã©ã«ãèšå®ãããã§ã¯æ©æŠä¿æ°ã 0.2 ã«èšå®ããŠãããå šäœã®æ¥è§Šæåã«åœ±é¿ããŸãã
ã¡ãªã¿ã«ãtendonãšããèšèã¯æåã¯ã€ã¡ãŒãžãã¥ããã£ãã®ã§ãããå®éã¯äžå³ã®ãããªãç©äœãæ¥ç¶ãã现ã糞ã®ãããªãã®ãæããŠããŸããå®éã®ã·ãã¥ã¬ãŒã·ã§ã³ã§ãããã®è ±ãç©äœå士ãæè»ã«é£çµãã圹å²ãæãããŠããŸãã
ãµãã¯ã©ã¹èšå®
ããã©ã«ãèšå®å
ã§ã¯ãããã«ã¯ã©ã¹åãããããŠããŸããããšãã°ãweight
ã¯ã©ã¹ãš balloon
ã¯ã©ã¹ãå®çŸ©ãããŠããŸãã
-
<default class="weight">
ããã§ã¯ãéãã«é¢ããèŠãç®ã®èšå®ãè¡ãããŠããŸãã<geom>
ãš<site>
ã§ãè²ïŒrgbaïŒãæå®ãããŠããŸãã -
<default class="balloon">
颚è¹ã«é¢ããåºæ¬èšå®ã§ãã- density="0.167": ããªãŠã ã®å¯åºŠã«è¿ãå€ãèšå®ããŠããã颚è¹ã®æµ®åèšç®ã«åœ±é¿ããŸãã
-
fluidshape="ellipsoid": 颚è¹ã®åœ¢ç¶ãæ¥åäœãšããŠæ±ãããŸãã
ããã«ãballoon
ã¯ã©ã¹å ã«ãµãã¯ã©ã¹ïŒpink
,blue
,green
,orange
ïŒãå®çŸ©ãããããããã®è²ãå€èгã现ããèšå®ãããŠããŸãã
3. ã¢ã»ããïŒè³ç£ïŒã®å®çŸ©
<asset>
ã¿ã°
<asset>
<texture name="grid" type="2d" builtin="checker" width="512" height="512" rgb2="0 0 0" rgb1="1 1 1"/>
<material name="grid" texture="grid" texrepeat="2 2" texuniform="true" reflectance=".6"/>
</asset>
- texture: ãgridããšããååã®ãã¯ã¹ãã£ãå®çŸ©ãããã§ã¯ããã§ãã¯æïŒcheckerïŒãæå®ãããçœãšé»ã§æ§æãããç»åãçæãããŸãã
-
material: äžèšã®ãã¯ã¹ãã£ãå©çšããŠãæè³ªãgridããäœæã
texrepeat
ãreflectance
ãèšå®ããããšã§ãå°é¢ãªã©ã®èŠãç®ãå¶åŸ¡ããŸãã
4. ã¯ãŒã«ãããã£ïŒã·ãŒã³ïŒã®å®çŸ©
<worldbody>
ã¿ã°
ã·ãŒã³å ã®ãªããžã§ã¯ãïŒå°é¢ãæé¢ã颚è¹ãéããªã©ïŒãå®çŸ©ãããŸãã
<worldbody>
<geom name="ground" type="plane" size="5 5 .05" pos="0 0 -.5" material="grid"/>
<geom name="ramp" type="box" size=".4 .2 .03" pos="0 0 -.4" euler="0 20 0" rgba="1 1 1 1"/>
...
</worldbody>
-
å°é¢ (
ground
)-
type="plane"
: ç¡éå¹³é¢ã衚çŸã -
size
ãšpos
ã§å€§ãããäœçœ®ãæå®ã -
material="grid"
ã«ãããå ã«å®çŸ©ãããã§ãã¯æã®ãããªã¢ã«ãé©çšãããŸãã
-
-
æé¢ (
ramp
)-
type="box"
ãšããŠãçŽæ¹äœã衚çŸããeuler
屿§ã§å転ïŒããã§ã¯20床ïŒãäžããŠããŸãã
-
<body>
ã¿ã°
å -
éã (
weight
)-
childclass="weight"
ãæå®ããŠãããã©ã«ãèšå®ïŒéãçšïŒã®å€èгãåŒãç¶ããŸãã -
<freejoint/>
ã«ããèªç±åºŠã®é«ããžã§ã€ã³ããæãããã·ãŒã³å ã§åãããããã«ããŠããŸãã - å
éšã§
<geom>
ã<site>
ã¿ã°ã䜿ã£ãŠãå®éã®åœ¢ç¶ãåç §ç¹ïŒãµã€ãïŒãå®çŸ©ããŠããŸãã
-
-
é¢šè¹ (
pink
,blue
,green
,orange
)- ããããã®
<body>
ã¿ã°ã§é¢šè¹ã衚çŸãgravcomp
ïŒéåè£åïŒå±æ§ã«ããã空æ°ãšããªãŠã ã®æµ®åã®æ¯çãåæ ãããŸãã - å颚è¹ã
<freejoint/>
ãæã¡ãæ¥åäœã®åœ¢ç¶ã<geom>
ã¿ã°ã§å®çŸ©ãããŠããŸãã -
<site>
ã¿ã°ã¯ãåŸã®è ±ã®æ¥ç¶ãã€ã³ããšããŠäœ¿ãããŠããŸãã
- ããããã®
5. è ±ïŒTendonïŒã®å®çŸ©
<tendon>
ã¿ã°
<tendon>
<spatial range="0 0.6">
<site site="pink"/>
<site site="weight1"/>
</spatial>
...
</tendon>
-
spatial ã¿ã°
å<spatial>
èŠçŽ ã¯ã2ã€ã®<site>
ãæ¥ç¶ããŠãããç©ççãªææïŒäŒžã³çž®ã¿ã®å¶éïŒãã·ãã¥ã¬ãŒã·ã§ã³ããŸãã-
range
屿§ã§èš±å®¹ããã䌞ã³çž®ã¿ã®ç¯å²ãèšå®ãããŠããŸãã - äŸãã°ãæåã®
<spatial>
ã§ã¯ã颚è¹ïŒpink
ïŒãšéãã®äžéšïŒweight1
ïŒãæ¥ç¶ãããŠããŸãã
-
Discussion