Go2とIsaac Sim
デモはこちらで利用可能。注意: 登録が必要です。
概要
Go2はUnitree社製の四足歩行ロボットです。このロボットはIsaac Simで利用可能であり、独自のシミュレーションを比較的簡単に開始できます。
このデモでは、Go2に複数の環境でウェイポイントを順番にナビゲートさせるウェイポイントミッションを実施します:
- 高さが変化する生成されたピラミッド(0.1m、0.7m、1.1m)
- 3つの異なる環境: 鉄道線路、石階段、発掘現場
完全なプロジェクトソースはGitHubで利用可能です。プロジェクトは以下を使用して実行されます:
テストには2つのRLポリシーを使用します: 「baseline」(すべてのウェイポイントに正常に到達することが期待される)と「stumbling」(到達しないことが期待される)。
テストの作成
テストファイルtest_Waypoints_poses.pyには3つのテストが含まれています:
- 最初のテストは環境が正しくロードされたかどうかを確認します。
シーンローディングテスト
@pytest.mark.clock_timeout(50)
def test_receives_scene_info_on_startup(node):
"""Test that the node receives scene info on startup."""
for event in node:
if event["type"] == "INPUT" and event["id"] == "scene_info":
# Validate scene info message
msgs.SceneInfo.from_arrow(event["value"])
return
他の2つのテストは、ロボットが指定された環境で4つのウェイポイントすべてに正常に到達したかどうかを確認します:
可変高さステップテスト
高さが変化するピラミッド用
@pytest.mark.parametrize("difficulty", [0.1, 0.7, 1.1])
@pytest.mark.clock_timeout(30)
def test_completes_waypoint_mission_with_variable_height_steps(
node, difficulty: float, metrics: dict
):
"""Test that the waypoint mission completes successfully.
The pyramid steps height is configured via difficulty.
"""
run_waypoint_mission_test(
node, scene="generated_pyramid", difficulty=difficulty, metrics=metrics
)
ここではpytestのparametrize機能を使用して異なる高さを設定しています。
フォトリアリスティック環境テスト
3つの「リアリスティック」環境用
@pytest.mark.parametrize("scene", ["rail_blocks", "stone_stairs", "excavator"])
@pytest.mark.clock_timeout(30)
def test_completes_waypoint_mission_in_photo_realistic_env(
node, scene: str, metrics: dict
):
"""Test that the waypoint mission completes successfully."""
run_waypoint_mission_test(node, scene, difficulty=1.0, metrics=metrics)
ここでもpytestのparametrize機能を使用して3つの異なる環境でテストを実行しています。
コアテストロジック
両方のテストが呼び出すrun_waypoint_mission_test()関数は、コアウェイポイントナビゲーションロジックを処理します:
def run_waypoint_mission_test(node, scene: str, difficulty: float, metrics: dict):
"""Run the waypoint mission test."""
transforms = Transforms()
node.send_output(
"load_scene", msgs.SceneInfo(name=scene, difficulty=difficulty).to_arrow()
)
waypoint_list: list[str] = []
next_waypoint_index = 0
metrics_key = f"completion_time.{scene}_{difficulty}"
start_time_ms = None
current_time_ms = None
stuck_detector = StuckDetector(max_no_progress_time=5000) # 5 seconds
for event in node:
# ... event processing loop
この関数は:
-
シーンをロード - 指定された環境と難易度レベル(例: ピラミッドのステップ高さ)で
load_sceneメッセージを送信します -
ウェイポイントを追跡 - ウェイポイントフレームのリストを維持し、ロボットが現在ターゲットにしているものを監視します
-
ロボットポーズを監視 -
robot_poseイベントをリッスンし、Transformsヘルパーを使用して現在のターゲットウェイポイントまでの距離を計算します -
ウェイポイント完了を検出 - ロボットがウェイポイントの0.6m以内に達すると、次のウェイポイントに進みます
-
スタック状態を検出 -
StuckDetectorを使用して、ロボットが5秒間進捗がない場合にテストを失敗させます -
メトリックを記録 - 完了時間を秒単位でキャプチャし、
metrics.jsonファイルに保存します。これはArtefactsダッシュボードに表示されます。
テストはすべてのウェイポイントに到達すると成功し、ロボットがスタックするかタイムアウトすると失敗します。
artefacts.yamlファイル
artefacts.yamlはテストをセットアップし、次のようにパラメトリゼーションします:
project: artefacts-demos/go2-demo
version: 0.1.0
jobs:
waypoint_missions:
type: test
timeout: 20 # minutes
runtime:
framework: other
simulator: isaac_sim
scenarios:
settings:
- name: pose_based_waypoint_mission_test
params:
policy:
- baseline
- stumbling
metrics: metrics.json
run: "uv run dataflow --test-waypoint-poses"
上記のキーポイント:
- テストは
artefacts.yamlファイルのparamsセクションに基づいて2回実行されます。1回は「baseline」ポリシーを使用し、もう1回は「stumbling」ポリシーを使用します。 - 収集されたメトリックは
metrics.json(metrics:で定義)に保存され、その後Artefactsダッシュボードにアップロードされます。 - テストフレームワークは
pytestですが、dora-rsフレームワークを通じて実行されるため、run:キーを使用してArtefactsにテストの起動方法を指示します。‘run’の詳細についてはシナリオ設定を参照してください。
結果
期待通り、Baselineポリシーは成功し、Stumblingポリシーは失敗しました。

成功したウェイポイントミッションのビデオは以下で視聴できます:
Baselineポリシー
ダッシュボードはすべてのテストが成功したことを示し、各環境の完了時間メトリックも表示されています。

テストはビデオ、ログ、および必要に応じてシミュレーションを再生するためのrerunファイルを含む多数のアーティファクトもアップロードしました。

Stumblingポリシー
ダッシュボードはシーンローディングテストのみが成功し、残りは失敗したことを示しています。AssertionError「AssertionError: Robot is stuck and cannot complete the waypoint mission.」も記録されています。

最終結果と関連するメトリックおよびアップロードはこちらで自由に閲覧できます(登録が必要)。
テスト後に利用可能なデータ
- Rerunファイル
- ログ
- 各シーンのビデオと画像
jsonフォーマットのメトリック
Artefactsツールキットヘルパー
このプロジェクトでは、Artefacts Toolkitから次のヘルパーを使用しました:
get_artefacts_params: どのトレーニングポリシーを使用するかを決定するため