Artefacts にサインアップすると、いくつかのサンプルプロジェクトを含む artefacts-demos 組織に自動的に追加されます。
これらのプロジェクトの出力は https://app.artefacts.com/artefacts-demos でアクセスできます。
現在利用可能な例:
これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.
Artefacts にサインアップすると、いくつかのサンプルプロジェクトを含む artefacts-demos 組織に自動的に追加されます。
これらのプロジェクトの出力は https://app.artefacts.com/artefacts-demos でアクセスできます。
現在利用可能な例:
デモはこちらからご覧いただけます。 注:登録が必要です
OpenRMFは、大規模建物における複数ロボットの相互運用性のためのフレームワークです。OpenRMFでの一般的な設定タスクの一つは、建物内のロボット用の場所とナビゲーションレーンを設定することです。
ここでは、office worldでOpenRMFデモを実行します。
以下に示すように、このマップにはロボットが移動できる14個のウェイポイントがあります。また、それぞれの充電器上で開始する2台の「tinyRobot」も含まれています。

このテストデモの目的は、すべてのロボットをすべてのウェイポイントに送り、到着したことを確認することです。失敗は、ロボットがマップ上の場所に到達できないことを示します。
テストはすべてのロボットとウェイポイントを通じて実行されるようにパラメータ化されており、各実行の間にシミュレーションがリセットされます。

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


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



テストでは、いくつかのメトリクスを記録します:
テストでは複数のデータを記録します:
デモはこちらで利用可能。注意: 登録が必要です。
Go2はUnitree社製の四足歩行ロボットです。このロボットはIsaac Simで利用可能であり、独自のシミュレーションを比較的簡単に開始できます。
このデモでは、Go2に複数の環境でウェイポイントを順番にナビゲートさせるウェイポイントミッションを実施します:
完全なプロジェクトソースは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はテストをセットアップし、次のようにパラメトリゼーションします:
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ポリシーは失敗しました。

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

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

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

最終結果と関連するメトリックおよびアップロードはこちらで自由に閲覧できます(登録が必要)。
jsonフォーマットのメトリックこのプロジェクトでは、Artefacts Toolkitから次のヘルパーを使用しました:
get_artefacts_params: どのトレーニングポリシーを使用するかを決定するためこのページは機械翻訳です。正確な内容は英語版を参照してください。
Lite3 は DeepRobotics 製の四足歩行ロボットです。SDK はこちらで公開されていますが、このデモでは独自のフォークを使用します。このフォークは、/cmd_vel を関節指令に変換する歩行コントローラを提供します。
このデモでは、rviz 上で artefacts-route レコーダーを使って記録したルートに沿って、Nav2 が Lite3 を走行させます。シミュレーション世界は、ルートの地図を押し出して生成します。テストはロボットがすべてのウェイポイントに到達することを検証し、歩行速度でパラメータ化して、Lite3 がどれだけ速くルートを追従できるかを確認します。

このプロジェクトは以下を使用して実行されます:
ルートとは、地図上の開始姿勢と順序付きのウェイポイントのリストです。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 フィクスチャの中でルートを一度だけ走行させます。このフィクスチャは:
load_route() で最後に記録されたルートを読み込みます。map_to_world() でルートの地図から 2D 地図を 3D シーンに押し出します。世界は実行のたびに新しく生成され、実行結果と一緒にアップロードされます。route_launch_args() で開始姿勢をシミュレータの --set オーバーライドに変換し、Lite3 をルートの開始姿勢にスポーンします。追従カメラと俯瞰ビューの 2 台のカメラが動画を記録します。follow_route() でウェイポイントを Nav2 に送り、各ウェイポイントに到達したか、どれだけ近づいたか、リカバリーが(あれば)何回必要だったかを報告します。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
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 ダッシュボードにアップロードされます。

