FabForward · Cobot Studio
本番稼働中・再現可能

FAIRINO FR5 に、強化学習で「掴んで置く」を習得させました。

ポーズを一つずつ手作業でプログラムするのではなく、報酬と試行錯誤からタスクを自ら学習するロボットアーム。

86.8%
高フィデリティ物理シミュレーションでのピック成功率 —
目標の85%以上を達成、停滞していた75%の壁を突破。
85%以上
目標 — 達成
18/18
ライブ検証 合格
±20%
ダイナミクスのランダム化
0.0002°
ファームウェア再生誤差

構築したものプログラムするのではなく、学習するロボット

従来の産業用ロボットは、すべての動作を人が手で教示します。私たちは、FR5アームが自ら物体を掴み、ビンに入れることを学習するシステムを構築しました — リアルな物理シミュレーション内で数千回練習し、成功するたびに報酬を得ます。学習した「スキル」は小さな標準ファイルとして書き出され、どこでも動作します。今日はWebブラウザ内でライブ動作し、明日は実機で動きます。

🎯

目標(M1)

FR5が報酬と罰によって、検出した物体を掴み正しく置くことを学習 — 単一のGPUで訓練し、実機を駆動するために書き出します。

🧠

学習のしくみ

まず手書きのエキスパートを模倣し、その後強化学習で教師を超えていきます — 自分の教師よりうまく、しかも壊れずに。

🌐

動作する場所

訓練済みポリシーは、今まさに公開ブラウザデモでライブ動作しており、FAIRINO SDK経由で実機FR5へ移植できるよう構築されています。

結果75%の壁を突破 — 原理に基づいた方法で

75%の天井は過去2回の試みを退けてきました。今回それを突破し、85%以上の目標を運ではなく再現可能なレシピで達成しました。以下は、私たち自身のツールが自動要約した実験の推移です。

実行変更結果
anchor5完全な恒久模倣アンカー安定 83.2%
step2b研究提案のステップ毎報酬崩壊 71.8→7.7%
phase2研究提案 num_steps=200頭打ち 74.3%
drcurric3DRカリキュラム(バグあり)崩壊 83.7→33.8%
drcurric4DRカリキュラム(修正済み)安定 79.9%
rkl_drReverse-KL + DRカリキュラム安定 86.8% ✅
86.8% Reverse-KL + ドメインランダム化ポリシーの訓練曲線
訓練曲線 — 最終的なReverse-KL + DRカリキュラム実行が安定して86.8%に到達。

86.8% 成功

高フィデリティPhysXシミュレーションで — 85%以上のマイルストーン目標を余裕で超過。

崩壊なし

訓練は安定。破滅的崩壊が中心的な失敗モードでしたが、今や解決済みです。

実ファームウェアで検証済み

過去の書き出しを公式FAIRINO SimMachineで再生:最悪関節誤差0.0002°、リアリティギャップ警告ゼロ。

しくみ平易な言葉で4ステップ

教師を観る

手書きの「エキスパート」スクリプトが約97%でピック&プレースします。ロボットはまずそれを模倣(行動クローニング)して基本動作を学びます。

練習して改善(RL)

次にシミュレーション内で練習し、タスク達成で報酬を得て、教師よりうまくできるよう学習します。

Reverse-KLアンカー

難所は、教師を忘れて崩壊することなく教師を超えて改善させること。「Reverse-KLアンカー」は教師の安全な挙動の範囲内に留めつつ、自身の動きを研ぎ澄まし教師を超えることを許します。これが天井を突破しました(83% → 86.8%)。

ドメインランダム化カリキュラム

シミュレートしたモータダイナミクスを±20%ランダム化し、ポリシーが一つの正確な物理に依存しないようにします — ただし確実に掴めるようになった後でのみ。これが実機への移植準備を整えます。

技術詳細 — アルゴリズム

