Open aiba0921 opened 3 months ago
./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の項目が非常に参考にでき、各項目に自分がインポートしたいロボットの関節名等を当てはめていくだけである。
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内でのこのロボットの呼び名である。
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`を実効すると以下のようにモデルをインポートすることができる
<img src="https://github.com/user-attachments/assets/164e6755-f209-4dee-b2e1-cd157055dfc9" width="320">
from .rough_env_cfg import G1RoughEnvCfg
G1_MINIMAL_CFG
の部分をunitree.pyで指定した自身のロボットの名称に変更する
from omni.isaac.lab_assets import G1_MINIMAL_CFG # isort: skip
body_names=
やjoint_names=
の項目を自身のモデルのlinkの名称やjointの名称に変更すれば良い。 self.rewards.dof_torques_l2.params["asset_cfg"] = SceneEntityCfg(
"robot", joint_names=[".*_hip_.*", ".*_knee_joint"]
)
./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エピソード学習を行っただけでここまで動けるようになっている。あとは報酬のスケールや各関節の目標位置などの調整である。(自然な歩行をさせる場合このパラメータ調整が一番重要で大変)
Isaac Labを使用する上で、今後G1やH1等の既存のモデル以外にも各々で用意したモデルを使用する必要が出てくる。そのため外部からモデルをインポートする方法を調査する