これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.

このページの通常のビューに戻る.

サンプルプロジェクト

サンプルプロジェクトに関する詳細情報

Artefacts にサインアップすると、いくつかのサンプルプロジェクトを含む artefacts-demos 組織に自動的に追加されます。

これらのプロジェクトの出力は https://app.artefacts.com/artefacts-demos でアクセスできます。

現在利用可能な例:

1 - OpenRMFの例

OpenRMFにおけるナビゲーション可能性のテスト

OpenRMFの例

デモはこちらからご覧いただけます。 注:登録が必要です

概要

OpenRMFは、大規模建物における複数ロボットの相互運用性のためのフレームワークです。OpenRMFでの一般的な設定タスクの一つは、建物内のロボット用の場所とナビゲーションレーンを設定することです。

ここでは、office worldでOpenRMFデモを実行します。

以下に示すように、このマップにはロボットが移動できる14個のウェイポイントがあります。また、それぞれの充電器上で開始する2台の「tinyRobot」も含まれています。

オフィスワールドのマップ。

このテストデモの目的は、すべてのロボットをすべてのウェイポイントに送り、到着したことを確認することです。失敗は、ロボットがマップ上の場所に到達できないことを示します。

テストはすべてのロボットとウェイポイントを通じて実行されるようにパラメータ化されており、各実行の間にシミュレーションがリセットされます。

ロボットがあらゆる場所に移動するGIF

クイック分析

“tinyRobot2"が"patrol_A1"へ移動

“tinyRobot2"は約40秒で"patrol_A1"に正常に到達しました。ビデオは、テストがどれだけうまく実行されたかについての追加情報を提供します。

“tinyRobot1"が"patrol_B"へ移動

しかし、“tinyRobot1"は120秒のタイムアウト前に"patrol_B"に到達できませんでした。ビデオを使用すると、途中にゴミ箱があることに気づき、ロボットがそこで立ち往生しています。距離グラフもロボットがどこかで立ち往生していることを示しています。

テスト後に利用可能なデータ

テストでは、いくつかのメトリクスを記録します:

  • ゴールに到達するまでの時間(シミュレーション時間)
  • 移動した総距離
  • 平均速度

テストでは複数のデータを記録します:

  • ROSbag
  • Gazeboでアクティブなロボットのビデオ
  • 以下のグラフ:
    • XY位置
    • ゴールまでの距離
    • 時間経過に伴う移動距離
  • ROSbagで利用できないデータを記録するためのPythonからのカスタムデータダンプ
  • テストファイルからのデバッグログ
  • (オプション)シミュレーションとOpenRMFターミナルのstdout

2 - 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.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から次のヘルパーを使用しました:

3 - Lite3 Nav2 ルートテスト

Newton 上の DeepRobotics Lite3 四足歩行ロボットで、記録したルートを Nav2 で走行させるテスト

デモはこちら。注:登録が必要です。 コードはこちら

概要

Lite3 は DeepRobotics 製の四足歩行ロボットです。SDK はこちらで公開されていますが、このデモでは独自のフォークを使用します。このフォークは、/cmd_vel を関節指令に変換する歩行コントローラを提供します。

このデモでは、rviz 上で artefacts-route レコーダーを使って記録したルートに沿って、Nav2 が Lite3 を走行させます。シミュレーション世界は、ルートの地図を押し出して生成します。テストはロボットがすべてのウェイポイントに到達することを検証し、歩行速度でパラメータ化して、Lite3 がどれだけ速くルートを追従できるかを確認します。

このプロジェクトは以下を使用して実行されます:

  • Newton(シミュレータ)、Lite3 と 2D LiDAR 付き
  • ROS 2 Jazzy と Nav2(ナビゲーション)、経路追従コントローラは Regulated Pure Pursuit
  • pytest(テストの記述)
  • artefacts-toolkit-navigation(ルートの記録、世界の生成、ルートの走行)
  • Artefacts(テストの自動化と結果のレビュー)

ルートの記録

ルートとは、地図上の開始姿勢と順序付きのウェイポイントのリストです。RViz 上で手動で一度だけ記録します:

artefacts-route record --map src/nav2_demo/maps/depot.yaml