訓練はNVIDIA Isaac Lab(v2.3.2)でのPPOです。ウォームスタートはスクリプト化エキスパートに対する行動クローニング。完全かつ恒久的なBCアンカー--bc_floor 5.0 --bc_weight 5.0)が、過去の実行で見られた破滅的なポリシー崩壊を排除します。鍵となったのは、BC-MSE模倣損失をReverse-KLアンカーtrain.py --anchor reverse_kl)に置き換えたこと:reverse-KLはモード探索的なので、ポリシーは教師の良いモードに集中しつつ、デモを超える自由を持ちます — これがMSEの課した模倣の天井を突破しました。

頑健性は成功ゲート付きDRカリキュラムevents_dr.py)から得られます:アクチュエータの剛性/減衰のランダム化(±20%)は、成功EMAが0.5を超えるまで無効のままで、その後ランプインします。初期のα=0早期リターンのバグ(drcurric3で見つかった3つのうちの1つ)がランダム化を完全に隠していました。評価は2,048並列エピソードで決定論的に行います。再現:tools/isaac_rl/train.py --anchor reverse_kl --bc_floor 5.0 --bc_weight 5.0 --init_std 0.05

動作を見る訓練済みポリシーの動き

シミュレーション内で実行される、学習済みのピック&プレースポリシー。
ブラウザ内のFR5 RLピックデモ
ライブ「RLピック」デモ — ブラウザ内でシミュレートされたFR5を駆動するニューラルポリシー。
FR5 RL 3クラス仕分けデモ
同じ手法を3クラス仕分けに拡張(マイルストーンM2、完了)。

公開デモの訪問者は皆、実際のニューラルネットワークポリシーがシミュレートされたFR5のピック&プレースをリアルタイムで駆動する様子を見られます — インストール不要、どのブラウザでも。今回シーンを強化し(テーブル、グリッパー、仕分けビン、訓練と一致した配色)、実際の訓練環境のように見えます。

▶ ライブデモを開く

エンジニアリングの厳密さ残したもの — そして捨てたもの

研究の推奨事項を意図的に現実に照らして検証し、通用しなかったものは捨てました。この厳密さこそが価値です — 最終的な数字が信頼できる理由です。

✓ 通用した — 採用
  • 強力な恒久模倣アンカー → 破滅的な訓練崩壊を排除(私たち自身の発見)。
  • Reverse-KLアンカー → 模倣の天井を突破;85%以上の実現要因。
  • 段階的ドメインランダム化カリキュラム → 安定性に加え実世界での頑健性。
  • 自作のデバッグ用ハーネス(自動崩壊検出、30秒のプリフライトチェック、即時の実行サマリ) → 手探りの試行錯誤ループを高速なものに変えました。
✕ 検証して却下 — データ付きで
  • ステップ毎の配置報酬ボーナス/ペナルティ(研究の推奨) → 報酬「ファーミング」による訓練崩壊を招きました。メカニズムを診断し差し戻し。
  • より長い価値推定窓num_steps=200、研究の推奨) → 結果が悪化(74% 対 83%);価値推定はそもそもボトルネックではありませんでした。差し戻し。

Sim-to-real(実機移行)準備実機への移植を前提に構築

🎲 ドメインランダム化済み

±20%のアクチュエータ・ダイナミクス・ランダム化のもとで訓練しており、一つの正確な物理モデルに依存しません — 頑健なsim-to-real移行の標準的手法です。

📏 コントローラ実測ダイナミクス

実FR5のダイナミクス(187°/s、428°/s²)は推測ではなく実コントローラから実測し、シミュレータに組み込み済み — シミュレーションが実機に忠実です。

🔁 ファームウェア再生で検証済み

書き出した軌道を公式FAIRINO SimMachine(実ファームウェア)で再生:最悪関節誤差0.0002°、リアリティギャップ警告ゼロ。

