静止ワークのピックから、3クラス仕分け、そして本命:ベルトを流れてくる丸ワークを動きながら掴む「コンベア追従」まで — すべて同一の実証済み強化学習レシピで。
私たちは、FR5アームが自ら掴んで置くことを学習するシステムを構築しました — リアルな物理シミュレーション内で数千回練習し、成功するたびに報酬を得ます。最初の静止ピックで86.8%(目標85%以上)を達成し本番稼働中。同じ学習レシピを、より難しい2つのタスク — 3クラス仕分けと、御社が本当に求めているコンベア上の動くワークの追従把持 — へ拡張しています。アルゴリズムを作り直すのではなく、同じ実証済みレシピを難しい環境に適用するのが要点です。
従来は人がすべての動作を手で教示します。FR5は報酬と罰によって、検出した物体を掴み正しく置くことを自ら学習 — 1台のGPUで訓練し、実機を駆動するために書き出します。
手書きエキスパートを模倣し、強化学習で教師を超え、ドメインランダム化で実機に頑健化。同じレシピがピック・仕分け・コンベアの3つすべてに適用されます。
訓練済みポリシーは公開ブラウザデモで今まさにライブ動作中。デモのシナリオ切替でピック / 仕分け / コンベアを選んで見られます。
下記はすべて同じFR5・同じ学習レシピ。違いはタスクの難しさだけです。モード3が御社の本命(流れてくる丸ワークの追従把持)です。
静止ピックと違い、コンベア追従は動く標的を相手にします。ワークは止まってくれません。だからこそ「速度補正で追従」が必要です。
ワークは100 mm/sで流れ続けます。把持点は固定されておらず、ロボットが手を伸ばしている間にも移動します。静止ピックの「その場に降りて掴む」は通用しません。
ワークが手の届く範囲に居る時間は限られています。早すぎても遅すぎても掴めず、ベルトの端を通り過ぎると「ミス」として失敗になります。タイミングが厳しい。
ロボットは現在地ではなく、ワークがこれから来る位置へ手を運ばなければなりません。既知のベルト速度を観測に加えることで、ポリシーは標的を「リード(先回り)」して速度を合わせた把持を学習します。
コンベア環境(fr5_conveyor_env_cfg.py)はM1ピック環境をそのまま継承し、動く要素だけを足したものです。ベルトはベース座標でx=-0.42を中心に、ワークは-Y方向に100 mm/sで運ばれる運動学的キャリア(ConveyorGripperGraspAction)。ワークは上流端y=+0.16から流入し、M1の到達実証済み窓(y∈[-0.12,+0.12])を通過、y=-0.16を未把持で過ぎるとobject_missed終了(missed_penalty)。
観測は34次元 = M1の29次元 + 既知ベルト速度3次元(belt_velocity_b)+ 位相認識2次元(把持状態 is_grasped + 残りホライズン)。既知速度信号でポリシーは標的を「リード」できます(速度補正による先回り把持)。位相認識の観測は「接近中」と「運搬中」を区別させ、運搬中の取りこぼし(落下)を解消する鍵でした。把持(運動学的アタッチ)・Δq行動・farm-proof報酬スタック・FR5実測ダイナミクス・DRカリキュラムはすべてM1から逐語的に再利用。ビンはM1のビン(-0.45,+0.30)です。
手書きの「エキスパート」スクリプトがタスクを実演します。コンベアでは、既知のベルト速度を使って動くワークへ先回りする状態機械です。ロボットはまずそれを模倣(行動クローニング)して基本動作を学びます。
次にIsaac Sim内で、民生用RTX 3060 GPU 1台を使い数千の並列環境で練習し、タスク達成で報酬を得て、教師よりうまくできるよう学習します。
学習した「スキル」を小さな標準ファイル(ONNX、約193KB)に書き出します。これが製品です — ブラウザデモも実機も同じONNXを動かします。
書き出したポリシーは公開ブラウザデモで今まさにライブ動作中。インストール不要、どのブラウザでも。明日は同じONNXが実機FR5を動かします。
強い恒久的な「行動クローニング・アンカー」が、訓練が崩壊して「諦めて」しまうのを防ぎます。過去の試みを退けてきた破滅的崩壊の解決策です。
教師の安全な範囲に留めつつ、教師を超えて改善することを許します。模倣の天井を突破し、ピックを83% → 86.8%へ押し上げた要因です。
シミュレートしたモータ物理を±20%ランダム化 — ただし確実にタスクをこなせるようになった後でのみ。これがsim-to-real(実機移行)の頑健性を生みます。
訓練は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はモード探索的なので、ポリシーは教師の良いモードに集中しつつデモを超える自由を持ちます。頑健性は成功ゲート付きDRカリキュラム(events_dr.py)から:アクチュエータ剛性/減衰のランダム化(±20%)は成功EMAが0.5を超えるまで無効で、その後ランプインします。コンベア環境はM1ピックを継承し、観測に既知ベルト速度3次元+位相認識2次元(把持状態・残りホライズン)を追加した34次元、新たなobject_missed終了を持ちます。85%超えを決めた3つのレシピ:① 位相認識の観測(接近↔運搬の混同を解消=落下の主因を除去。BCクローンを12→76%/29→78%へ)、② オフセット補正のエキスパート(運搬中のワークが正しくビン中心へ落ちるよう補正=コンベアエキスパート84.8→92.2%)、③ デモ件数の拡大(400→2000〜2400エピソード)。これらで強いクローンを作った上でreverse-KL+DRが教師を超え、コンベア92.6%/仕分け89.9%(誤仕分け0)を達成しました。評価は並列エピソードで決定論的に行います。
公開デモの「RL Demo(policy in browser)」パネルにはシナリオ選択があり、ピック / 仕分け / コンベアを切り替えて、それぞれの訓練済みニューラルポリシーがシミュレートされたFR5をリアルタイムで駆動する様子を見られます — インストール不要、どのブラウザでも。
コンベアシナリオは、Isaac Sim上での実際のロボット軌道をそのまま再生しています — 物理シミュレーションを通った本物の動きなので、なめらかに動作中ピックします(92.6%ポリシーの実挙動)。
一方ピック/仕分けはブラウザ内の簡易キネマティクスでその場に再シミュレーションしているため、アームがわずかに小刻みに揺れることがあります。これは「不具合」ではなく表示上の現象です:強化学習ポリシーは50Hzで毎ステップごくわずかに異なる角度指令(Δθ)を出力し(PPO特有の性質)、キネマティクス表示はそれをほぼ即時に反映するためです。
Isaac Sim と実機ではなめらかに見えます。実際のモータはPD制御+アームの慣性・減衰を通して動くため、高周波の指令揺れは物理的にローパス(平滑化)されます。実機FAIRINOコントローラはさらに関節目標を補間し、機械的な慣性・摩擦が揺れを吸収します。ポリシー自体は同一で、揺れは「慣性のないプレビュー」特有の見え方です。(ブラウザ側にも表示専用の平滑化を適用しています。)
研究の推奨事項を意図的に現実に照らして検証し、通用しなかったものは捨てました。この厳密さこそが価値です — 最終的な数字が信頼できる理由です。同じ厳密さでコンベア追従にも臨みます。
num_steps=200、研究の推奨) → 結果が悪化(74% 対 83%);価値推定はそもそもボトルネックではありませんでした。差し戻し。NVIDIA Isaac SimがGPU上で数千体のロボットを並列に動かし、強化学習でポリシーを訓練します。学習はすべてここ(シミュレーション内)で行われます。
実機FR5はFAIRINO Python SDKが駆動します。robot-guideは教示・検証・書き出し・QAを担います。実機RLは実機到着まではシミュレーションのみ(約1か月)。
これらは状態ベースのポリシーです — 画素を直接見るのではなく、カメラ/YOLOが検出した物体の姿勢とクラスを観測として受け取ります。コンベアでは既知のベルト速度も観測に含みます。
正直なスコープ。 シミュレーションが物理とRLを行い、実機FR5+カメラは次フェーズです。残る作業はアルゴリズムのリスクではなく、ハードウェア統合です。コンベア追従の数字(92.6% (Isaac))はIsaacシミュレーションでの値であり、手書きエキスパート単体の成功率は92.2%です。
高フィデリティシミュレーションで。完全なドメインランダム化で訓練 → 実モータダイナミクスに頑健。これがマイルストーンであり、実機FR5用のポリシーです。
簡略化したブラウザシミュレーションで。より滑らかな公開デモが望まれた場合の即時ロールバックとして保持。
ブラウザデモは実機には無い簡略化された瞬間移動の物理を使います。非現実的なブラウザシミュレーションで最良に見せようとすると実機では悪化するため、86.8%のポリシーは実機への正しいトレードオフを優先しています。同じ原則をコンベア追従にも適用します。
fr5_conveyor_env_cfg.py)はM1ピック環境を継承して構築済みで、シミュレーションで訓練中です。現在の成功率は 92.6% (Isaac)(手書きエキスパート単体は 92.2%)。これはIsaacシミュレーションの値で、実機検証は次フェーズです。From picking a stationary part, to 3-class sorting, to the real target: grasping a coin-sized part while it flows past on a moving conveyor belt — all with the same proven reinforcement-learning recipe.
We built a system where the FR5 arm learns to grasp and place on its own — by practicing thousands of times in a realistic physics simulation and being rewarded when it succeeds. The first, static pick hit 86.8% (target ≥85%) and runs live. We're applying the same learning recipe to two harder tasks — 3-class sorting and the one you actually want: tracking and grasping a moving part on a conveyor. The point is not to reinvent the algorithm but to apply the same proven recipe to a harder environment.
Traditionally a human teaches every motion by hand. The FR5 learns on its own, by reward and penalty, to grasp a detected object and place it correctly — trained on a single GPU, then exported to drive the real arm.
Imitate a hand-written expert, exceed it with reinforcement learning, harden for the real robot with domain randomization. The same recipe drives all three: pick, sort, conveyor.
The trained policies run live in the public browser demo right now. The demo's scenario selector lets you switch between Pick / Sort / Conveyor.
Everything below is the same FR5 and the same learning recipe. Only the task difficulty changes. Mode 3 is your real target — tracking and grasping the round part as it flows in.
Unlike a static pick, conveyor follow chases a moving target. The part doesn't wait for you — which is exactly why "velocity-compensated tracking" is needed.
The part flows at 100 mm/s. The grasp point is not fixed — it moves even while the robot is reaching for it. The static "descend in place and grab" no longer works.
The part is only within reach for a limited time. Too early or too late and you miss it; if it runs off the end of the belt it counts as a "missed" failure. Timing is tight.
The robot must move its hand not to where the part is but to where the part will be. By adding the known belt speed to its observation, the policy learns to lead the target and match its speed for the grasp.
The conveyor env (fr5_conveyor_env_cfg.py) inherits the M1 pick env verbatim and only adds the moving pieces. The belt is centered at base-frame x=-0.42; the part rides a kinematic carrier (ConveyorGripperGraspAction) advancing at 100 mm/s in -Y. The part spawns at the upstream edge y=+0.16, crosses M1's proven-reachable window (y∈[-0.12,+0.12]), and triggers an object_missed termination (missed_penalty) if it passes y=-0.16 un-grasped.
The observation is 34-dim = M1's 29 + the known belt velocity (3) (belt_velocity_b) + 2 phase-aware terms (is_grasped + remaining-horizon). The known-speed signal lets the policy "lead" the target (velocity-compensated interception); the phase-aware signal separates "approaching" from "carrying" and was the key to eliminating the post-grasp drops. The grasp (kinematic attach), the Δq action, the farm-proof reward stack, the FR5 measured dynamics and the DR curriculum are all reused verbatim from M1. The bin is M1's bin at (-0.45,+0.30).
A hand-written "expert" script demonstrates the task. For the conveyor it's a state machine that uses the known belt speed to lead the moving part. The robot first imitates it (behavior cloning) to learn the basic motion.
It then practices inside Isaac Sim across thousands of parallel environments on a single consumer RTX 3060 GPU, getting rewarded for completing the task — and learning to do it better than the teacher.
The learned "skill" exports to a small standard file (ONNX, ~193 KB). That file is the product — the browser demo and the real robot run the same ONNX.
The exported policy runs live in the public browser demo right now — no install, any browser. Tomorrow the same ONNX drives the physical FR5.
A strong, permanent "behavior-cloning anchor" stops the policy from collapsing and "giving up." It's the fix for the catastrophic collapse that defeated prior attempts.
It keeps the policy within the teacher's safe range while letting it improve past the teacher. This broke the imitation ceiling and lifted pick from 83% → 86.8%.
Randomize the simulated motor physics by ±20% — but only after the robot can already do the task reliably. That's what produces robust sim-to-real transfer.
Training is PPO in NVIDIA Isaac Lab (v2.3.2). The warm-start is behavior cloning against a scripted expert; a full, permanent BC anchor (--bc_floor 5.0 --bc_weight 5.0) eliminates catastrophic collapse. The key is swapping the BC-MSE imitation loss for a Reverse-KL anchor (train.py --anchor reverse_kl): reverse-KL is mode-seeking, so the policy concentrates on the teacher's good modes while being free to exceed the demo. Robustness comes from a success-gated DR curriculum (events_dr.py): actuator stiffness/damping randomization (±20%) stays disabled until the success-EMA exceeds 0.5, then ramps in. The conveyor env inherits M1 pick, adds the known belt velocity (3-dim) plus 2 phase-aware terms (is-grasped, remaining-horizon) to the observation for a 34-dim policy input, and adds a new object_missed termination. Three levers broke the 85% ceiling: (1) the phase-aware observation (separates approach↔carry, removing the post-grasp drops — took the BC clone from 12→76% / 29→78%); (2) an offset-corrected expert (aims so the carried part lands on the bin centre — conveyor expert 84.8→92.2%); and (3) demo scaling (400→2000–2400 episodes). With that strong clone, reverse-KL + DR then exceed the teacher, reaching conveyor 92.6% / sort 89.9% (0 mis-sorts). Evaluation is deterministic over parallel episodes.
The public demo's "RL Demo (policy in browser)" panel has a scenario selector — switch between Pick / Sort / Conveyor and watch each trained neural policy drive the simulated FR5 in real time — no install, any browser.
The Conveyor scenario replays the policy's actual Isaac-Sim trajectory — real motion that has passed through the physics simulation, so it picks the moving part smoothly (the genuine behaviour of the 92.6% policy).
The Pick / Sort scenarios re-simulate live in a lightweight in-browser kinematic sim, so the arm can look slightly trembly. That's a rendering artifact, not a fault: the RL policy emits a tiny, slightly different joint-angle delta (Δθ) every step at 50 Hz (a normal property of PPO), and the kinematic preview applies it almost immediately.
In Isaac Sim and on the real robot it looks smooth. Real joints are driven by PD control through the arm's inertia and damping, which physically low-pass-filters the high-frequency command jitter; the real FAIRINO controller additionally interpolates the joint targets, and mechanical inertia/friction absorb the rest. The policy itself is identical — the tremble is just how an inertia-less preview renders it. (We also apply a display-only smoothing on the web side.)
We deliberately tested the research recommendations against reality and discarded what didn't hold up. This rigor is the value — it's why the final number is trustworthy. We bring the same rigor to conveyor follow.
num_steps=200, a research recommendation) → made results worse (74% vs 83%); the value estimate was never our bottleneck. Reverted.NVIDIA Isaac Sim runs thousands of robot copies in parallel on the GPU and trains the policy by reinforcement learning. All learning happens here, in simulation.
The physical FR5 is driven by the FAIRINO Python SDK; robot-guide does the teaching, validation, export and QA. Real-hardware RL is sim-only until the arm arrives (~1 month).
These are state-based policies — they don't look at raw pixels; they receive the camera/YOLO-detected object pose and class as observations. For the conveyor, the known belt speed is in the observation too.
Honest scope. Simulation does the physics and RL; the real FR5 + camera come next. The remaining work is hardware integration, not algorithmic risk. The conveyor number (92.6% (Isaac)) is an Isaac-simulation figure, and the hand-written expert alone succeeds at 92.2%.
In high-fidelity sim. Trained with full domain randomization → robust to real motor dynamics. This is the milestone and the policy for the actual FR5.
In the simplified browser sim. Retained as an instant rollback for a smoother public demo if ever preferred.
The browser demo uses a simplified, instant-motion physics the real robot doesn't have. Forcing the policy to look best in the unrealistic browser sim would make it worse on the real robot, so the 86.8% policy prioritizes the right trade-off for hardware. We apply the same principle to conveyor follow.
fr5_conveyor_env_cfg.py) is built by inheriting the M1 pick env and is in training in simulation. Current success is 92.6% (Isaac) (the hand-written expert alone is 92.2%). These are Isaac-simulation figures; real-hardware validation is the next phase.