要約
pip install mujocoで MuJoCo 3.2.0 をインストールし、以下でバージョン確認を行います:python -c "import mujoco; print(mujoco.__version__)"→3.2.0- MJCF(XML形式) を用いてロボットをモデル化します。タグとして
<world>、<body>、<joint>、<actuator>を使用します。例:最小限のヒューマノイド XML - 物理パラメータを
<contact>(摩擦、剛性)および<solver>(反復回数、許容誤差)タグで調整します。デフォルトの摩擦係数はmu=0.5、mu2=0.0です。 - MJX を用いて GPU並列シミュレーション を実行します(CUDA が必要)。例:
python -m mujoco.mjx_simulate --gpu - Gymnasium の環境を
gymnasium.make("Humanoid-v4")で読み込み、Stable Baselines3 を用いて学習を行います。 - シミュレーションから現実への転用 においては、システム同定(例:
scipy.optimizeを用いたパラメータ調整)を行い、データはmjData構造体でログを記録します。
1. インストールとMJCFの基礎
MuJoCo の Python バインディング (mujoco) は最速のスタート方法です。MJCF(MuJoCo XML フォーマット) は物理エンジンに対応した CAD ファイルと考えることができます。
MuJoCo 3.2.0 のインストール
# Linux (Ubuntu/Debian)
sudo apt-get install -y libgl1-mesa-dev libxinerama-dev libxcursor-dev
pip install mujoco==3.2.0 # 安定版に固定
# インストール確認
python -c "import mujoco; print(f'MuJoCo {mujoco.__version__} が正常にインストールされました')"
期待される出力:
MuJoCo 3.2.0 が正常にインストールされました
MJCF:XML の基盤
MuJoCo モデルは XML ファイル(.xml)で定義されます。以下は 2D ペンダulum の最小限の例です:
<mujoco model="pendulum">
<worldbody>
<light name="light" pos="0 0 3"/>
<camera name="camera" pos="0 0 1.5" xyaxes="1 0 0 0 1 0"/>
<body name="pendulum" pos="0 0 0">
<joint name="hinge" type="hinge" axis="0 0 1"/>
<geom name="bob" type="sphere" size="0.1" rgba="0.8 0.6 0.4 1"/>
</body>
<actuator name="motor">
<motor joint="hinge"/>
</actuator>
</worldbody>
</mujoco>
主要タグ:
<worldbody>:物理オブジェクトのルートコンテナ。<body>:剛体(例:ロボットのリンク)。<joint>:自由度を定義(hinge、slide、ball)。<geom>:衝突形状(box、sphere、mesh)。<actuator>:モーター、力、トルク。
注意点:タグを閉じ忘れると(例:<body> に </body> がない場合)シミュレーターがクラッシュします。検証ツールとして XMLLint をご利用ください。
2. ロボットのモデリング:ボディ、ジョイント、アクチュエータ
ここでは 7自由度ロボットアーム を MJCF で構築します。以下のポイントに注目してください:
- ボディ:質量・慣性を持つリンク。
- ジョイント:ボディを制約で接続。
- アクチュエータ:力・トルクを適用。
例:7自由度アームのMJCF
<mujoco model="arm7dof">
<asset>
<mesh file="arm.mesh" scale="0.1"/>
</asset>
<worldbody>
<!-- ベース -->
<body name="base" pos="0 0 0.5">
<freejoint/>
<geom type="box" size="0.2 0.2 0.1" rgba="0.5 0.5 0.5 1"/>
</body>
<!-- アームリンク(ジョイントで接続) -->
<body name="link1" pos="0 0 0.3">
<joint name="joint1" type="hinge" axis="0 1 0" damping="0.1"/>
<geom type="box" size="0.1 0.1 0.3" rgba="0.8 0.6 0.4 1"/>
</body>
<!-- リンク 2-7 を同様に追加... -->
<!-- アクチュエータ(各ジョイントに1つ) -->
<actuator name="motor1">
<motor joint="joint1" gear="100"/>
</actuator>
</worldbody>
</mujoco>
重要な設定:
damping:ジョイントの振動を抑制(デフォルト:0.0)。gear:ギア比をシミュレート(例:gear="100"は 100:1 の減速)。size:形状の寸法(<mesh>を使用する場合は CAD と一致させる必要があります)。
注意点:MuJoCo は SI 単位(メートル、キログラム、秒)を使用します。size="0.1" のボックスは幅 10cm です。
3. 接触、摩擦、ソルバーの設定
MuJoCo の物理精度は 接触モデリング と ソルバーの調整 に依存します。
接触特性
<contact> タグを編集して摩擦、反発係数(バウンス)、剛性を制御します:
<contact>
<geom1>body1</geom1>
<geom2>body2</geom2>
<friction>0.3 0.01 0.001</friction> <!-- mu, mu2, mu3 -->
<restitution>0.5</restitution> <!-- バウンスの強さ(0-1) -->
<solref>0.01 1.0</solref> <!-- ソルバー参照(貫入、剛性) -->
</contact>
デフォルト値:
- 摩擦:
mu=0.5、mu2=0.0(静摩擦/動摩擦)。 - 反発係数:
0.0(バウンスなし)。
ソルバーの調整
安定性のためソルバーを調整します:
<solver>
<iterations>100</iterations> <!-- デフォルト:100 -->
<tolerance>1e-8</tolerance> <!-- デフォルト:1e-8 -->
<constraint>LRP</constraint> <!-- "LRP" または "NCP" -->
</solver>
調整が必要なケース:
- 高い反復回数(200回以上):複雑な接触(例:デキサラスハンド)に適応。
- 低い許容誤差(1e-6):高速だが精度が低下。
注意点:シミュレーションが 爆発的に不安定 になる場合は solref を増やし、反復回数を減らします。 剛性が高い 場合は restitution を下げます。
4. GPU並列シミュレーションのためのMJX
MJX(MuJoCo eXtended) は GPU 加速並列シミュレーション を可能にし、強化学習(RL)トレーニングに不可欠です。
MJX のインストール
pip install mujoco==3.2.0 mjx # mujoco>=3.2.0 に同梱
CUDA サポートの確認:
python -c "import mjx; print(mjx.cuda.is_available())" # True を返す必要があります
GPU シミュレーションによるペンダulum の実行
import mjx
import numpy as np
# モデルの読み込み
model = mjx.make("pendulum.xml")
sim = mjx.Sim(model)
# 100ステップ実行
for _ in range(100):
sim.step()
期待される出力:ペンダulum が滑らかに揺れる(sim.render() で可視化)。
注意点:MJX は CUDA 11.8 以上 が必要です。互換性を確認するには:
nvcc --version
5. Gymnasium を用いた強化学習の実行
MuJoCo は Gymnasium の ロボティクスベンチマーク(例:Humanoid-v4)を駆動します。以下に RL エージェントのトレーニング方法を示します。
Gymnasium と MuJoCo のインストール
pip install gymnasium[mujoco] # MuJoCo 3.2.0 を同梱
環境の読み込みとエージェントのトレーニング
import gymnasium as gym
from stable_baselines3 import PPO
# 環境の初期化
env = gym.make("Humanoid-v4", render_mode="human")
obs, _ = env.reset()
# PPO を用いてトレーニング
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=10000)
# テスト
obs, _ = env.reset()
for _ in range(1000):
action, _ = model.predict(obs)
obs, _, terminated, truncated, _ = env.step(action)
if terminated or truncated:
obs, _ = env.reset()
主要な環境:
Humanoid-v4:3D ヒューマノイドの移動。Ant-v4:四足歩行。Reacher-v4:2D アームのリーチング。
注意点:Gymnasium の MuJoCo 環境は デフォルトで GPU を使用 します。CUDA エラーが発生した場合は以下のように設定します:
env = gym.make("Humanoid-v4", render_mode=None, use_gpu=False)
6. シミュレーションから現実への転用とシステム同定
MuJoCo の物理モデルは 完全ではありません。シミュレーションから現実への転用には以下の手法が有効です:
- システム同定:MuJoCo のパラメータを実際のハードウェアに合わせる。
- ドメインランダマイゼーション:MuJoCo のパラメータをランダム化してトレーニングを行う。
システム同定の例
scipy.optimize を用いて MuJoCo の質量・慣性を実データに合わせます:
import mujoco
import numpy as np
from scipy.optimize import minimize
# モデルとデータの読み込み
model = mujoco.MjModel.from_xml_path("robot.xml")
data = mujoco.MjData(model)
# コスト関数(例:シミュレーションと実トルクの誤差)
def cost_function(params):
# モデルパラメータの更新(例:質量の変更)
model.body_mass[0] = params[0]
# シミュレーション実行と誤差計算
error = simulate_and_compare(data)
return error
# 最適化
result = minimize(cost_function, x0=[1.0], method="L-BFGS-B")
print(f"最適な質量: {result.x[0]} kg")
ドメインランダマイゼーション
トレーニング中に MuJoCo のパラメータをランダマイズします:
def randomize_model(model):
# 摩擦のランダマイズ
model.contact.mu = np.random.uniform(0.3, 0.7)
model.contact.mu2 = np.random.uniform(0.0, 0.1)
# 質量のランダマイズ
model.body_mass = model.body_mass * np.random.uniform(0.9, 1.1)
return model
注意点:シミュレーションから現実への転用は 未モデル化のダイナミクス(例:ケーブル摩擦)により失敗することがあります。まず 質量・慣性を同一 に設定し、徐々にランダマイズを行ってください。
7. 可視化とログ記録
MuJoCo の標準ビューアは軽量ですが効果的です。
ビューアの起動
import mujoco
import mujoco.viewer
model = mujoco.MjModel.from_xml_path("arm7dof.xml")
data = mujoco.MjData(model)
# ビューアの作成
with mujoco.viewer.launch_passive(model, data) as viewer:
while viewer.is_running():
step = not viewer.cam_move
mujoco.mj_step(model, data)
操作方法:
- 左クリック + ドラッグ:カメラの回転。
- 右クリック + ドラッグ:パン。
- スクロール:ズーム。
分析用データのログ記録
シミュレーションデータを .mat ファイルに保存します:
import scipy.io
# シミュレーションとログ記録
data = mujoco.MjData(model)
for _ in range(1000):
mujoco.mj_step(model, data)
# ジョイント位置の保存
joint_positions = data.qpos.copy()
# MATLAB ファイルに保存
scipy.io.savemat("simulation_data.mat", {"qpos": joint_positions})
注意点:ビューアは Python の実行をブロック します。バックグラウンドレンダリングには launch_passive を使用してください。
次のステップ
- カスタムロボットの構築:7自由度アーム(第2節)から始め、Blender などの CAD ツールに MJCF をエクスポートします。
- RL エージェントのトレーニング:Stable Baselines3(第5節)を用いてロボットにスキル(例:リーチング)を教えます。
- ハードウェアへのデプロイ:システム同定(第6節)を用いて、MuJoCo を実際のロボットに合わせます。
Physical AI インフラ—シミュレーターの調整からエッジデプロイまで—について、Hyperion Consulting のツールと専門知識がパイプラインを加速します。お問い合わせください