正直なスコープ。 RL訓練は実機到着まではシミュレーションのみ(約1か月)です。実機はFAIRINO Python SDKが駆動し、私たちのシステムは教示・検証・書き出し・QAを担います。残る作業はアルゴリズムのリスクではなく、ハードウェア統合です。

重要な正直さのポイント — 2つのポリシー

実機用ポリシー
86.8%

高フィデリティシミュレーションで。完全なドメインランダム化で訓練 → 実モータダイナミクスに頑健。これがマイルストーンであり、実機FR5用のポリシーです。

デモ調整ポリシー
74%

簡略化したブラウザシミュレーションで。より滑らかな公開デモが望まれた場合の即時ロールバックとして保持。

なぜギャップが? ブラウザデモは、実機には無い簡略化された瞬間移動の物理を使います。研究は明確でした:非現実的なブラウザシミュレーションで最良に見せようとすると、実機では悪化します(物理的に危険でガクガクしたコマンドを学習してしまう)。だからこそ86.8%のポリシーは、非現実的なブラウザシミュレーションではやや低い68.5%を正しく示します — そしてそれが正しいトレードオフです。ライブデモは現在86.8%のマイルストーンポリシーを動かしています。

安全性損傷の後ではなく、前に止まる

🛑

衝突前セーフティストップ

新しい安全層が、力/トルク上限、既存の衝突e-stop、DCS立入禁止ゾーンを融合し、計画された動作を実行にチェックします。失敗したピックは、損傷の後ではなく前に停止します。

👁️

カメラによる把持確認

手首カメラの経路(検出 → 物体が実際に保持されているか確認 → 空なら再試行)が実機向けに用意済み — 重要なハードウェア安全の基盤です。

想定Q&A取締役会が問うであろうこと

本当に機能するのか?
はい — 高フィデリティシミュレーションで86.8%(目標は85%)、公開デモでライブ動作し、過去の軌道書き出しは実FAIRINOファームウェアで検証済み(誤差0.0002°)。
実機の準備はできているか?
そのために構築・検証済み(ドメインランダム化、コントローラ実測ダイナミクス、ファームウェア再生テスト済み)ですが、実機でのRLはアーム到着まではシミュレーションのみ(約1か月)。残るリスクはアルゴリズムではなく統合です。
なぜ100%ではない?
残りの約13%は主に配置精度の僅差ミスです。90%以上には収穫逓減を伴う構造的なモデル変更が必要;86.8%はM1目標を余裕で超え、実機への強固な土台です。
技術的な堀(moat)/なぜ難しい?
模倣+RLの難所は、訓練を崩壊させずにロボットに教師を超えさせること — 実際に何度も崩壊しましたが、Reverse-KLアンカーとドメインランダム化カリキュラムを適用して解決しました。反復を高速にし結果を信頼できるものにするツールも自作しました。この手法はタスク横断で再利用可能です(M2仕分けも同じ手法で完了済み)。
費用はどれくらい?
民生用RTX 3060 GPU 1台、各実験は約25分;専用ハードウェア不要(GPU使用率はわずか約36%)。費用の大半はエンジニアリングの厳密さ — 通用しなかった手法の検証と却下です。
その数字は信頼できるか?
はい — 2,048並列エピソードでの決定論的評価で、私たち自身のツールが自動検証し、ポリシーは頑健性訓練済み(一つの物理に過適合していない)。私たちは意図的に保守的で、うまくいったことと共にうまくいかなかったことも報告しています。
今日、顧客に見せられるか?
はい — 公開URLはどのブラウザでもライブポリシーを動かし、インストール不要です。

エンジニア向け実際にどう動くのか、エンドツーエンドで

実機化を担うチーム向けの、より深い運用FAQ。以下の各回答はtools/isaac_rl/内の実ファイルに対応します。

1 ・ 出力は何か — .ptファイル?

