はじめに
東京科学大学の福田です。現在チームMA-KINGにて、ロボット競技会CoREにおける4足歩行ロボット開発を行っています。
本ブログでは、Isaac Labの地形生成機能に着目して以下の3点の紹介をします。
- Isaac Labで提供されている複雑地形の種類についての解説
- CoRE用に独自に作成した地形についての解説
- usdファイルで設計した地形の読み込みによるCoRE競技用フィールドにおけるストライダーゾーン走破能力の検証設定について
Terrain (地形) 設定について
多くの強化学習による4足歩行制御では、ロボットが多様な環境を走破できるように、simulator上に様々な地形を生成します。
Isaac Labでは、Mesh, HeightFieldの2種類を使った地形生成の機能を提供してくれています。
- Mesh: trimeshを使ったmesh生成機能
- HeightField: XY平面上の各座標における高さを2次元Matrixで表現して地形生成する機能
isaaclab.terrains — Isaac Lab Documentation
Isaac Labではさらに、よく使うであろう地形についても多く標準で提供してくれています。
ここでは中でも、Isaac LabのRough環境のサンプル(Unitree go2, ANYmal などの学習用サンプル)として使用されているデフォルトの複雑環境内の地形(下記)を紹介します。
ピラミッド型地形
Config: MeshPyramidStairsTerrainCfg, MeshInvertedPyramidStairsTerrainCfg
isaaclab.terrains — Isaac Lab Documentation
ピラミッド型で、階段のような地形です。
主要なパラメータとしては、
- step_height_range: 階段の高さの範囲
- curriculum学習を有効化する場合は、範囲の最小値から最大値まで上がっていくような環境を生成し、段階的に学習する
- 有効化しない場合は、指定した範囲の均等分布からランダムな値を取得して地形を生成
- step_width: 階段の幅
があり、ロボットのサイズによって変更するのが良いです。
ランダムグリッド地形
Config: MeshRandomGridTerrainCfg
isaaclab.terrains — Isaac Lab Documentation
頻繁に足が引っかかるような凸凹地形を生成します。
主要なパラメータは
- grid_height_range: ランダムに決定するグリッドの高さの範囲
- curriculum学習では、サンプルする範囲の上限値を、設定した最大値まで徐々に上げていくように段階的に環境を生成する
- grid_width: グリッド幅
ランダムノイズ地形
Config名: HfRandomUniformTerrainCfg
isaaclab.terrains — Isaac Lab Documentation
均等分布からサンプルされたランダムな高さの地形を生成することで、ランダムグリッドとは異なるタイプの凸凹地形を生成することができます。
主要なパラメータは、
- noise_range: ランダムサンプルする高さの範囲
- curriculum学習を有効化しても無効化しても、常にこの範囲からランダムサンプルする
- noise_step: 2点間の高さの差の最小値 (noise_rangeからサンプルするときの離散化パラメータ)
スロープ型地形
Config名: HfPyramidSlopedTerrainCfg, HfInvertedPyramidSlopedTerrainCfg
isaaclab.terrains — Isaac Lab Documentation
坂で構成された山・谷の地形を生成することができます。
主要なパラメータは
- slope_range: 斜面の角度 (radian) の範囲
- curriculum学習では、斜面の角度が段々と大きくなるような環境を生成し、段階的に学習する。
各地形の生成割合について
それぞれのconfigは proportion というパラメータをもっており、この値を変更することで学習における各地形の生成割合を変更することができます。
例はこちらを参照ください。
CoRE Terrainの作成
CoRE競技用に作成した環境については、core-env ブランチから確認することができます。
GitHub – CoRE-MA-KING/mevius_isaac_lab at core-env
CoRE競技フィールドに似たランダムな地形生成
CoREの競技フィールドのストライダーゾーンは下の画像のようになっており、2箇所の段差を超えることが求められています。
先に紹介したピラミッド型地形やランダムグリッド型地形でもある程度走破能力の高いポリシーが得られますが、機体の姿勢が上下を繰り返す環境でより安定して走破できるように作成することとしました。
今回作成した地形は、段差の高さの範囲に加えて、段差の幅、段差間の幅をランダムに生成することができます。
主要なパラメータは
- step_height_range: 段差の高さの範囲
- curriculum学習を有効化する場合は、範囲の最小値から最大値まで上がっていくような環境を生成し、段階的に学習する
- step_width_range: ランダムに決定する段差の幅の範囲
- step_margin_range: ランダムに決定する段差”間”の範囲
ストライダーゾーンの段差は、高さが0.1m、1つ目の段差の幅が0.3m、2つ目の幅が0.4m、段差間が0.4mであったため、以下のようにパラメータを設定しました。
- step_height_range: 0.02~0.17
- step_width_range: 0.25~0.45
- step_margin_range: 0.35~0.45
その結果が画像のような地形を生成することができました。
mevius_isaac_labリポジトリのcore-envブランチのこちらから実装を確認できます。(前者: 地形生成部分, 後者: 地形設定部分)
続いて、作成した地形を確認する方法についてです。
この新しく作成した地形を含む環境は、以下のタスク名で実装しています。
- train時: Isaac-Velocity-CoRE-Mevius-v0
- play時: Isaac-Velocity-CoRE-Mevius-Play-v0
実際にIsaac Sim上で確認したい方は以下の一連のコマンドを実行してもらえればOKです。
cd /path/to/isaaclab_ws/ # isaaclabのワークスペースフォルダに移動
cd mevius_isaac_lab
git checkout core-env # core用環境ブランチ
cd ..
source `poetry env info --path`/bin/activate # 仮想環境の有効化
python mevius_isaac_lab/scripts/rsl_rl/train.py --task=Isaac-Velocity-CoRE-Mevius-v0
もしRough環境で既に学習したポリシーを持っていて、そちらで確認したい場合は下記手順を実行してください。
- logs/rsl_rl/mevius_core フォルダを作成
- mevius_roughフォルダ内の結果をmevius_coreフォルダにコピー
- 以下のコマンドでplayタスクを実行して確認
python mevius_isaac_lab/scripts/rsl_rl/play.py --task=Isaac-Velocity-CoRE-Mevius-Play-v0
World座標系のY軸正方向にずっと行くと今回作成した地形を確認することができます。
CoREストライダーゾーン走破実験環境
今回、作成したポリシーの走破能力をシミュレーター上のフィールドにて確かめるための環境を作成しました。こちらを活用することによって、得られたポリシーの競技フィールドにおける走破性能をある程度推測することが可能になります。
確認にあたり、Isaac Sim 使って環境をUSDファイル形式にて作成しました。
USDはUniversal Scene Descriptionと呼ばれる3Dシーンの記述方式で、Isaac Sim (Nvidia Omniverse)にて採用されている記述方式です。
作成した環境のusdファイルはこちらにあります。
続いて、作成したUSDフォーマットの環境を読み込む部分についてです。
学習環境の地形設定に使用するTerrainImporterCfg は、 terrain_typeとして、generator, plane, usdを選択可能です。
isaaclab.terrains — Isaac Lab Documentation
Rough環境では、”generator”を活用して様々な地形をsubterrainとして生成していました。
Flat環境は、”plane”を使用しています。
今回は”usd”を使用して環境を読み込み、ストライダーゾーンをsim内で走らせることで性能を確認します。
このとき、ストライダーゾーンがゴールまで走破できることを確認したいので、
- 常にまっすぐ進み続ける
- ゴールライン (スタート地点から6.6m ) を超えたらリセットする
ように実装しました。
実装はこちら(MeviusCoREFieldEnvCfg_PLAY)から確認できます。
Isaac Sim上で確認したい方は以下の一連のコマンドを実行してもらえればOKです。
cd /path/to/isaaclab_ws/ # isaaclabのワークスペースフォルダに移動
cd mevius_isaac_lab
git checkout core-env # core用環境ブランチ
cd ..
source `poetry env info --path`/bin/activate # 仮想環境の有効化
# logs/rsl_rl/mevius_core フォルダ内に学習結果があることを確認した後に実行
python mevius_isaac_lab/scripts/rsl_rl/play.py --task=Isaac-Velocity-CoRE-Field-Mevius-Play-v0
こちらを実行したとき動画がこのようになっています。
足がひっかかってもリアクティブに足を上にあげることで段差を超える様子や、バランスを崩しかけても耐えるような様子を確認することができます。
まとめ
今回の記事では、IsaacSim + IsaacLab環境における地形生成機能について紹介しました。MEVIUSがどのような環境を走破できるようになってほしいか、という点で使用する環境や各環境のパラメータを選択するだけでなく、特定のタスクに特化した環境を自分で作成する例についても紹介しました。
次回の記事では、MA-KINGのCoRE出場までの強化学習ベースのポリシー開発記録とどのような変更・改良をしてきたかについて紹介したいと思っております。
ぜひご期待ください!!