はじめに
公式ドキュメントを読んでも使い方がよくわからないことが結構あったので、サンプルコードを読んでmujoco_pyの使用例をまとめた。
使用例
シミュレータのインスタンスを作る
import mujoco_py
model = mujoco_py.load_model_from_path(fullpath)
sim = mujoco_py.MjSim(model, nsubsteps=n_substeps)
シミュレータの状態を取得する
state = copy.deepcopy(sim.get_state())
ビュアーからレンダー結果を見る
viewer = mujoco_py.MjViewer(sim)
viewer.render()
ビュアーには写さずRGB画像としてレンダー結果を受け取る
viewer = mujoco_py.MjRenderContextOffscreen(sim, device_id=-1)
viewer.render()
data = viewer.read_pixels(width, height, depth=False)
ビュアーを閉じる
viewer = None
微小時間dtを得る
dt = sim.model.opt.timestep * sim.nsubsteps
# timestepは1stepあたりにかかる時間で、nsubstepsはステップ中に呼ばれるサブステップ数
微小時間dtからFPSを求める
FPS = int(np.round(1.0 / dt))
シミュレーションをリセットする
sim.set_state(initial_state)
sim.forward() # xpos, qposを変更したら呼ぶ必要がある
シミュレーションを進める
sim.step()
関節を制御する #1
for i in range(action.shape[0]):
sim.data.ctrl[i] = action[i]
関節を制御する #2
sim.data.set_joint_qpos('object0:joint', object_qpos)
site
タグのついたパーツのタスク空間中の位置と速度を取得する
pos = self.sim.data.get_site_xpos('hoge_site')
velp = self.sim.data.get_site_xvelp('hoge_site')
velr = self.sim.data.get_site_xvelr('hoge_site')
関節変位と速度を得る
for name in sim.model.joint_names:
qpos = sim.data.get_joint_qpos(name)
qvel = sim.data.get_joint_qvel(name)
パーツの名前をIDに変換する
# from body name to id
body_id = sim.model.body_name2id('robot0:gripper_link')
xpos = sim.data.body_xpos[body_id]
# from site name to id
site_id = self.sim.model.site_name2id('target0')
pos = sim.model.site_pos[site_id]
モーションキャプチャの位置を設定する
sim.data.set_mocap_pos('robot0:mocap', gripper_target)
sim.data.set_mocap_quat('robot0:mocap', gripper_rotation)]