LoginSignup
0
1

はじめに

本記事は以下の人を対象としています.

  • 筋骨格シミュレータに興味がある人
  • MuJoCoに興味がある人

本記事では2_Load_policy.ipynbをGoogle Colabで実行した際の手順と結果に関してまとめる.

MyoSuiteとは

MuJoCoを学習モジュールとして組み込んだ筋骨格シミュレータ

2024年にICRAにてworkshopを展開
https://sites.google.com/view/myosuite/myosymposium/icra24

Tutorial Notebook

実施事項

Tutorialに記載のコードを1つずつ試して, Errorになったところは都度修正版を記載する.

ライブラリのinstallと環境設定

!pip install -U myosuite
# mjrlとgym==0.13のinstall
!pip install tabulate matplotlib torch gym==0.13 git+https://github.com/aravindr93/mjrl.git@pvr_beta_1vk
%env MUJOCO_GL=egl

環境変数MUJOCO_GL=eglを設定しないとmujoco.FatalError: gladLoadGL errorが出る.
https://github.com/Farama-Foundation/Gymnasium/issues/501#issuecomment-1730755393

ライブラリのimportと結果表示の関数

from myosuite.utils import gym # importが上手くいくと"MyoSuite:> Registering Myo Envs"と表示される
import skvideo.io
import numpy as np
import os

from IPython.display import HTML
from base64 import b64encode

def show_video(video_path, video_width = 400):

  video_file = open(video_path, "r+b").read()

  video_url = f"data:video/mp4;base64,{b64encode(video_file).decode()}"
  return HTML(f"""<video autoplay width={video_width} controls><source src="{video_url}"></video>""")

詳細はこちらを参照

policyの読み込み

必要となるpickleファイルを用意するために、MyoSuiteのレポジトリを同じディレクトリ階層にclone

pth = 'myosuite/myosuite/agents/baslines_NPG/'

policy = pth+"myoElbowPose1D6MExoRandom-v0/2022-02-26_21-16-27/36_env=myoElbowPose1D6MExoRandom-v0,seed=1/iterations/best_policy.pickle"

import pickle
pi = pickle.load(open(policy, 'rb'))

modelのloadとpolicyの結果確認

env = gym.make('myoElbowPose1D6MExoRandom-v0')
# define a discrete sequence of positions to test
AngleSequence = [60, 30, 30, 60, 80, 80, 60, 30, 80, 30, 80, 60]
env.reset()
frames = []
for ep in range(len(AngleSequence)):
    print("Ep {} of {} testing angle {}".format(ep, len(AngleSequence), AngleSequence[ep]))
    env.unwrapped.target_jnt_value = [np.deg2rad(AngleSequence[int(ep)])]
    env.unwrapped.target_type = 'fixed'
    env.unwrapped.weight_range=(0,0)
    env.unwrapped.update_target()
    for _ in range(40):
        frame = env.sim.renderer.render_offscreen(
                        width=400,
                        height=400,
                        camera_id=0)
        frames.append(frame)
        o = env.get_obs() # observation
        a = pi.get_action(o)[0] # action
        next_o, r, done, *_, ifo = env.step(a) # take an action based on the current observation
env.close()

os.makedirs('videos', exist_ok=True)
# make a local copy
skvideo.io.vwrite('videos/exo_arm.mp4', np.asarray(frames),outputdict={"-pix_fmt": "yuv420p"})
show_video('videos/exo_arm.mp4')

出力結果(GIFにしているので連続だが実際は19秒ほど)
2_load_policy-demo.gif

何をやっているのか

  • 腕を伸ばした状態からAngleSequenceで設定した分だけ腕を曲げた状態を目標状態に設定
  • 1.6secごとに姿勢を変化、policyに従いactuator側にforceを生成

参考資料

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1