2つの成果物、1つのネットワーク:

  • 訓練チェックポイント — PyTorchの.pt(rsl_rl ActorCritic)。マイルストーンはcheckpoints/ppo_pick_rkl_dr_868.pt
  • デプロイ可能なポリシーONNX.onnx.ptからexport_onnx.pyで書き出し → exports/fr5_pick_rkl_dr.onnxdeploy/rl-policies/fr5_pick_policy.onnxとしてデプロイ。

ONNXこそが製品です:単純なMLP、入力29個の浮動小数点 → 出力7個の浮動小数点、約5万パラメータ、193KB。ブラウザデモはONNXを動かし、実機も同じONNXを動かします。.ptはその訓練可能な形にすぎません。

2 ・ IPC → FAIRINO FR5でどう動かす? Pythonが.ptを読み込みモータ信号を計算する?

ループはすでに存在します:reactive_runtime.pyFairinoServoJArmControllerクラス)。IPC上ではonnxruntime.onnxを読み込む、.ptではない — Isaac/torch不要)とFAIRINO SDKでPythonを実行します。各制御ティック(約50Hz):

obs = observe() # 29個の数値(実機 + カメラ読み取りから) action = onnx_policy(obs) # 6関節のΔq (rad) + 1グリッパー move_to_delta(action) # q_next = GetActualJointPosDegree(1) + rad2deg(0.05·Δq) # robot.MoveJ(q_next) (M3コンベアではServoJストリーミング)

observe()は実機の読み取りから29個の数値を組み立てます:joint_pos = deg2rad(GetActualJointPosDegree(1)) − readyjoint_vel、グリッパー、YOLO(カメラ) → ハンドアイ → ベース座標系 のdetected_pucktcp_to_pucktcp_to_bin

要点: ポリシーはモータ電流を出力しません。出力するのは関節位置の差分で、FAIRINOコントローラ自身のサーボループがそれをアクチュエータ信号に変換します。ポリシーは高レベルの反応的な関節プランナーです。

状態: この実機バックエンドはスタブです — 全メソッドがTODO M3(実機未到着、約1か月)。正確なSDK呼び出しはコード内に記述済み;検証用にはシミュレーションバックエンドが今日動きます。

3 ・ Isaac Sim 対 FAIRINO SimMachine — なぜSimMachineだけではダメ?

両者は異なる役割で、補完的です:

  • Isaac Sim / Isaac Lab(NVIDIA) — GPU物理 + RLの学習環境。GPU上で2,048体のロボットを並列に、完全な接触物理とドメインランダム化付きで実行。訓練できる唯一のもの(大規模並列ロールアウト) — そう、これが「NVIDIAの学習環境」です。
  • FAIRINO SimMachine — ベンダー製の実FR5ファームウェアを動かすデジタルツイン(CTL v3.9.6)。1体のロボット、実コントローラ挙動、学習なし、並列なし、RTX物理なし。役割は書き出したプログラムのファームウェア精度の検証

SimMachineでは訓練できません:並列環境なし、GPU物理なし、ドメインランダム化なし — RLは何年もかかり、そもそも学習フレームワークではなくコントローラエミュレータです。よって:Isaac=学習、SimMachine=実ファームウェアでの検証。両方使いました — Isaacで訓練し、書き出しをSimMachineで再生(誤差0.0002°)。

4 ・ 教師データはどう作った?

scripted_expert.py手書きの状態機械(ML不使用):DiffIKのエンドエフェクタ経由点 — 接近 → 下降 → 把持 → 持ち上げ → 搬送 → 配置 — を関節差分に逆算。Isaac環境で動作し約96.9%成功します。collect_demos.pyが成功エピソードごとの(観測, 行動)ペアをdemos/fr5_pick_demos.npzに記録。このバッファが教師データで、行動クローニング(bc_pretrain.py)がそれを模倣 → bc_init.pt、その後PPOが超えていきます。人による遠隔操作なし、実機データなし。

5 ・ 3クラス仕分けを試したらほとんど失敗した — 訓練が必要? 別の.pt

