open-rdc/IsaacLabInvestigation

既存環境への外部からのモデルのインポート方法の調査

Opened this issue · 3 comments

Isaac Labを使用する上で、今後G1やH1等の既存のモデル以外にも各々で用意したモデルを使用する必要が出てくる。そのため外部からモデルをインポートする方法を調査する

  • インポートを行う前にIsaac Labは基本的にusd形式のファイルを使用している。そのためまずは公式のマニュアルを参考にconert_urdf.pyを使用することでurdf形式からusd形式への変換を行う。
  1. Isaac Labのディレクトリ内に自分がインポートしたいurdfファイルをとそのメッシュファイル等が入ったディレクトリを作成する
  2. 以下を実行しurdfファイルをusdファイルに変換する。保存するディレクトリは自由で構わないと思われる。(自分はマニュアルの保存先そのままにした)
./isaaclab.sh -p source/standalone/tools/convert_urdf.py \
  your_urdf_directory/your_urdf_name.urdf \
  source/extensions/omni.isaac.lab_assets/data/Robots/ANYbotics/your_usd_name.usd \
  --merge-joints \
  --make-instanceable

デモ環境へのインポート方法

モデルについて

  • 今回はunitreeのロボットのモデルを出現させるデモ環境であるbipeds.pyにTOBOTIS-OP2のモデルをインポートした
  • 各環境にインポートするモデルのパスはコード内に直接記述されているわけではなくモジュールの形で記述されているbipeds.pyでは以下がその部分に当たる
from omni.isaac.lab_assets.cassie import CASSIE_CFG  # isort:skip
from omni.isaac.lab_assets import H1_CFG  # isort:skip
from omni.isaac.lab_assets import G1_CFG  # isort:skip
  • from omni.isaac.lab_assetsの部分はパスとしてはIsaac Lab/source/extensions/omni.isaac.lab_assets/omni/isaac/lab_assetsとなり、lab_assetsのディレクトリ内にあるファイルからモデルの情報を呼び出している。H1やG1の場合はunitree.pyから呼び出している。 unitree.pyの場合含め既存のモデルのUSDパスには基本的にISAACLAB_NUCLEUS_DIRというモジュール化されたパスがあり、そこから各モデルのパスへと繋がっている。しかしこのパスを辿ってもGitHubで公開されている範囲ではモデルのファイルは存在せず、モデルはNVIDIA Nucleusというサーバー上にあり、現時点(2024/8/17)ではこのサーバー上のモデルのファイルの中身を確認する方法は調査できていない。
  • モデルを追加する場合は絶対にISAACLAB_NUCLEUS_DIRのパスが必要というわけではない。unitree.py含め、各モデルを記述したファイルに必ずあるusd_path=の部分にはUSDファイルを作成した際に保存したディレクトリとファイル名source/extensions/omni.isaac.lab_assets/data/Robots/ANYbotics/your_usd_name.usdを指定すれば良い。
  • ファイル内の各ロボットの項目の内容は基本的にそのロボットのモデルの関節名やその初期位置、目標角度等を記述している。ヒューマノイドロボットについてはunitree.pyファイルのH1やG1の項目が非常に参考にでき、各項目に自分がインポートしたいロボットの関節名等を当てはめていくだけである。

デモ環境へのインポート

  1. まず先ほど紹介したbipeds.pyのモジュール化されたパスに自身のモデルのパスを追加する。unitree.pyに自身のモデルの情報を記述した場合は以下のようになる
from omni.isaac.lab_assets.cassie import CASSIE_CFG  # isort:skip
from omni.isaac.lab_assets import H1_CFG  # isort:skip
from omni.isaac.lab_assets import G1_CFG  # isort:skip
from omni.isaac.lab_assets import ROBOTISOP2_CFG # 追加分

YOUR_USD_CFGはunitree.py内で指定する言わばIsaac Lab内でのこのロボットの呼び名である。
2. 以下のように追加することで4体目のモデルを配置する座標が決定できる

    origins = torch.tensor([
        [0.0, 0.0, 0.0],
        [0.0, 1.0, 0.0],
        [0.0, 2.0, 0.0],
        [0.0, 3.0, 0.0], # 追加分
    ])

3.以下のように追加したモデルのこの環境での名称やパスを指定する基本的にここは各固有の名称以外は他のモデルと同様で構わない

    # Robots
    cassie = Articulation(CASSIE_CFG.replace(prim_path="/World/Cassie"))
    h1 = Articulation(H1_CFG.replace(prim_path="/World/H1"))
    g1 = Articulation(G1_CFG.replace(prim_path="/World/G1"))
    robotis_op2 = Articulation(ROBOTISOP2_CFG.replace(prim_path="/World/robotis_op2")) # 追加分
    robots = [cassie, h1, g1, robotis_op2]

4../isaaclab.sh -p source/standalone/demos/bipeds.pyを実効すると以下のようにモデルをインポートすることができる

既存学習環境へのインポート方法

  • 既存のG1の平地歩行を行う学習環境にROBOTIS-OP2のモデルをインポートして学習を行えるようにする。

モデルについて

  • モデルの情報は基本的にデモ環境へのインポートに使用したものをそのまま使用する。

既存学習環境へのインポート方法

  • G1の平地歩行を行う環境であるflat_env_cfg.pyはその中にはモデルを呼び出すモジュールやモデルの報酬等の情報は記述されていない。記述されているのは同じディレクトリ内にあるrough_env_cfg.pyの中であり、flat_env_cfg.pyは以下のモジュールによってrough_env_cfg.pyからモデルに関する情報を呼び出している
from .rough_env_cfg import G1RoughEnvCfg
  1. rough_env_cfg.py内の以下のG1_MINIMAL_CFGの部分をunitree.pyで指定した自身のロボットの名称に変更する
from omni.isaac.lab_assets import G1_MINIMAL_CFG  # isort: skip
  1. class G1Rewards~G1RoughEnvCfgについては各クラス内のbody_names=joint_names=の項目を自身のモデルのlinkの名称やjointの名称に変更すれば良い。
  2. flat_env_cfg.py内に唯一記述されているモデルについての部分が以下になっており、この部分を自分のモデルの名称に変更する
        self.rewards.dof_torques_l2.params["asset_cfg"] = SceneEntityCfg(
            "robot", joint_names=[".*_hip_.*", ".*_knee_joint"]
        )

学習の実行

  • あくまで既存のG1で平地歩行を行う学習環境に自身のモデルをインポートしているだけなので学習を開始する際に入力するコマンドは以下のように既存のものそのままである。
./isaaclab.sh -p source/standalone/workflows/rsl_rl/train.py --task Isaac-Velocity-Flat-G1-v0 --headless

学習済みモデルを用いた制御

  • こちらも既存のコマンドと同様である
./isaaclab.sh -p source/standalone/workflows/rsl_rl/play.py --task Isaac-Velocity-Flat-G1-v0 --num_envs 32 --load_run 2024-08-16_15-58-55 --checkpoint model_1499.pt

全体的に不自然さはまだ残っているがそれでも、既存の環境のモデルに関する部分を書き換えて1500エピソード学習を行っただけでここまで動けるようになっている。あとは報酬のスケールや各関節の目標位置などの調整である。(自然な歩行をさせる場合このパラメータ調整が一番重要で大変)

ROBOTIS-OP2_1500episode.webm