json 形式)このプロジェクトでは、Artefacts Toolkit から以下のヘルパーを使用しました:
get_artefacts_params:このシナリオの headless、rviz、linear_vel の読み取りartefacts-route record:RViz でのルートの記録load_route:最後に記録したルートの読み込みmap_to_world:ルートの地図からシミュレータ世界を押し出して生成route_launch_args:ルートの開始姿勢へのロボットのスポーンfollow_route:Nav2 へのルートの送信と結果の収集assert_route_completed などの assert_* ヘルパー:ルート結果に対するすぐに使える検証デモはこちらで利用可能。注意: 登録が必要です。
Model Predictive Path Integral (MPPI) は最適な軌道を選択するためのサンプリングベースの予測コントローラーで、ロボティクスコミュニティで一般的に使用され、Nav2スタックによって十分にサポートされています。
Nav2のMPPIプラグインのコア機能はその目的関数(クリティック)のセットであり、ロボットプランナーに望ましい動作を達成するためにチューニングできます。
このデモでは、ロボット(Locobot)が後退移動を避けるべきターゲット動作を調査します。これは(ロボティクス実践者によって好まれ、)。また屋内環境での安全上の懸念によるもので、人間やペットがいる可能性があり、標準的なロボット(つまり: 前面センサーのみを持つ)が観測/認識なしに後退することは危険です。
この動作は、急旋回またはロボットに振り向くように求める再計画時(大きな角度距離)に、Nav2 MPPIのPath Angleクリティックが通常アクティブ化されスコアリングに貢献するために発生することが多いです。しかし、計画されたパスとの効率的な角度アライメントを達成するためにロボットを後退移動させる傾向があります。
最も直感的なソリューションはPrefer Forwardクリティックを使用し、そのウェイトをPath Angleクリティックよりも高いコスト貢献になるようチューニングして、後退動作に対抗することです。しかし、手動でこれをチューニングする場合(つまり: 盲目的にウェイトを調整する)、いくつかの疑問が残ります:
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は私たちのテストファイルを指します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コンフィギュレーションを拡張する(新しいジョブを追加する)ことで単純に実施できます。
jsonフォーマットのメトリックHTMLフォーマットのクリティックデバッグプロットHTML、CSVフォーマットの軌道このプロジェクトでは、Artefacts Toolkitから次のヘルパーを使用しました:
get_artefacts_params: どのPreferForwardCriticウェイト値を使用するかを決定するためextract_video: 記録されたrosbagからビデオを作成しましたmake_chart: 同一のHTMLチャート上に複数のプロットを作成し、クリティクスのデバッグをサポートデモはこちら。注:登録が必要です。
Tron1 ロボットは、ヒューマノイド RL 研究に使用できるマルチモーダル二足歩行ロボットです。ソフトウェアの多くはオープンソースで、こちら にあります。
このプロジェクトでは、2 つの強化学習ポリシーを 2 つの補完的な条件で評価します:
これらを組み合わせることで、ポリシーの 能動的な歩行性能 と 内在的な安定性特性 の両方を確認できます。
高レベルの目的(二足歩行)は同じですが、訓練環境と設計上の前提が異なる2つの強化学習ポリシーを比較します:
isaacgym
NVIDIA Isaac Gymを使用して訓練されたポリシーで、高速で大規模なシミュレーションと効率的な最適化を重視しています。これらのポリシーは通常、簡素化または厳密に制御された動力学の下で、コマンドされた動作の堅牢な実行を優先します。
isaaclab
Isaac Labを使用して訓練されたポリシーで、モジュール性、より豊かなタスク抽象化、下流のロボティクスワークフローとの密接な連携を重視しています。これにより、ポリシーに追加の内部構造と制約が導入されることがよくあります。
実装の詳細とトレーニングセットアップは以下で入手可能です:
まず、ロボットに開始姿勢から前進および回転するよう指示する動作テストを実行します。これにより、各ポリシーがシンプルだが重要な移動タスクをどの程度うまく実行するかを評価します。
テスト自体は以下の通りです:
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 つのフォルダを参照します。rl_type: "isaacgym"、"isaaclab"move_face: 前進 5m、回転 150 度、タイムアウト 35 秒テストは 2 回実行し、1 回目に isaacgym、2 回目に isaaclab を使用します。両方とも move_face の設定で移動距離と回転量を決めます。
isaacgym ポリシーでは、バードアイ動画で回転後に前進している様子が確認できます:

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

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

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


推定軌跡(ロボットが「自分はこう動いた」と考えている軌跡)の csv(自動チャート化)もあり、グラウンドトゥルースと大きく異なります:
移動テストはコマンド下でのタスク実行を評価します。これを補完するため、アイドルドリフトテスト(移動コマンドを一切与えないテスト)も実施します。
ロボットをニュートラルな直立姿勢に初期化した後、速度・姿勢・歩行コマンドはいっさい送りません。ポリシーは通常通り動き続けるため、観測される挙動はすべて非コマンドのものになります。
このテストはタスク実行とは独立した 受動安定性の挙動 を見ます。
アイドルドリフトは 2 つの時間スケールで評価します:
両方を見ることで 短期安定性 と 長期の平衡挙動 を切り分けられます。
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 で実行します。(policy, duration) の組み合わせに対応します。metrics.json に書き出され、ダッシュボードに自動表示されます。各時間スケールで、2 つのポリシーをバードアイ動画で並べて比較します。
| isaacgym | isaaclab |
|---|---|
![]() |
![]() |
| isaacgym | isaaclab |
|---|---|
![]() |
![]() |
各アイドルドリフト実行では、次のグラウンドトゥルースメトリクスを報告します:
ダッシュボードのメトリクスパネル例:

ビデオ観察を補完する、コンパクトで定量的なサマリです。
スカラー値に加えて、グラウンドトゥルース姿勢データから生成した平面軌跡のインタラクティブプロットもあります。
| isaacgym | isaaclab |
|---|---|
![]() |
![]() |
isaacgym は曲線的なドリフト軌跡を示します。isaaclab はより直線的なドリフト方向を示します。| isaacgym | isaaclab |
|---|---|
![]() |
![]() |
拡大すると次の細かな構造が見えます:
isaacgym は周期的な揺れisaaclab は小さいながら不規則なズレ動画では見えにくいパターンも、軌跡データで明確になります。
移動テストとアイドルドリフトテストは互いに補完的です:
両方を見ることで、能動状態 と 待機状態 の挙動を把握し、実行エラーと内在的安定性を切り分けられます。
移動テストとアイドルドリフトテストの結果として、Artefacts から次のデータにアクセスできます:
このプロジェクトでは、Artefacts Toolkit から以下を使用しました:
get_artefacts_params: 使用する RL ポリシーとテストパラメータの選択に利用extract_video: 記録した rosbag から動画を生成