地図を表示した RViz が開きます。2D Pose Estimate でロボットのスポーン(開始)位置を設定し、Publish Point でウェイポイントを順に追加します。ターミナルで Enter を押すと、ルートが routes/ 以下に保存されます(--name でファイル名を指定できます)。テストは常に最後に記録されたルート(.latest として保存)を走行します。

このデモで使用するルートは Nav2 の depot 地図上のもので、ウェイポイントは 3 つ、歩行距離は約 9 m、最初の 2 つのウェイポイントで 90 度の旋回があります。

format_version: 1
name: 2026-10-20_09-57-23
recorded_at: '2026-10-20T00:58:12+00:00'
ros_distro: jazzy
frame_id: map
map:
  file: src/nav2_demo/maps/depot.yaml
  sha256: 8cd5c8d2cbeaf406d6d5312958cd70b64764726e4acd08ec57b9b5348f2a4544
initial_pose: {x: 9.7662, y: -6.3585, yaw: 0.0}
waypoints:
  - {x: 12.4948, y: -6.4473, yaw: 1.5278}
  - {x: 12.6235, y: -3.4588, yaw: -3.1244}
  - {x: 9.8225, y: -3.507, yaw: -3.1244}

テストの記述

テストファイル test_route.py は、モジュールスコープの pytest フィクスチャの中でルートを一度だけ走行させます。このフィクスチャは:

  1. ルートを読み込む:load_route() で最後に記録されたルートを読み込みます。
  2. 世界を生成する:map_to_world() でルートの地図から 2D 地図を 3D シーンに押し出します。世界は実行のたびに新しく生成され、実行結果と一緒にアップロードされます。
  3. シミュレータを起動する:route_launch_args() で開始姿勢をシミュレータの --set オーバーライドに変換し、Lite3 をルートの開始姿勢にスポーンします。追従カメラと俯瞰ビューの 2 台のカメラが動画を記録します。
  4. 歩行コントローラと Nav2 を起動する:シミュレータの時計が進み始めたら、ルートの地図上で起動します。Nav2 はロボットが立ち上がってから起動します。
  5. ルートを走行する:follow_route() でウェイポイントを Nav2 に送り、各ウェイポイントに到達したか、どれだけ近づいたか、リカバリーが(あれば)何回必要だったかを報告します。
  6. アップロード用のデータを作成する:成否にかかわらず、オドメトリの軌跡を CSV で、3 つのチャート、metrics.json を出力します。

5 つのテストが、ナビゲーションツールキットのアサーションヘルパーを使って RouteResult を検証します:

def test_route_completed(run):
    try:
        assert_route_completed(run.result)
    except AssertionError as error:
        pytest.fail(f'{error}\n--- nav log ---\n{run.harness.control_log_tail(40)}')


def test_each_waypoint_reached(run):
    assert_each_waypoint_reached(run.result, tolerance_m=WAYPOINT_TOLERANCE_M)  # 0.5 m


def test_final_pose(run):
    assert_final_pose(run.result, max_pos_error_m=MAX_FINAL_ERROR_M)  # 0.5 m


def test_min_clearance(run):
    assert_min_clearance(run.result, MIN_CLEARANCE_M)  # 0.2 m from the lidar, roughly the body's half width


def test_max_recoveries(run):
    assert_max_recoveries(run.result, MAX_RECOVERIES)  # 2

artefacts.yaml ファイル

project: artefacts-demos/lite3-navigation-demo
version: 0.1.0

jobs:
  test-nav2-route:
    type: test
    timeout: 15 # minutes
    runtime:
      framework: other
      simulator: newton

    scenarios:
      defaults:
        metrics: metrics.json
        params:
          headless: false  # false shows the Newton viewer
          rviz: true  # true also opens Nav2's RViz view
          linear_vel: [0.2, 0.3, 0.4]  # m/s, one run per value (velocity_smoother caps at 0.4)
      settings:
        - name: nav2_route
          pytest_file: src/nav2_demo/test/test_route.py