両方ともはい。仕分けは別のポリシーppo_sort_src.ptfr5_sort_policy.onnx)で、32次元の観測(class_onehot(3) + tcp_to_correct_binを追加) — 29次元のピックネットワークでは文字通り動かせません。

そして今日時点で本当に弱いです:私たち自身のM2評価で約39.7%の正解仕分け。ニュアンス — ルーティングは完璧(誤仕分け0;常に正しいビンを狙う);失敗は配置完了で、これはReverse-KL修正にピックを抑えていた、まさにその精度の天井です。だからあなたの経験は私たちのデータと一致します。

M1の勝ちレシピ(Reverse-KLアンカー + 密な段階的配置報酬 + DRカリキュラム)を適用した再訓練が必要 → より良い新しいfr5_sort_policy.onnxへ。M2は環境・エキスパート・BC・ベースラインPPOを出荷済み;85%以上への引き上げは、ピックで既に行ったのと同じ再訓練です — まだ未実施。

6 ・ 「任意の90%以上」 — 具体的に何をする? 機械の設置、環境、訓練プログラムの実行(どこにある — 作るのか)?

2つを混同しないこと:

  • 90%以上はシミュレーション研究のトラックであり、ハードウェアではありません。 訓練プログラムはすでに存在します — RTX 3060開発機上のtools/isaac_rl/train.py。作るのではなく、構造的な変更を加えて再実行(約25分)します:agents/rsl_rl_ppo_cfg.py内のより豊かな/再帰的(LSTM)アクター、加えてゴール近接カリキュラムと密な配置報酬。実機は不要。85%のM1目標を超えると収穫逓減 — だから「任意」。
  • 実機の設置は別タスク(M3 / ハードウェア立ち上げ):FairinoServoJArmControllerスタブを実装し、既存ONNXをデプロイし、実リアリティギャップを測定。質問2と7を参照。
7 ・ カメラが有効になったら何をする?

カメラは現在スタブの2つの経路を解放します:

  • 知覚入力。 今日detected_puckはシミュレーションの真値 + シミュレートしたYOLOノイズです。実機ではobserve()を次のように配線:カメラフレーム → YOLO11s(B6検出器、mAP50 0.986) → ハンドアイ変換(tools/vision/handeye.py) → ベース座標系。ハンドアイ校正はシミュレーションで0.07mmまで実証済み;実物のChArUcoボード撮影が1回必要です。
  • 把持確認(最大の信頼性向上)。 confirm_grasp() — グリッパーを閉じた後、手首カメラで撮影し、物体が実際に爪の中にあるか確認し、空ならピックを再試行。これが「掴み損ねたのに気づかない」失敗モードを潰します。現在はTrue(保持と仮定)を返します。

検出器とコード経路は存在します(B6ビジョン);実カメラ、ハンドアイ撮影、スタブ解除が必要です。

ハードウェア立ち上げロードマップ実機まで — 具体的に何をするのか

まず誤解を解きます:実機が自分で学習することはありません。 ロボット上で動く「ファインチューニングアプリ」は無く、アームが実機上で強化学習することもありません(実機学習は失敗=衝突や落下から学ぶため危険で、かつ遅すぎます)。学習はすべてIsaacシミュレーション内で行い、開発者がループを回します。 ロボットは常に、訓練済みの固定ポリシー(ONNX)を実行するだけです。

「リアリティギャップの測定 → ファインチューニング」とは(ループ)

これは開発者が回すsim-to-real反復ループで、1サイクルあたり5ステップ。SimMachineに対して既に実証済みのワークフロー(Track FR5-CAL)と同じものです。

#ステップ担当既存ツール
1デプロイ — 86.8% ONNXを動かし、減速して実機ピックを実行開発者reactive_runtime.py
2測定 — 実関節軌道 + 成功率を記録し、実際の動きをシミュレーション予測と比較ツールが算出realityGap.tsgap_report.json
3システム同定 — 実アームの真のダイナミクス(関節ごとの速度/加速度/減衰)を測定開発者がスクリプト実行characterize.py
4シミュレータを更新(実測ダイナミクスをscene.jsonに書き込み)し、868チェックポイントからtrain.py再実行(RTX 3060で約25分)開発者 + GPUtrain.py
5再書き出し・再デプロイ・再測定。 実成功率が目標に達するまで反復開発者export_onnx.py

