# RL ポリシーと Tron1

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

---

Site [llms.txt](/ja/llms.txt)

---

[デモはこちら](https://app.artefacts.com/artefacts-demos/tron1-demo/)。注：登録が必要です。

## 概要

[Tron1](https://www.limxdynamics.com/en/tron1) ロボットは、ヒューマノイド RL 研究に使用できるマルチモーダル二足歩行ロボットです。ソフトウェアの多くはオープンソースで、[こちら](https://github.com/limxdynamics) にあります。

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

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

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

---

## テスト対象のポリシー

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

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

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

実装の詳細とトレーニングセットアップは以下で入手可能です:
* https://github.com/limxdynamics/tron1-rl-isaacgym  
* https://github.com/limxdynamics/tron1-rl-isaaclab  

---

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

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

テスト自体は以下の通りです:
- 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` ポリシーでは、バードアイ動画で回転後に前進している様子が確認できます：

![](/images/example-projects/tron1/birdseye-isaacgym.gif)

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

![](/images/example-projects/tron1/isaacgym-success.png)

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

![](/images/example-projects/tron1/isaacgym-gt-chart.png)

---

### 結果：isaaclab

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

![](/images/example-projects/tron1/isaaclab-fail.png)

![](/images/example-projects/tron1/birdseye-isaaclab.gif)

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


<div style="display: flex; gap: 10px;">
  <img src="/images/example-projects/tron1/isaaclab-relative-chart.png" alt="推定軌跡" style="width: 40%;">
  <img src="/images/example-projects/tron1/isaaclab-gt-chart.png" alt="グラウンドトゥルース" style="width: 40%;">
</div>

---

## アイドルドリフト比較（静止ロボット）

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

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

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

---

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

アイドルドリフトは 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 |
|--------|----------|
| ![](/images/example-projects/tron1/isaacgym_10.gif) | ![](/images/example-projects/tron1/isaaclab_10.gif) |

#### 60 秒アイドルテスト

| isaacgym | isaaclab |
|--------|----------|
| ![](/images/example-projects/tron1/isaacgym_60.gif) | ![](/images/example-projects/tron1/isaaclab_60.gif) |

---

### メトリクスと評価

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

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

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

![](/images/example-projects/tron1/idle_metrics_dashboard.png)

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

---

### 軌跡プロット（60 秒アイドルテスト）

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

#### グローバル軌跡ビュー

| isaacgym | isaaclab |
|--------|----------|
| ![](/images/example-projects/tron1/idle_60s_isaacgym_traj.png) | ![](/images/example-projects/tron1/idle_60s_isaaclab_traj.png) |

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

#### 拡大軌跡ビュー

| isaacgym | isaaclab |
|--------|----------|
| ![](/images/example-projects/tron1/idle_60s_isaacgym_traj_zoom.png) | ![](/images/example-projects/tron1/idle_60s_isaaclab_traj_zoom.png) |

拡大すると次の細かな構造が見えます：
- `isaacgym` は周期的な揺れ
- `isaaclab` は小さいながら不規則なズレ

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

---

### テストから得られること

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

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

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

---

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

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

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

---

## Artefacts Toolkit ヘルパー

このプロジェクトでは、[Artefacts Toolkit](/artefacts-toolkit) から以下を使用しました：

* [`get_artefacts_params`](/artefacts-toolkit/config/#get_artefacts_params): 使用する RL ポリシーとテストパラメータの選択に利用
* [`extract_video`](/artefacts-toolkit/rosbag/#image_topicsextract_video): 記録した rosbag から動画を生成