上記のポイント:

  • テストは linear_vel の値ごとに 1 回、計 3 回実行されます。この値は Nav2 の FollowPath コントローラが要求する速度を設定します。
  • metrics.json はアップロードされ、Artefacts ダッシュボードに表示されます。
  • pytest_file は Artefacts にテストファイルの場所を指定します。

詳細はシナリオ設定を参照してください。

結果

ジョブはシナリオを linear_vel ごとに 1 回、計 3 回実行します。以下のスクリーンショットではすべて成功しています。上部のチャートは各実行の duration_s をプロットしたもので、Lite3 は 0.2 m/s で約 52 秒、0.3 m/s で約 40 秒、0.4 m/s で約 32 秒でルートを歩行しています。

実行を展開すると、メトリクスと 5 つのテスト結果が並んで表示されます。Compare Runs では 3 つの速度を横に並べて比較できます。0.2 m/s では、Lite3 は 3 つのウェイポイントすべてに到達し、最終ウェイポイントから 0.23 m の位置で停止し、最も近い壁からは常に 0.35 m 以上離れていました:

ルートの完走

ウェイポイントごとのチャートは、各ウェイポイントにどれだけ近づいたかと、そこに至るまでの壁との最小クリアランスを示します:

地図上の経路

経路チャートは、ロボットのオドメトリ軌跡と Nav2 の計画経路を地図に重ねて表示し、ルートと実際に走行した経路を比較できます:

動画

シミュレータは各実行について、追従カメラと俯瞰ビューの 2 本の動画を記録します:

追従カメラ 俯瞰ビュー

テスト後に利用できるデータ

テストが実行のアップロードディレクトリ(ARTEFACTS_SCENARIO_UPLOAD_DIR)に書き込んだものはすべて Artefacts ダッシュボードにアップロードされます。

  • 地図から押し出した世界(MJCF)とシミュレータの設定
  • ルート結果(YAML)
  • 2 本の動画:追従カメラと俯瞰ビュー
  • オドメトリの軌跡(CSV)
  • HTML のチャート:地図上の経路、速度の時間変化、ウェイポイントごとの数値
  • メトリクス(json 形式)
  • シミュレータと Nav2 起動のログ

Artefacts Toolkit ヘルパー

このプロジェクトでは、Artefacts Toolkit から以下のヘルパーを使用しました:

4 - MPPI クリティックのデバッグとチューニング

ArtefactsパラメトリゼーションでMPPIクリティックのコストをデバッグし、ウェイトをチューニングする

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

概要

Model Predictive Path Integral (MPPI) は最適な軌道を選択するためのサンプリングベースの予測コントローラーで、ロボティクスコミュニティで一般的に使用され、Nav2スタックによって十分にサポートされています。

Nav2のMPPIプラグインのコア機能はその目的関数(クリティック)のセットであり、ロボットプランナーに望ましい動作を達成するためにチューニングできます。

このデモでは、ロボット(Locobot)が後退移動を避けるべきターゲット動作を調査します。これは(ロボティクス実践者によって好まれ、)。また屋内環境での安全上の懸念によるもので、人間やペットがいる可能性があり、標準的なロボット(つまり: 前面センサーのみを持つ)が観測/認識なしに後退することは危険です。

この動作は、急旋回またはロボットに振り向くように求める再計画時(大きな角度距離)に、Nav2 MPPIのPath Angleクリティックが通常アクティブ化されスコアリングに貢献するために発生することが多いです。しかし、計画されたパスとの効率的な角度アライメントを達成するためにロボットを後退移動させる傾向があります。

初期アイデア

最も直感的なソリューションはPrefer Forwardクリティックを使用し、そのウェイトをPath Angleクリティックよりも高いコスト貢献になるようチューニングして、後退動作に対抗することです。しかし、手動でこれをチューニングする場合(つまり: 盲目的にウェイトを調整する)、いくつかの疑問が残ります:

  • これらのコストを実際の値で数値的にどのように見るか? そして2つのメトリック間でどちらが高いか比較するか
  • 異なる潜在的なウェイト値(どのクリティックか不確実な場合は多数になる可能性)を結果軌道と並行して迅速かつ簡単に検証する方法は?

