Go2とIsaac Sim

Isaac SimでのDora-rs駆動Go2のテスト

デモはこちらで利用可能。注意: 登録が必要です。

概要

Go2はUnitree社製の四足歩行ロボットです。このロボットはIsaac Simで利用可能であり、独自のシミュレーションを比較的簡単に開始できます。

このデモでは、Go2に複数の環境でウェイポイントを順番にナビゲートさせるウェイポイントミッションを実施します:

  • 高さが変化する生成されたピラミッド(0.1m、0.7m、1.1m)
ステップ10
ステップ70
ステップ110
  • 3つの異なる環境: 鉄道線路、石階段、発掘現場
鉄道線路
石階段
発掘現場

完全なプロジェクトソースはGitHubで利用可能です。プロジェクトは以下を使用して実行されます:

  • dora-rs(ロボティクスフレームワーク)
  • Isaac Sim(シミュレータ)
  • pytest(テスト作成)
  • Artefacts(テスト自動化と結果レビュー)

テストには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

この関数は:

  1. シーンをロード - 指定された環境と難易度レベル(例: ピラミッドのステップ高さ)でload_sceneメッセージを送信します

  2. ウェイポイントを追跡 - ウェイポイントフレームのリストを維持し、ロボットが現在ターゲットにしているものを監視します

  3. ロボットポーズを監視 - robot_poseイベントをリッスンし、Transformsヘルパーを使用して現在のターゲットウェイポイントまでの距離を計算します

  4. ウェイポイント完了を検出 - ロボットがウェイポイントの0.6m以内に達すると、次のウェイポイントに進みます

  5. スタック状態を検出 - StuckDetectorを使用して、ロボットが5秒間進捗がない場合にテストを失敗させます

  6. メトリックを記録 - 完了時間を秒単位でキャプチャし、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.jsonmetrics:で定義)に保存され、その後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から次のヘルパーを使用しました:

最終更新 18.01.2026: Go2 (#106) (0f893e6)