ロボットの担当は1〜2だけ(実行されて測定される)。学習はステップ4で、シミュレーション内・GPU上で、あなたが起動します。86.8%ポリシーは既に±20%のダイナミクスランダム化で訓練済みなので、初回デプロイでもそれなりに移行するはずです — ファインチューニングは残差ギャップを詰めるもので、ゼロからやり直すものではありません。

実際にあなたがやること(ハードウェア到着後の作業者チェックリスト)

  1. 物理設置: FR5 + グリッパー + 手首カメラを取り付け、IPCを接続し、SDKをネットワーク接続(Robot.RPC("192.168.58.2"))、e-stopを配線。
  2. ランタイムのスタブ解除: FairinoServoJArmControllerの3つのTODO M3メソッド(observe()move_to_delta()、安全読み取り)を埋める — 正確なSDK呼び出しはドキュメント文字列に記述済み。
  3. カメラ校正(ハンドアイ、ChArUcoボード — シミュレーションで0.07mm実証済み)を行い、YOLO → ベース座標系をobserve()に配線;confirm_grasp()を有効化。
  4. デプロイ + ベースライン測定(上の1〜2)を減速・安全ゲートONで実施。
  5. ファインチューニングループを回す(上の3〜5)、通常1〜3サイクル。
  6. 受け入れ: エッジケースでの頑健性確認、文書化、顧客への引き渡し。

顧客への出荷までの期間(正直な見積もり)

これは予測であり、確約された日付ではありません。ハードウェアが予定どおり約1か月後に到着すると仮定しています。

フェーズ作業目安
0ハードウェア設置 + 接続 + ランタイムのスタブ解除約1週間
1カメラ + ハンドアイ校正 + 把持確認約1週間
2初回デプロイ + ベースライン測定 + 安全検証約1週間
3リアリティギャップ → システム同定 → ファインチューニングループ(1〜3サイクル)約2週間
4頑健性 / エッジケース / 受け入れ / 文書化約1〜2週間

→ ハードウェア到着後 約6〜8週間の立ち上げ、つまり本日から約3か月で、顧客に出荷可能な静的ピック&プレースに到達します。

  • 3クラス仕分けはこの期間に含まれません — 約40%で、ハードウェア作業のに独自の再訓練(M1レシピを仕分けに適用)が必要。シミュレーション訓練を約1週間追加。
  • 移動コンベア把持(M3) — 実際の社内ターゲット — は上記すべての上にServoJストリーミングバックエンドが必要;これはより長い別トラックで、約3か月の静的ピックの数字には含まれません。

これが「アルゴリズムのリスクではなく統合」である理由:ループ内の全ツールは既に存在し、シミュレーション/SimMachineでリハーサル済みです。未知数は実ギャップの大きさで、それが必要なファインチューニングのサイクル数(フェーズ3)を決めます。

次のステップマイルストーンから実機へ

  • M3 — 移動コンベア把持(実際の量産ターゲット):実機FR5待ち(約1か月)。同じAPIの背後で動くストリーミングコントローラは設計済み。
  • ハードウェア立ち上げ: 86.8%ポリシーを実機にデプロイし、実リアリティギャップを測定、ファインチューニング。具体的な手順と期間は上のロードマップを参照。
  • 任意の90%以上: 構造的なステップ(より豊かな/再帰的なポリシー、またはゴール近接カリキュラム)が必要 — 収穫逓減を伴う新トラックで、未完のM1案件ではありません。
  • ループ内ビジョン: 用意済みのカメラによる把持確認が、知覚 → RL ループを閉じます。