Artefactsを使用して、これらの答えをサポートします:

  • 数値的なクリティックコストデバッグ: この機能はROS Kiltedのために最近開発されたもので、Nav2によるものです。私たちはそのMPPIプラグインをHumbleバージョンに移行し、プロッティングツールキットに統合しました。
  • パラメトリゼーションされたウェイト値: これらのパラメトリゼーションされたシナリオをクラウドインフラストラクチャで並列に迅速に実行し、Artefactsダッシュボードのラン比較で結果軌道と並行してクリティックコストを簡単に表示します。

テストのパラメトリゼーション

artefacts.yamlはテストをセットアップし、次のようにパラメトリゼーションします:

nav2_mppi_tuning:
    type: test
    runtime: 
      framework: ros2:humble
      simulator: gazebo:harmonic
    timeout: 10 # minutes
    scenarios:
      defaults:
        output_dirs: ["output"]
        metrics: "output/metrics.json"

        params:
          controller_server/FollowPath.PreferForwardCritic.cost_weight: [0.0, 5.0, 70.0] 

      settings:
        - name: reach_goal
          pytest_file: "src/locobot_gz_nav2_rtabmap/test/test_mppi.py"

キーポイント:

  • テストはpytestを使用して実施され、pytest_fileは私たちのテストファイルを指します
  • Artefactsはoutput_dirsで定義されたフォルダ内のファイルを収集し、ダッシュボードにアップロードします。
  • controller_server/FollowPath.PreferForwardCritic.cost_weight: ウェイト値をパラメトリゼーションします(クリティックコストデバッグプロットの観察後に取得)。ここでの構文はROSパラメータを示し、このフォーマットに従います: [NODE]/[PARAM]、そしてNav2パラメータ.yamlファイルで見つけることができます。

テストは3つのウェイト値で3回実行されます: 0.0(貢献なし)、5.0(中程度の貢献)、70.0(高い貢献)。

クイック分析

Artefactsダッシュボードのラン比較はクリティックデバッグプロット(“Critics vs Time”)と結果軌道プロット(“odom vs gt positions”)を可視化します。ここでodomはロボットの推定オドメトリで無視でき、gtグラウンドトゥルースポジションに注意を払います。

クリティックデバッグプロットでは、1つのクリティックをダブルクリックし、次に任意の次のクリティックをシングルクリックすることで、関心のあるクリティックを分離できます:

ウェイト0.0はゼロコスト貢献をもたらし、ウェイト5.0はPreferForwardCritic貢献をPathAngleCriticとほぼ同じに上げ、一方ウェイト70.0はその貢献を十分に上回ることができることがわかります。

軌道プロット(HTMLまたはCSVフォーマット)はPreferForwardCritic貢献の増加の影響を示します:

PreferForwardCriticの貢献がPathAngleCriticを上回るまで(ウェイト70.0)、ロボットのいくつかの「後退移動」動作が残り、一方ウェイト70.0はLocobotが前進のみすることを成功裏に保証できることがわかります。

出力ビデオも結果を確認します:

min_velocity_x、traverse_time、traverse_dist、PreferForwardCritic.costs_meanなどの数値メトリックは、可視化なしで結果を迅速に検証するために使用できます:

備考

PreferForwardCritic(ソフト制約)はロボットの後退を避けるためのチューニングプロセスでこのデモでターゲットとされましたが、別のアプローチは単にvx_min = 0.0(ハード制約)を設定することで、これはコントローラーが負の前進速度をサンプリングすることを防ぎます(本質的に後退の厳格な禁止)。「ソフト制約」のウェイトを増やすと前進移動がはるかに可能性が高くなりますが、すべての前進サンプルが悪い場合(つまり: パスがブロックされている、狭い廊下でゴールがロボットの後ろにある)、MPPIは後退軌道を選択できますが、これは「ハード制約」の場合は不可能です。

しかし、一般的な慣行として最も単純なアプローチ(vx_min = 0.0の設定)から始める場合、または後退動作が望ましくない他の状況に対処しようとする場合(つまり: 後退移動でのステアリング問題、またはロボットが単に後退できず、狭い廊下にいる)、同様のパラメトリゼーションされたテストプロセスは、Artefacts .yamlコンフィギュレーションを拡張する(新しいジョブを追加する)ことで単純に実施できます。

テスト後に利用可能なデータ

  • ROSbag
  • ログ
  • Locobotのビデオ/イメージ
  • jsonフォーマットのメトリック
  • HTMLフォーマットのクリティックデバッグプロット
  • HTML、CSVフォーマットの軌道

Artefactsツールキットヘルパー

このプロジェクトでは、Artefacts Toolkitから次のヘルパーを使用しました:

  • get_artefacts_params: どのPreferForwardCriticウェイト値を使用するかを決定するため
  • extract_video: 記録されたrosbagからビデオを作成しました
  • make_chart: 同一のHTMLチャート上に複数のプロットを作成し、クリティクスのデバッグをサポート

5 - RL ポリシーと Tron1

Tron1 を使用した異なる RL ポリシーのテスト

デモはこちら。注:登録が必要です。

概要

Tron1 ロボットは、ヒューマノイド RL 研究に使用できるマルチモーダル二足歩行ロボットです。ソフトウェアの多くはオープンソースで、こちら にあります。

このプロジェクトでは、2 つの強化学習ポリシーを 2 つの補完的な条件で評価します:

  1. 移動テスト:明示的な移動コマンド下でのタスク実行を評価
  2. アイドルドリフトテスト:移動コマンドを与えない場合の受動的安定性を評価

これらを組み合わせることで、ポリシーの 能動的な歩行性能 と 内在的な安定性特性 の両方を確認できます。


テスト対象のポリシー

高レベルの目的(二足歩行)は同じですが、訓練環境と設計上の前提が異なる2つの強化学習ポリシーを比較します:

  • isaacgym
    NVIDIA Isaac Gymを使用して訓練されたポリシーで、高速で大規模なシミュレーションと効率的な最適化を重視しています。これらのポリシーは通常、簡素化または厳密に制御された動力学の下で、コマンドされた動作の堅牢な実行を優先します。

  • isaaclab
    Isaac Labを使用して訓練されたポリシーで、モジュール性、より豊かなタスク抽象化、下流のロボティクスワークフローとの密接な連携を重視しています。これにより、ポリシーに追加の内部構造と制約が導入されることがよくあります。

実装の詳細とトレーニングセットアップは以下で入手可能です:


動作テスト: コマンド動作下でのポリシー比較

まず、ロボットに開始姿勢から前進および回転するよう指示する動作テストを実行します。これにより、各ポリシーがシンプルだが重要な移動タスクをどの程度うまく実行するかを評価します。

テスト自体は以下の通りです:

  • 5メートル前進
  • 150度回転
  • 固定タイムアウト内でタスクを完了

テストのパラメータ化

artefacts.yaml で以下のように設定します:

policy_test:
  type: test
  runtime:
    framework: ros2:jazzy
    simulator: gazebo:harmonic
  scenarios:
    defaults:
      pytest_file: test/art_test_move.py
      output_dirs: ["test_report/latest/", "output"]
    settings:
      - name: move_face_with_different_policies
        params:
          rl_type: ["isaacgym", "isaaclab"]
          move_face:
            - {name: "dyaw_150+fw_5m", forward_m: 5.0, dyaw_deg: 150, hold: false, timeout_s: 35}

ポイント:

  • テストは pytest で実行します(pytest_file でテストファイルを指定)。
  • ダッシュボードへのアップロードは output_dirs の 2 つのフォルダを参照します。
  • パラメータセットは 2 つ:
    1. rl_type: "isaacgym"、"isaaclab"
    2. move_face: 前進 5m、回転 150 度、タイムアウト 35 秒

テストは 2 回実行し、1 回目に isaacgym、2 回目に isaaclab を使用します。両方とも move_face の設定で移動距離と回転量を決めます。


結果:isaacgym

isaacgym ポリシーでは、バードアイ動画で回転後に前進している様子が確認できます:

ダッシュボード上でも成功として記録されています:

テスト中に作成したグラウンドトゥルース軌跡の csv も、自動でチャートに変換されています。


結果:isaaclab

isaaclab ポリシーでは、まだ改善が必要です。ダッシュボードではテスト失敗(失敗したアサーションを表示)となり、バードアイ動画でも目標未達がわかります。

推定軌跡(ロボットが「自分はこう動いた」と考えている軌跡)の csv(自動チャート化)もあり、グラウンドトゥルースと大きく異なります:

推定軌跡 グラウンドトゥルース

アイドルドリフト比較(静止ロボット)

移動テストはコマンド下でのタスク実行を評価します。これを補完するため、アイドルドリフトテスト(移動コマンドを一切与えないテスト)も実施します。

ロボットをニュートラルな直立姿勢に初期化した後、速度・姿勢・歩行コマンドはいっさい送りません。ポリシーは通常通り動き続けるため、観測される挙動はすべて非コマンドのものになります。

このテストはタスク実行とは独立した 受動安定性の挙動 を見ます。


テスト構成と時間スケール

アイドルドリフトは 2 つの時間スケールで評価します:

  • 10 秒:立ち上がり直後の過渡挙動や短期バイアスを観察
  • 60 秒:ヨーの累積的なズレや平面内の緩やかな漂いを観察

両方を見ることで 短期安定性 と 長期の平衡挙動 を切り分けられます。

パラメータ設定

policy_drift:
  type: test
  runtime:
    framework: ros2:jazzy
    simulator: gazebo:harmonic
  scenarios:
    defaults:
      output_dirs: ["test_report/latest/", "output"]
      metrics: "output/metrics.json"
      pytest_file: test/art_test_drift.py
    settings:
      - name: idle_drift_compare_policies
        params:
          rl_type: ["isaacgym", "isaaclab"]
          durations_s: [10, 60]

ポイント:

  • テストは pytest で実行します。
  • 1 回の実行は 1 つの (policy, duration) の組み合わせに対応します。
  • メトリクスは metrics.json に書き出され、ダッシュボードに自動表示されます。

ビジュアル結果

各時間スケールで、2 つのポリシーをバードアイ動画で並べて比較します。

10 秒アイドルテスト

isaacgym isaaclab

60 秒アイドルテスト

isaacgym isaaclab

メトリクスと評価

各アイドルドリフト実行では、次のグラウンドトゥルースメトリクスを報告します:

  • Duration – テストの実行時間
  • X_final, Y_final – 初期位置からの最終平面変位
  • XY_final – 平面ドリフトの合計量
  • Yaw_final_deg – 積算されたヨーのドリフト

ダッシュボードのメトリクスパネル例:

ビデオ観察を補完する、コンパクトで定量的なサマリです。


軌跡プロット(60 秒アイドルテスト)

スカラー値に加えて、グラウンドトゥルース姿勢データから生成した平面軌跡のインタラクティブプロットもあります。

グローバル軌跡ビュー

isaacgym isaaclab
  • isaacgym は曲線的なドリフト軌跡を示します。
  • isaaclab はより直線的なドリフト方向を示します。

拡大軌跡ビュー

isaacgym isaaclab

拡大すると次の細かな構造が見えます:

  • isaacgym は周期的な揺れ
  • isaaclab は小さいながら不規則なズレ

動画では見えにくいパターンも、軌跡データで明確になります。


テストから得られること

移動テストとアイドルドリフトテストは互いに補完的です:

  • 移動テスト:明示的なコマンド下でのタスク実行を評価
  • アイドルドリフトテスト:コマンドなしでの受動安定性を評価

両方を見ることで、能動状態 と 待機状態 の挙動を把握し、実行エラーと内在的安定性を切り分けられます。


テスト後に利用できるデータ

移動テストとアイドルドリフトテストの結果として、Artefacts から次のデータにアクセスできます:

  • ROSbag の記録
  • Gazebo でのロボット動画(バードアイと一人称)
  • stdout / stderr ログ
  • デバッグログ
  • 軌跡(推定)の csv(ダッシュボードで自動グラフ化)
  • 軌跡(グラウンドトゥルース)の csv(ダッシュボードで自動グラフ化)
  • 定量比較用のメトリクスサマリ

Artefacts Toolkit ヘルパー

このプロジェクトでは、Artefacts Toolkit から以下を使用しました: