← Aung Kaung Myat/Walkthroughsプロジェクト解説
CPU-only robot-learning track · four repositoriesRobot learning(CPUのみ)· 4リポジトリ · so-arm100-sim · so-arm100-rl · so-arm100-il · so-arm100-vla

One Arm, Three Ways to Learn It1本のアームを、3通りの方法で学習させる

公開LeRobotデータセットの大半で使われる低価格な5自由度アームSO-ARM100をMuJoCo上に置き、キューブへのリーチ・押し出し・持ち上げ・配置を3通り(rewardからのPPO、スクリプト化エキスパートのimitation、小さなlanguage-conditioned policy)で学習させました。タスク・物理パラメータの変化・成功判定プロトコルは共通ベンチ1つで定義しているため、3つの結果表をそのまま並べて比較できます。

The SO-ARM100, the low-cost 5-DOF arm behind most open LeRobot datasets, placed in MuJoCo and taught to reach, push, lift and place a cube three ways: PPO from a reward, imitation of a scripted expert, and a small language-conditioned policy. One shared bench defines the tasks, the physics shifts and the success protocol, so the three result tables compare directly.

MuJoCo 3.13PyTorch, CPULeRobotDataset v3 PPO + curriculumBC · DAgger · ACT MiniLM + FiLMheld-out physicsno CUDA anywhere
Status状況
CI green · bench, RL, imitation and language measuredCI green · ベンチ・RL・imitation・languageすべて計測済み
Tasksタスク
4, one success rule each(各1つの成功条件)
Protocol評価プロトコル
100 episodes × 5 seeds per cell1セルあたり100 episode × 5 seed
Held-out physicsHeld-out物理条件
6 cells, each outside DR6セル(すべてDR範囲外)
Testsテスト数
63 + 21 + 21 + 24 = 129
Policy sizesPolicyの規模
MLP · keypoint CNN · ~1M-param transformerMLP · keypoint CNN · 約1Mパラメータのtransformer
00

At a glance要点

Every learned policy on the same held-out physics, the one weak route, and the one cell that tests nothing — before any detail.同じheld-out物理条件での全policy、性能の低い1つのアプローチ、そして何もテストしていなかった1セル。詳細はその後で。

Lift success — policy × physics conditionliftの成功率 — policy × 物理条件
100 episodes × 5 seeds per cell. Expert row is the ceiling; every cell right of nominal is outside the DR range. Slippery is inert (MuJoCo keeps the larger friction), so it equals nominal in every row.1セルあたり100 episode × 5 seed。エキスパートの行が上限。nominalより右の列はすべてDR範囲外。slipperyは効果なし(MuJoCoは大きい方の摩擦を使う)のため、全行でnominalと同値。
nominalheavyslipperyweaklaggynoisysmallscripted expertエキスパートScripted expert, lift, nominal: 0.93 ± 0.020.93Scripted expert, lift, heavy: 0.90 ± 0.020.90Scripted expert, lift, slippery: 0.93 ± 0.020.93Scripted expert, lift, weak: 0.97 ± 0.020.97Scripted expert, lift, laggy: 0.92 ± 0.030.92Scripted expert, lift, noisy: 0.93 ± 0.020.93Scripted expert, lift, small: 0.73 ± 0.050.73PPO · nominalPPO · nominal学習PPO nominal-trained, lift, nominal: 0.998 ± 0.0040.998PPO nominal-trained, lift, heavy: 0.998 ± 0.0040.998PPO nominal-trained, lift, slippery: 0.998 ± 0.0040.998PPO nominal-trained, lift, weak: 0.982 ± 0.0130.982PPO nominal-trained, lift, laggy: 0.458 ± 0.0520.458PPO nominal-trained, lift, noisy: 0.956 ± 0.0170.956PPO nominal-trained, lift, small: 0.878 ± 0.0510.878PPO · DR fine-tunePPO DR fine-tuned, lift, nominal: 0.998 ± 0.0040.998PPO DR fine-tuned, lift, heavy: 0.988 ± 0.0080.988PPO DR fine-tuned, lift, slippery: 0.998 ± 0.0040.998PPO DR fine-tuned, lift, weak: 1.000 ± 0.0001.000PPO DR fine-tuned, lift, laggy: 0.760 ± 0.0300.760PPO DR fine-tuned, lift, noisy: 0.948 ± 0.0240.948PPO DR fine-tuned, lift, small: 0.960 ± 0.0200.960BC · imageBC · 画像BC image policy, lift, nominal: 0.05 ± 0.020.05BC image policy, lift, heavy: 0.02 ± 0.010.02BC image policy, lift, slippery: 0.05 ± 0.020.05BC image policy, lift, weak: 0.00 ± 0.000.00BC image policy, lift, laggy: 0.00 ± 0.000.00BC image policy, lift, noisy: 0.06 ± 0.010.06BC image policy, lift, small: 0.01 ± 0.020.01DAgger · imageDAgger · 画像DAgger image policy, lift, nominal: 0.14 ± 0.070.14DAgger image policy, lift, heavy: not measured—DAgger image policy, lift, slippery: not measured—DAgger image policy, lift, weak: not measured—DAgger image policy, lift, laggy: not measured—DAgger image policy, lift, noisy: not measured—DAgger image policy, lift, small: not measured—ACT · chunk 20ACT (chunked), lift, nominal: 0.77 ± 0.050.77ACT (chunked), lift, heavy: 0.78 ± 0.060.78ACT (chunked), lift, slippery: 0.77 ± 0.050.77ACT (chunked), lift, weak: 0.70 ± 0.040.70ACT (chunked), lift, laggy: 0.65 ± 0.020.65ACT (chunked), lift, noisy: 0.72 ± 0.080.72ACT (chunked), lift, small: 0.38 ± 0.050.38success rate成功率01.0
Language policy — success by held-out splitLanguage policy — held-out分割ごとの成功率
Four tasks, 20 episodes × 5 seeds, one training seed per encoder. Same shading scale as above.4タスク、20 episode × 5 seed、エンコーダーあたり学習seed 1つ。上と同じ濃淡スケール。
seenparaphrasecomboMiniLM + FiLMMiniLM encoder, seen: 0.110 ± 0.0810.110MiniLM encoder, paraphrase: 0.097 ± 0.0600.097MiniLM encoder, combo: 0.027 ± 0.0460.027hashed (control)ハッシュ(対照)Hashed bag-of-words control, seen: 0.092 ± 0.0460.092Hashed bag-of-words control, paraphrase: 0.073 ± 0.0570.073Hashed bag-of-words control, combo: 0.027 ± 0.0210.027MiniLM, no FiLMMiniLM(FiLMなし)MiniLM encoder without FiLM, seen: 0.137 ± 0.0750.137MiniLM encoder without FiLM, paraphrase: 0.110 ± 0.0560.110MiniLM encoder without FiLM, combo: 0.033 ± 0.0380.033
Numbers as a table数値を表で見る
lift policynominalheavyslipperyweaklaggynoisysmall
scripted expertエキスパート0.930.900.930.970.920.930.73
PPO · nominal0.9980.9980.9980.9820.4580.9560.878
PPO · DR fine-tune0.9980.9880.9981.0000.7600.9480.960
BC · image画像0.050.020.050.000.000.060.01
DAgger · image画像0.14——————
ACT · chunk 200.770.780.770.700.650.720.38
language encoder言語エンコーダーseenparaphrasecombo
MiniLM + FiLM0.110 ± 0.0810.097 ± 0.0600.027 ± 0.046
hashed (control)ハッシュ(対照)0.092 ± 0.0460.073 ± 0.0570.027 ± 0.021
MiniLM, no FiLM(FiLMなし)0.137 ± 0.0750.110 ± 0.0560.033 ± 0.038
  • 01One bench, one protocol, four repositories. 4 tasks with one success rule each, 100 episodes × 5 seeds per cell, 6 held-out physics cells each proven outside the DR range, 129 tests green; the scripted expert lifts 0.93 and is the ceiling for every row.共通ベンチ1つ、プロトコル1つ、リポジトリ4つ。成功条件が1つずつの4タスク、1セルあたり100 episode × 5 seed、DR範囲外であることを証明済みの6つのheld-outセル、129テストがgreen。エキスパートのliftは0.93で、全行の上限。
  • 02Chunking is the whole imitation result: ACT 0.77, BC 0.05. Same 200 demonstrations, keypoint encoder and L1 loss; DAgger lifts single-step cloning only to 0.14. More demos do nothing for BC, while ACT's mean reaches 0.51 at 200 with six seeds split 0.12–0.24 against 0.76–0.92.imitationの差はchunk出力だけ:ACT 0.77、BC 0.05。デモ200件・keypoint encoder・L1 lossは同一。DAggerでもsingle-step cloningは0.14まで。デモを増やしてもBCは改善せず、ACTの平均は200件で0.51だが、6 seedは0.12〜0.24と0.76〜0.92に分かれる。
  • 03DR fine-tune halves the held-out drop, 0.120 → 0.056. Almost all of it is 3-step action latency, 0.458 → 0.760; one training seed per column and 10 M extra steps on the DR side. The reach → push → lift curriculum stalled at push 0.60 against a 0.8 gate; from scratch, lift crossed 0.6 at 0.996 M steps.DRのfine-tuneでheld-outの低下が半減:0.120 → 0.056。大部分は3 stepのaction latency(0.458 → 0.760)。各列は学習seed 1つで、DR側は学習stepが10 M多い。reach → push → liftのcurriculumはpush 0.60で停滞(昇格基準0.8)、ゼロからの学習ではliftが0.996 M stepで0.6を超えた。
  • 04The language policy is weak: 0.11 seen, 0.03 unseen pairs. MiniLM, a hashed-words control and no-FiLM all sit inside each other's spread, so the encoder cannot show. SmolVLA-base scores 0 of 40 zero-shot at 3.16 s per chunk on CPU; the LoRA gate passes at 0.51 s per step.Language policyの性能は低い:seenで0.11、未見ペアで0.03。MiniLM・単語ハッシュの対照・FiLMなしの3行は互いのばらつきの範囲内で、エンコーダーの効果は見えない。SmolVLA-baseはzero-shotで40回中0回、CPUでchunkあたり3.16秒。LoRA判定は1 step 0.51秒で通過。
  • 05Simulation only, and one cell tests nothing. MuJoCo takes the larger friction of two touching geoms, so the slippery column equals nominal in every row and is kept as measured. No number is a claim about the physical SO-ARM100.シミュレーションのみ。1セルは何もテストしていない。MuJoCoは接触する2つのgeomの大きい方の摩擦を使うため、slipperyの列は全行でnominalと同値のまま、計測どおりに掲載。どの数値も実機のSO-ARM100についての主張ではない。
01

In plain words概要

What the arm is, what it is asked to do, and why the same task is solved three times.

どんなアームか、何をさせるのか、そして同じタスクをなぜ3通りで解くのか。

The SO-ARM100 is a 3D-printed arm with five joints and a parallel gripper, driven by hobby servos. It costs a few hundred dollars and it is the arm most of the open LeRobot community data was recorded on, which makes it the natural target for a project about learning manipulation from data.

SO-ARM100は、5つの関節と平行グリッパーを持つ3Dプリント製のアームで、ホビー用サーボで駆動します。 価格は数百ドル程度で、LeRobotコミュニティの公開データの大半がこのアームで収録されています。 そのため、データからマニピュレーションを学習するプロジェクトの対象として自然な選択です。

Here the arm lives in MuJoCo, a physics simulator, on a laptop with no graphics card. The description comes from MuJoCo Menagerie, unchanged. On top of it sit a table, three coloured cubes, a target marker and three cameras. The policy's job is one of four things: hover the gripper over a cube, push it onto the marker, lift it clear of the table, or carry it to the marker and let go.

ここではアームを物理シミュレーターのMuJoCo上で動かします。実行環境はGPUのないノートPCです。 モデル記述はMuJoCo Menagerieのものを無改変で使い、その上にテーブル、色の異なる3つのキューブ、目標マーカー、3台のカメラを配置しています。 Policyに課すタスクは4つのうちいずれかです。グリッパーをキューブの上に移動させる、キューブをマーカーまで押す、 テーブルから持ち上げる、マーカーまで運んで離す、の4つです。

Three separate repositories learn those tasks in three different ways, and the point of running all three on one bench is the comparison.

3つの独立したリポジトリが、これらのタスクをそれぞれ異なる方法で学習します。 3つを同じベンチ上で動かす目的は、比較することにあります。

The three routes3つのアプローチ

Reinforcement learning gets a reward signal and privileged information (the cube's true position) and has to discover the motion itself. Imitation learning gets a few hundred demonstrations from a scripted expert, a camera image and the arm's own joint readings, and copies. The language policy gets the same image and joints plus a sentence, and has to work out from the sentence which cube and which task is meant, including sentences and task-colour pairs it never saw in training.

強化学習は、reward信号と特権情報(キューブの真の位置)を受け取り、動作を自力で見つけ出します。 Imitation learningは、スクリプト化したエキスパートによる数百件のデモンストレーション、カメラ画像、アーム自身の関節値を受け取り、それを真似します。 Language policyは、同じ画像と関節値に加えて1つの文を受け取り、どのキューブに対するどのタスクなのかを文から読み取る必要があります。 学習中に一度も見ていない文や、タスクと色の組み合わせも含みます。

Where things stand現在の状況

All four repositories are written, tested and green in continuous integration, and every results table on this page carries numbers produced by a named script on an idle machine: the bench, the imitation policies and the language policy at 100 episodes × 5 seeds, the RL policies on one training seed. Where a table is thinner than that, it says so. Nothing here is a claim about the physical arm.

4つのリポジトリはすべて実装・テスト済みで、CIもgreenです。 このページの結果表の数値はすべて、負荷のないマシン上で名前付きスクリプトを実行して得たものです。ベンチ、imitation policy、language policyは100 episodes × 5 seeds、RL policyは学習1 seedで計測しています。 それより薄い表には、その旨を明記しています。ここに書かれた内容は、実機アームについての主張ではありません。

Terms used on this pageこのページの用語

SO-ARM100Standard Open Arm 100: a 5-DOF arm plus gripper from TheRobotStudio, driven by position-controlled servos. Version 1.3 of its MuJoCo model is used, from the Menagerie collection.Standard Open Arm 100。TheRobotStudioによる5自由度アームとグリッパーで、位置制御サーボで駆動します。MuJoCoモデルはMenagerieコレクションのバージョン1.3を使用しています。
MJCF / MjSpecMJCF is MuJoCo's XML model format. MjSpec is the programmatic editor for it, used here to attach the table, cubes, marker and cameras to the arm without editing the vendored file.MJCFはMuJoCoのXMLモデル形式です。MjSpecはそれをプログラムから編集するAPIで、ここではvendoringしたファイルを書き換えずに、テーブル・キューブ・マーカー・カメラをアームに追加するために使っています。
inverse kinematicsGiven a target pose for the gripper, find joint angles that put it there. Solved iteratively with damped least squares; the scripted expert is built on it.逆運動学。グリッパーの目標姿勢から、そこに到達する関節角を求めます。Damped least squaresで反復的に解き、スクリプト化したエキスパートはこれを土台にしています。
scripted expertA hand-written controller that reads the cube's true position from the simulator and moves through IK waypoints. It produces demonstrations and reference success rates. It is not a controller a real arm could run.シミュレーターからキューブの真の位置を読み取り、IKのウェイポイントを順にたどる手書きのコントローラーです。デモンストレーションと基準となる成功率を生成します。実機アームで動かせるコントローラーではありません。
domain randomisation (DR)Sampling physics parameters (mass, friction, servo gain, latency) from a range at every reset, so a policy is not fitted to one exact model.リセットのたびに物理パラメータ(質量、摩擦、サーボゲイン、latency)を範囲内からサンプリングし、policyが特定の1つのモデルに過適合しないようにする手法です。
held-out physicsFixed physics settings a trained policy is tested on, each outside the DR range. Success there is a transfer claim, not interpolation.学習済みpolicyをテストする固定の物理設定で、いずれもDR範囲の外にあります。ここでの成功は内挿ではなく、転移の主張になります。
PPOProximal Policy Optimization, the standard on-policy RL algorithm: collect rollouts, estimate advantages, take clipped gradient steps so the policy does not move too far per update.Proximal Policy Optimization。標準的なon-policy RLアルゴリズムです。Rolloutを収集してadvantageを推定し、1回の更新でpolicyが動きすぎないようclipした勾配ステップを取ります。
curriculumTraining on an easier task first and promoting to a harder one once a success threshold is reached, keeping the network weights across the switch.まず簡単なタスクで学習し、成功率がしきい値に達したら難しいタスクへ進める方式です。切り替え時もネットワークの重みは引き継ぎます。
behaviour cloning (BC)Supervised learning from demonstrations: given what the expert saw, predict what the expert did.デモンストレーションからの教師あり学習です。エキスパートが見たものを入力として、エキスパートの行動を予測します。
DAggerDataset Aggregation. Let the learner drive, ask the expert what it would have done at the states the learner reached, add those labels, retrain. Fixes the drift BC suffers when it leaves the demonstrated states.Dataset Aggregation。学習側に操作させ、学習側が到達した状態でエキスパートならどう動いたかを問い合わせ、そのラベルを追加して再学習します。デモにない状態へ外れたときにBCで起きるドリフトを補正します。
ACT / action chunkingAction Chunking with Transformers: predict a chunk of future actions per forward pass instead of one, and blend overlapping chunks at run time. Used here without the variational latent the original has.Action Chunking with Transformers。1回の順伝播で1つではなく将来のactionのchunkを予測し、実行時には重なり合うchunkをブレンドします。ここではオリジナルにある変分潜在変数を省いて使っています。
VLAVision-language-action model: a policy conditioned on an image and a sentence. The one here is small and trained from scratch; it is not a fine-tuned foundation model.Vision-language-actionモデル。画像と文で条件付けされたpolicyです。ここで扱うのは小規模でゼロから学習したもので、基盤モデルをfine-tuneしたものではありません。
sentence embeddingA fixed-size vector for a sentence from a pretrained text model, here MiniLM (384 numbers). Similar meanings should land near each other.事前学習済みテキストモデル(ここではMiniLM、384次元)が文から作る固定長ベクトルです。意味の近い文は近い位置に来るはずです。
FiLMFeature-wise Linear Modulation: the sentence embedding produces a scale and shift applied to the image features, so the instruction changes what the vision layers look for.Feature-wise Linear Modulation。Sentence embeddingから画像特徴に掛けるスケールとシフトを生成し、指示文によって視覚層が注目するものを変えます。
LoRALow-Rank Adaptation: fine-tuning a large network by training small rank-8 matrices added to a few weight matrices, leaving the original weights frozen.Low-Rank Adaptation。元の重みは固定したまま、一部の重み行列に追加したrank 8の小さな行列だけを学習して大規模ネットワークをfine-tuneする手法です。
LeRobotDataset v3The on-disk format Hugging Face LeRobot uses for robot demonstrations: parquet tables plus video or image frames, with episode indexing.Hugging Face LeRobotがロボットのデモンストレーション保存に使う形式です。Parquetのテーブルと動画または画像フレームで構成され、episode単位のインデックスを持ちます。
02

One bench, three projects共通ベンチ1つと3つのプロジェクト

Why the tasks, the physics shifts and the evaluation protocol live in a separate repository that the other three depend on.

タスク、物理パラメータの変化、評価プロトコルを、他の3つが依存する独立したリポジトリに置いている理由。

3つの学習手法の比較は、3つとも同じ方法で計測されていなければ読む価値がありません。 そこで、policyを後で評価する基準はすべてso-arm100-simの1か所で定義しています。 4つのタスクとその成功条件、2種類のobservation構成、DR範囲、6つのheld-out物理セル、 評価プロトコル(1セルあたり100 episode × 5 seed、seed間の平均とばらつき)、スクリプト化したエキスパートとその成功率表、 指示文テンプレートと学習用/held-outの分割、そしてデータセットレコーダーです。

3つのpolicyリポジトリは、固定したリリースタグ(v0.1.0)からベンチをインストールしてimportします。 どのリポジトリもタスクやしきい値を再定義しません。ベンチのテストがvendoringしたアーム記述のハッシュを検証しているため、 ロボットモデルを誤って編集すると、下流のすべての数値が黙って変わるのではなく、CIが失敗します。

A comparison between three learning methods is only worth reading if all three are measured the same way. So everything a policy is later judged against is defined once, in so-arm100-sim: the four tasks and their success rules, the two observation layouts, the DR ranges, the six held-out physics cells, the evaluation protocol (100 episodes × 5 seeds per cell, mean and spread over seeds), the scripted expert and its own success table, the language templates and their train/held-out split, and the dataset recorder.

The three policy repositories install the bench from a pinned release tag (v0.1.0) and import from it. None of them redefines a task or a threshold. A test in the bench hashes the vendored arm description, so an accidental edit to the robot model fails CI rather than silently changing every downstream number.

benchベンチso-arm100-sim Scene, tasks, IK expert, DR, evaluation, instruction templates, dataset writer, vector env. シーン、タスク、IKエキスパート、DR、評価、指示文テンプレート、データセット書き出し、vector env。 63 tests · reference numbers measured63テスト · 基準値は計測済み
route 1アプローチ1so-arm100-rl PPO on privileged state, reach → push → lift curriculum, nominal vs DR, held-out gap, ONNX export. 特権状態を入力とするPPO、reach → push → liftのcurriculum、nominalとDRの比較、held-outでの性能差、ONNX export。 21 tests · trained, one seed21テスト · 学習済み(1 seed)
route 2アプローチ2so-arm100-il BC, DAgger and ACT-lite from scripted demonstrations on image + proprioception; dataset-size curve. 画像と固有受容感覚(proprioception)を入力に、スクリプトのデモからBC・DAgger・ACT-liteを学習。データセットサイズ曲線。 21 tests · trained, 5 seeds21テスト · 学習済み(5 seeds)
route 3アプローチ3so-arm100-vla Language-conditioned multitask policy; seen / paraphrase / combo splits; encoder ablation; LoRA gate. Language-conditionedなマルチタスクpolicy。seen / paraphrase / comboの3分割、エンコーダーのablation、LoRAの可否判定。 24 tests · gate measured24テスト · 可否判定は計測済み

What the shared protocol buys: the expert's success rate is the ceiling every learned policy is read against; the RL policy's drop on heavy physics and the imitation policy's drop on the same cell are the same experiment; and "unseen paraphrase" in the language project means exactly the sentences the imitation recorder refused to write.

共通プロトコルによって得られるものは3つです。エキスパートの成功率が、学習したすべてのpolicyを評価する上限になること。 heavy物理条件でのRL policyの低下と、同じセルでのimitation policyの低下が、同一の実験になること。 そしてlanguageプロジェクトの「未見のparaphrase」が、imitation用レコーダーが書き出しを拒否した文とまったく同じものを指すことです。

03

Every file, and what it is for全ファイルとその役割

The source files across the four repositories, with line counts, grouped by repository.

4つのリポジトリのソースファイルを、行数とともにリポジトリ別にまとめています。

so-arm100-sim, 3,424 lines(3,424行)

fileファイルlines行数job役割
so_arm100_sim/env.py455ArmEnv: four tasks, state (25-d) and proprio (15-d) observations, delta and absolute actions, 20 Hz control over 2 ms physics, success rules, termination and truncation kept apartArmEnv:4タスク、state(25次元)とproprio(15次元)のobservation、deltaとabsoluteのaction、2 ms物理ステップ上の20 Hz制御、成功条件、terminationとtruncationの区別
so_arm100_sim/scene.py247Builds the tabletop with MjSpec: floor, three cubes, marker, three cameras, an end-effector site on the fixed jaw. Spawn box and cube size constantsMjSpecで卓上シーンを構築:床、キューブ3個、マーカー、カメラ3台、固定ジョー上のエンドエフェクタsite。出現範囲とキューブサイズの定数
so_arm100_sim/expert.py247ScriptedExpert: per-task phase machine over IK waypoints, grasp-branch resolution, Cartesian integral correction, rate limitingScriptedExpert:IKウェイポイント上のタスク別フェーズ遷移、把持ブランチの選択、デカルト空間の積分補正、変化率制限
so_arm100_sim/dr.py173DRConfig training ranges, EVAL_PHYSICS held-out cells, exact apply and restore against the vendored modelDRConfigの学習範囲、EVAL_PHYSICSのheld-outセル、vendoringしたモデルに対する厳密な適用と復元
so_arm100_sim/vec_env.py135N environments in N forked processes, one observation batch per step, terminal_obs carried on truncationN個の環境をN個のforkプロセスで実行、1ステップごとにobservationを1バッチで返す、truncation時はterminal_obsを引き渡す
so_arm100_sim/evaluate.py113The protocol: 100 episodes × 5 seeds per cell, JSON with provenance (package versions, model hash)評価プロトコル:1セルあたり100 episode × 5 seed、来歴情報(パッケージバージョン、モデルハッシュ)付きのJSON
so_arm100_sim/ik.py111Damped least-squares IK on the end-effector site, orientation down-weighted because one rotational degree is structurally unreachable on a 5-DOF armエンドエフェクタsiteに対するdamped least-squares IK。5自由度アームでは回転1自由度が構造的に到達不能なため、姿勢の重みを下げている
so_arm100_sim/record.py100Records successful expert episodes as a LeRobotDataset v3 (proprio, image, absolute joint targets, instruction)成功したエキスパートのepisodeをLeRobotDataset v3として記録(proprio、画像、絶対関節目標値、指示文)
so_arm100_sim/instructions.py99Five training and three held-out sentence templates per task, and the held-out (task, colour) pairsタスクごとに学習用5個・held-out用3個の文テンプレートと、held-outの(タスク, 色)ペア
so_arm100_sim/datasets.py80LeRobotDataset writer wrapper; finalize() is mandatory or the parquet is corruptLeRobotDataset書き出しのラッパー。finalize()を呼ばないとparquetが壊れる
so_arm100_sim/render.py · gym_adapter.py96Offscreen camera rendering; a gymnasium wrapperオフスクリーンのカメラ描画、gymnasiumラッパー
scripts/bench_throughput.py1101/2/4/8-process sweep bracketed by a single-process reference; refuses to certify a drifting table前後を単一プロセスの基準値で挟んだ1/2/4/8プロセスのスイープ。値がドリフトした表は採用しない
scripts/expert_success.py · view_scene.py · record_dataset.py125The expert's headline table; a viewer; a thin wrapper around the recorderエキスパートの主要結果表、ビューアー、レコーダーの薄いラッパー
tools/reach_map.py · probe_model.py121Where a top-down grasp is IK-reachable; measured frames of the vendored model真上からの把持がIKで到達可能な領域、vendoringしたモデルの座標系の実測
tests/ (8 files)73163 tests: scene hash, contract, IK, expert gates, DR outside-range property, vector env, recorder63テスト:シーンのハッシュ、インターフェース契約、IK、エキスパートの合格基準、DR範囲外の性質、vector env、レコーダー

so-arm100-rl, 1,872 lines(1,872行)

fileファイルlines行数job役割
so_arm100_rl/ppo.py323PPO: Gaussian actor, separate critic (2 × 256, tanh), GAE with termination and truncation distinguished, per-epoch KL stop, running normaliser, checkpointing, throughput monitorPPO:ガウス分布のactor、独立したcritic(2 × 256、tanh)、terminationとtruncationを区別したGAE、epochごとのKL stop、running normaliser、checkpoint保存、throughputモニター
train.py232Entry point; chunked and resumable; curriculum, DR, success-termination and warm-start flagsエントリーポイント。分割実行・再開に対応。curriculum、DR、成功時termination、warm startのフラグ
export_onnx.py106Normaliser folded into the actor's mean as one ONNX graph, verified to 1e-5 on 1,000 observations, timed on one threadNormaliserをactorの平均出力に畳み込んで1つのONNXグラフに。1,000件のobservationで1e-5まで一致を検証し、1スレッドで計時
so_arm100_rl/curriculum.py86Stage promotion on rolling success; steps-to-threshold bookkeeping直近の成功率によるステージ昇格、しきい値到達までのstep数の記録
so_arm100_rl/normalizer.py72Welford running mean and variance, frozen at evaluation and exportWelford法による逐次平均・分散。評価時とexport時は固定
eval_gap.py · compare_gap.py102Bench protocol on every held-out cell, cells in parallel processes; nominal-trained vs DR-trained table全held-outセルでベンチのプロトコルを実行(セルごとに並列プロセス)。nominal学習とDR学習の比較表
so_arm100_rl/boxcheck.py33Refuse to start on a loaded machine負荷のかかったマシンでは起動しない
tools/probe_hover.py31The probe that found the hover exploit: mean-action rollouts, cube height and grasp per stepホバリングの抜け穴を見つけた調査スクリプト:平均actionでのrollout、stepごとのキューブ高さと把持状態
tests/ (10 files)37021 tests: a hand-worked GAE case, normaliser, curriculum state machine, bit-exact resume, 2,048-step training smoke, ONNX round trip, KL stop, success-termination flag, warm start, parallel evaluation equals serial21テスト:手計算したGAEのケース、normaliser、curriculumのstate machine、ビット単位で一致する再開、2,048 stepの学習スモークテスト、ONNXの往復変換、KL stop、成功時terminationフラグ、warm start、並列評価と逐次評価の一致

so-arm100-il, 1,828 lines(1,828行)

fileファイルlines行数job役割
so_arm100_il/models.py185StateMLP, ImagePolicy (CNN → spatial soft-argmax keypoints → MLP), ACTLite (keypoint tokens, 2-layer encoder, 2-layer decoder, 20 queries), masked L1 loss, temporal ensemblerStateMLP、ImagePolicy(CNN → 空間soft-argmaxによるkeypoint → MLP)、ACTLite(keypointトークン、2層encoder、2層decoder、20クエリ)、マスク付きL1 loss、時間方向のアンサンブル
so_arm100_il/data.py153Reads the LeRobotDataset, builds k-step action windows, split by episode, normalisation from training episodes onlyLeRobotDatasetを読み込み、k step分のactionウィンドウを構築。episode単位で分割し、正規化統計は学習用episodeのみから算出
so_arm100_il/human_video.py142Experimental: MediaPipe hand landmarks from an overhead video to IK targets, replayed in the simulator実験的機能:俯瞰動画からMediaPipeで手のランドマークを取り、IK目標に変換してシミュレーターで再生
scaling.py143Dataset-size curve: 10, 25, 50, 100, 200 episodes × 3 seeds (6 for ACT), 20 epochs, 50 evaluation episodes eachデータセットサイズ曲線:10、25、50、100、200 episode × 3 seed(ACTは6)、20 epoch、各50評価episode
dagger.py111DAgger loop: mixed control, shadow-expert labels, aggregate, retrainDAggerループ:混合制御、シャドーエキスパートによるラベル付け、集約、再学習
so_arm100_il/training.py · policy.py · shadow.py189Training loop; run-time policy wrapper; the expert running in the learner's shadow学習ループ、実行時のpolicyラッパー、学習側の裏で並走するエキスパート
train_bc.py · eval_policy.py · scripts/381BC entry point; held-out physics evaluation in resumable (physics, seed) units with a time budget; demo recorder, hand-video wrapper and the combined scaling figureBCのエントリーポイント。時間予算付きで(物理条件, seed)単位に再開可能なheld-out物理評価。デモレコーダー、手の動画用ラッパー、スケーリングの統合図
tests/ (6 files)36121 tests: windows, models, ensembling, shadow expert with beta = 1, hand mapping, an end-to-end record → train → evaluate smoke, resumed evaluation equals serial21テスト:ウィンドウ、モデル、アンサンブル、beta = 1でのシャドーエキスパート、手のマッピング、記録 → 学習 → 評価のend-to-endスモークテスト、再開した評価と逐次評価の一致

so-arm100-vla, 2,076 lines(2,076行)

fileファイルlines行数job役割
so_arm100_vla/data.py223Records every training (task, colour) combination through the bench expert with distractors on; caches frames; k-step action windows学習用の全(タスク, 色)の組み合わせを、ディストラクターありでベンチのエキスパートにより記録。フレームのキャッシュ、k step分のactionウィンドウ
smolvla_reference.py175Zero-shot SmolVLA-base through the same protocol, inference only; --dry-run validates the observation mapping against a stub同じプロトコルでSmolVLA-baseをzero-shot評価(推論のみ)。--dry-runでスタブを相手にobservationの対応付けを検証
so_arm100_vla/model.py149LangPolicy: CNN → FiLM → 32 keypoints, three tokens, d = 128 transformer, 10 action queries; ChunkEnsemblerLangPolicy:CNN → FiLM → 32 keypoint、3トークン、d = 128のtransformer、10個のactionクエリ。ChunkEnsembler
so_arm100_vla/text.py124MiniLMEncoder (frozen, cached to disk) and HashEncoder, both 384-dMiniLMEncoder(重み固定、ディスクにキャッシュ)とHashEncoder。いずれも384次元
train.py · eval_language.py · record_data.py255Training with final-epoch reporting; the three splits through the bench protocol; the recorder entry point最終epochの値を報告する学習、ベンチのプロトコルによる3分割の評価、レコーダーのエントリーポイント
lora_gate.py · so_arm100_vla/lora.py198Times one LoRA training step on a SmolVLM-256M-shaped decoder; LoRALinear with exact merge and unmergeSmolVLM-256Mと同形状のdecoderでLoRA学習1 stepを計時。厳密なmerge/unmergeを持つLoRALinear
so_arm100_vla/policy.py · splits.py125Runner that carries the sentence the bench env does not know about; seen / paraphrase / combo split definitionsベンチのenvが関知しない指示文を保持する実行ラッパー、seen / paraphrase / combo分割の定義
tests/ (8 files)36224 tests: encoders, splits, windowing, shapes, ensembling, LoRA maths, SmolVLA mapping, end-to-end smoke24テスト:エンコーダー、分割、ウィンドウ化、テンソル形状、アンサンブル、LoRAの数式、SmolVLAの対応付け、end-to-endスモークテスト

Each repository also carries a Dockerfile, a GitHub Actions workflow, a verify.sh that reproduces the README from a clean checkout, and a docs/ISSUES.md listing its open ends. Line counts exclude the vendored arm description and images.

各リポジトリには、Dockerfile、GitHub Actionsのワークフロー、クリーンなcheckoutからREADMEの内容を再現するverify.sh、未解決事項をまとめたdocs/ISSUES.mdも含まれています。行数には、vendoringしたアーム記述と画像は含みません。

04

The benchベンチ

The tasks, the observations, the physics shifts, and the two things the scripted expert had to get right.

タスク、observation、物理パラメータの変化、そしてスクリプト化したエキスパートで解決が必要だった2つの問題。

Four tasks, one rule each4つのタスクと、それぞれ1つの成功条件

Control runs at 20 Hz; each control step is 25 physics steps of 2 ms. Episodes end on success or on the step limit, and the two are reported separately because a value estimate has to bootstrap on one and not the other.

制御周期は20 Hzで、1制御ステップは2 msの物理ステップ25回分です。 Episodeは成功またはstep上限で終了します。価値推定は一方ではbootstrapが必要で、もう一方では不要なため、2つは区別して報告します。

taskタスクsuccess成功条件step limitstep上限
reachend effector within 2 cm of a point 3 cm above the cubeキューブの3 cm上の点から2 cm以内にエンドエフェクタがある100
pushcube centre within 2.5 cm (xy) of the markerキューブ中心がマーカーから2.5 cm以内(xy平面)150
liftcube 5 cm above its resting height and both jaws touching itキューブが静止時の高さより5 cm上にあり、かつ両方のジョーが接触している150
pick_placecube within 2.5 cm of the marker, on the table, releasedキューブがマーカーから2.5 cm以内のテーブル上にあり、グリッパーから離れている250

The "both jaws touching" clause exists because a cube flung upward otherwise counts as lifted.

「両方のジョーが接触」という条件がないと、上に弾き飛ばされたキューブも持ち上げ成功と判定されてしまいます。

Two observation layouts2種類のobservation構成

state, 25-dstate(25次元)
Joint angles and velocities, end-effector position, active cube position, cube minus end effector, target position, jaw gap. Privileged: the policy knows where the cube is. Used by the RL project.
関節角と角速度、エンドエフェクタ位置、対象キューブの位置、キューブとエンドエフェクタの差、目標位置、ジョーの開き幅。特権情報を含み、policyはキューブの位置を知っています。RLプロジェクトで使用します。
proprio, 15-dproprio(15次元)
Joint angles and velocities, end-effector position. What the real arm knows about itself. Anything about objects has to come from the camera image. Used by the imitation and language projects.
関節角と角速度、エンドエフェクタ位置。実機アームが自分自身について知っている情報です。物体に関する情報はすべてカメラ画像から得る必要があります。Imitationとlanguageのプロジェクトで使用します。

Actions are 6-d either way: delta in [−1, 1] added to the previous joint target, or absolute joint targets in radians, which is what a recorded dataset stores and what the physical arm takes.

Actionはどちらの場合も6次元です。前回の関節目標値に加算する[−1, 1]のdeltaか、 ラジアン単位のabsolute関節目標値のいずれかです。後者は記録したデータセットが保存する形式であり、実機アームが受け取る形式でもあります。

Where the cubes may appear, and why the box is smallキューブの出現範囲と、それが狭い理由

The fingertip can reach almost anywhere within 0.4 m. Pointing the gripper straight down cannot, because that spends the wrist pitch. tools/reach_map.py maps where a top-down grasp is solvable to 3 mm at the height the lift task has to hold the cube (about 9 cm), and the spawn box, x in ±0.10 m and y in −0.26 to −0.16 m, sits inside that region. The lift height of 5 cm was set from the same map.

指先だけなら0.4 m以内のほぼどこにでも届きます。しかしグリッパーを真下に向けると手首のピッチを使い切るため、届く範囲は狭まります。 tools/reach_map.pyは、liftタスクでキューブを保持する高さ(約9 cm)で、真上からの把持が3 mm精度で解ける領域をマップ化します。 出現範囲(xが±0.10 m、yが−0.26〜−0.16 m)はその領域の内側にあります。持ち上げ高さの5 cmも同じマップから決めました。

Domain randomisation and the held-out cellsDomain randomisationとheld-outセル

Two things are defined here and kept apart. DRConfig is what a training run samples at every reset. EVAL_PHYSICS is a fixed set of shifts a trained policy is tested on, and a test asserts that every cell is outside the DR range in at least one factor.

ここでは2つのものを定義し、明確に分けています。DRConfigは、学習時にリセットのたびにサンプリングする範囲です。 EVAL_PHYSICSは、学習済みpolicyをテストする固定の変化セットです。どのセルも少なくとも1つの要素でDR範囲外にあることを、テストで確認しています。

factor要素DR range (× nominal)DR範囲(nominal比)held-out cellheld-outセル
cube massキューブの質量0.5 – 2.0heavy 3.0
cube sliding frictionキューブの滑り摩擦0.5 – 1.5 (only above 1.0 acts)0.5 – 1.5(効くのは1.0超のみ)slippery 0.3 (inert)(効果なし)
servo gain kpサーボゲインkp0.6 – 1.4weak 0.45
joint damping, frictionloss関節のdamping、frictionloss0.5 – 2.0–
cube half-extentキューブの半辺長10 – 15 mmsmall 9 mm
action latencyActionのlatency0 – 2 control steps0 – 2制御ステップlaggy 3
observation noise (rad, m)Observationノイズ(rad, m)0.005, 0.003noisy 3×

Scaling kp scales the position actuator's gain and position bias together and leaves the velocity feedback alone, so a weaker motor is also a more damped one. That is what a weaker motor does, and it is a documented choice rather than a side effect.

kpのスケーリングでは、位置アクチュエータのゲインと位置バイアスを同時にスケールし、速度フィードバックはそのままにします。 そのため弱いモーターは、より減衰の強いモーターにもなります。これは実際の弱いモーターの挙動であり、副作用ではなく意図して文書化した選択です。

The scripted expert, and two things a first draft got wrongスクリプト化したエキスパートと、初版で誤っていた2点

The expert reads the cube's true pose from the simulator and moves through IK waypoints, rate limited to 0.05 rad per step so the actions are smooth enough to learn from. It is a demonstrator and a reference, not a controller the real arm could run. Two problems had to be solved before it worked.

エキスパートはシミュレーターからキューブの真の姿勢を読み取り、IKのウェイポイントを順にたどります。 学習に使えるほど滑らかなactionにするため、変化量は1 stepあたり0.05 radに制限しています。 これはデモンストレーターかつ基準であり、実機アームで動かせるコントローラーではありません。動作させるまでに2つの問題を解決する必要がありました。

1

The grasp is ambiguous by 180 degrees把持には180度の曖昧さがある

A parallel jaw closing along yaw θ is the same grasp as θ + π, but only one of the two may be inside the wrist-roll limit from where the arm currently is. Both branches are solved, the better one wins, and the choice is held for the whole episode so the wrist does not flip halfway through the approach.

ヨー角θ方向に閉じる平行ジョーの把持は、θ + πと同じ把持です。しかし現在のアームの姿勢からは、どちらか一方しか手首ロールの可動範囲に入らない場合があります。 両方のブランチを解いて良い方を採用し、接近の途中で手首が反転しないよう、その選択をepisode全体で保持します。

2

Position servos sag, so the loop had to be closed位置サーボが垂れるため、ループを閉じる必要があった

The actuators are plain PD with no gravity compensation. The arm settles 1 to 2 cm from the pose IK asked for, more under a weakened kp. The expert integrates the Cartesian error near each waypoint and shifts its IK target by it, with anti-windup, and only once the arm has stopped slewing. A hover phase 1 cm above the cube exists so that this correction has converged before the descent. Without it the open jaw landed on the cube and pushed it away instead of straddling it.

アクチュエータは重力補償のない単純なPDです。アームはIKが指示した姿勢から1〜2 cmずれた位置で静止し、kpを弱めるとずれはさらに大きくなります。 エキスパートは各ウェイポイント付近でデカルト空間の誤差を積分し、その分だけIK目標をずらします。アンチワインドアップ付きで、アームの移動が止まってからのみ適用します。 キューブの1 cm上でホバリングするフェーズを設けているのは、下降前にこの補正を収束させるためです。 これがないと、開いたジョーがキューブを挟まずにその上に着地し、キューブを押しのけていました。

The expert's own numbersエキスパート自身の成功率

100 episodes × 5 seeds per cell, mean ± standard deviation of the per-seed success rate. This is the ceiling every learned policy is read against.

1セルあたり100 episode × 5 seedで、seedごとの成功率の平均 ± 標準偏差です。学習したすべてのpolicyは、この上限と比較して評価します。

taskタスクnominalheavyslipperyweaklaggynoisysmall
reach1.00 ± 0.001.00 ± 0.001.00 ± 0.001.00 ± 0.001.00 ± 0.001.00 ± 0.001.00 ± 0.00
push0.76 ± 0.070.79 ± 0.070.76 ± 0.070.74 ± 0.050.74 ± 0.050.76 ± 0.070.73 ± 0.06
lift0.93 ± 0.020.90 ± 0.020.93 ± 0.020.97 ± 0.020.92 ± 0.030.93 ± 0.020.73 ± 0.05
pick_place0.93 ± 0.010.85 ± 0.020.93 ± 0.010.96 ± 0.010.90 ± 0.040.93 ± 0.010.72 ± 0.05

The small cube is the expert's real weakness: lift and pick_place fall from 0.93 to 0.73 and 0.72. No other physics change moves them by more than 0.08. Push stays at 0.73 to 0.79 in every column, and its seed spread is as large as any column's gap from nominal, so the limit is the scripted push itself. The one-seed, 30-episode development readings put the small cube at 0.87 and 0.80. The measured spread shows why they were never the reference.

エキスパートの本当の弱点は小さいキューブです。liftとpick_placeは0.93から0.73と0.72に下がります。 他の物理条件の変化では、どちらも0.08を超えて動きません。pushはどの列でも0.73〜0.79にとどまり、seed間のばらつきがnominalとの差と同程度あるため、 限界はスクリプト化したpush動作そのものにあります。開発時に1 seed・30 episodeで取った値では、小さいキューブは0.87と0.80でした。 計測したばらつきを見れば、それらを基準値にしなかった理由がわかります。

ThroughputThroughputの計測

Lift task on the laptop CPU under WSL2, capped at 8 threads. Mean ± sd over three sweeps that passed the drift guard:

ノートPCのCPU(WSL2、8スレッドに制限)でliftタスクを実行。ドリフト検査を通過した3回のスイープの平均 ± 標準偏差です。

processesプロセス数env-steps/sefficiency効率
11,954 ± 49100%
23,691 ± 3494%
45,918 ± 35876%
87,302 ± 56947%

The first three sweeps drifted 25 to 58% and were thrown out. On the Windows "Balanced" power plan the CPU starts at a low clock, so the first reference read low and every later row looked faster. A 10 s, 8-process warm-up before the sweep fixed it. The sweep rows are 15 s bursts. Held for three minutes, 8 processes settle at 5,361 env-steps/s, 28% below the first window. That plateau, not the burst, is the number to budget training from.

最初の3回のスイープは25〜58%ドリフトしたため破棄しました。Windowsの電源プラン「バランス」ではCPUが低クロックから立ち上がるため、 最初の基準値が低く出て、後続の行がすべて速く見えていました。スイープ前に8プロセスで10秒間のウォームアップを入れることで解決しました。 スイープの各行は15秒間のバースト値です。3分間継続すると、8プロセスは5,361 env-steps/sに落ち着き、最初の区間より28%低くなります。 学習時間の見積もりに使うべきなのは、バースト値ではなくこの定常値です。

Found by a test, not by a policyPolicyではなくテストで発見

The action-latency buffer held one entry too many, so every command reached the servos one step late even with latency set to zero. test_kp_affects_tracking failed because a step command produced no motion inside the step that issued it. The expert had been succeeding through the bug. It is fixed, and the test stays.

Action latencyのバッファが1要素多く保持していたため、latencyをゼロに設定していても、すべての指令が1 step遅れてサーボに届いていました。 test_kp_affects_trackingが、ステップ指令を出したそのstep内で動きが生じないことから失敗して発覚しました。 エキスパートはこのバグがあっても成功していました。バグは修正済みで、テストはそのまま残しています。

05

Route 1: reinforcement learningアプローチ1:強化学習

PPO on privileged state, a three-stage curriculum, and the nominal-versus-randomised transfer table.

特権状態を入力とするPPO、3段階のcurriculum、そしてnominal学習とrandomised学習の転移比較表。

The RL project asks two measured questions, not one. Does training under randomised physics buy success on physics outside the randomised range? And does a curriculum that starts with reaching buy anything on the lifting task it is meant to help?

RLプロジェクトでは、1つではなく2つの問いを計測で確かめます。物理パラメータをランダム化して学習すると、ランダム化範囲外の物理条件でも成功できるのか。 そして、リーチから始めるcurriculumは、本来助けるはずの持ち上げタスクに何らかの効果をもたらすのか、です。

The algorithm, and two places it departs from a textbook PPOアルゴリズムと、教科書的なPPOとの2つの違い

The loop is the clipped-surrogate PPO from the author's earlier from-scratch implementation: GAE, orthogonal initialisation, separate actor and critic of two 256-unit tanh layers, learning-rate annealing, 8 forked environments with 128 steps each per update. Two things the cart-pole never forced appear here.

学習ループは、筆者が以前ゼロから実装したclipped-surrogate型のPPOです。GAE、直交初期化、256ユニット・tanh 2層の独立したactorとcritic、 学習率のアニーリング、更新ごとに8つのfork環境で各128 stepを収集します。ここでは、cart-poleでは必要にならなかった点が2つ出てきます。

1

Two kinds of episode end2種類のepisode終了

These tasks terminate on success, where there is no future to bootstrap, and truncate on the step limit, where there is: the value of the state the episode stopped in, which the vector env carries as terminal_obs. Treating a truncation as a termination zeroes that bootstrap and corrupts the value target for roughly 1/(1−γ) ≈ 100 steps before every step limit. A four-step test case with one of each is worked by hand.

これらのタスクは成功時にterminationとなり、その先にbootstrapすべき将来はありません。 一方step上限ではtruncationとなり、bootstrapすべき値があります。episodeが止まった状態の価値で、vector envがterminal_obsとして引き渡します。 Truncationをterminationとして扱うとこのbootstrapがゼロになり、各step上限の手前およそ1/(1−γ) ≈ 100 stepにわたって価値の目標値が壊れます。 両方を1回ずつ含む4 stepのテストケースを手計算で検証しています。

2

A running observation normaliser, frozen for evaluation評価時に固定するobservationのrunning normaliser

The 25-d state mixes radians, metres and a scaled velocity, and the per-group RMS spans more than an order of magnitude. A Welford running mean and variance is updated from rollouts and then frozen at evaluation and export, so the policy that is measured is the policy that was trained. Actions are clipped to [−1, 1] at the environment boundary while the log-probability uses the unclipped sample; that is biased and common, and the saturation fraction is logged so its size stays visible.

25次元のstateにはラジアン、メートル、スケーリングした速度が混在し、グループごとのRMSは1桁以上の幅があります。 Welford法の逐次平均・分散をrolloutから更新し、評価時とexport時には固定します。これにより、計測するpolicyは学習したpolicyと同一になります。 Actionは環境の境界で[−1, 1]にclipしますが、対数確率はclip前のサンプルで計算します。これはバイアスを持つものの一般的な方法で、影響の大きさが見えるよう飽和の割合をログに残しています。

CurriculumCurriculumの設計

Stages run reach → push → lift. Promotion happens when the rolling success over the last 100 finished episodes reaches 0.8 for reach and push, or 0.6 for lift. Weights and normaliser are kept across the promotion, the learning-rate anneal restarts, and the vector env swaps its task. --no-curriculum trains lift from scratch on the same budget. What should transfer between stages is the joint-space skill of putting the end effector at a point; what should not is anything about contact. Whether the transferred part is worth the steps spent on reach and push is the measurement.

ステージはreach → push → liftの順に進みます。直近に終了した100 episodeの成功率が、reachとpushでは0.8、liftでは0.6に達すると昇格します。 昇格時に重みとnormaliserは引き継ぎ、学習率のアニーリングは最初からやり直し、vector envはタスクを切り替えます。 --no-curriculumでは、同じ予算でliftをゼロから学習します。ステージ間で転移すべきなのは、エンドエフェクタを目標点に置く関節空間のスキルであり、 接触に関することは転移しないはずです。転移した部分が、reachとpushに費やしたstepに見合うかどうかが、今回計測する点です。

run学習条件steps to lift ≥ 0.6 (rolling 100)lift ≥ 0.6到達までのstep数(直近100件)final eval success最終評価の成功率seeds
curriculumnot reached in 20 M (stuck on push)20 Mで未到達(pushで停滞)0.45 on push; lift never startedpushで0.45、liftには未到達1
from scratchゼロから学習0.996 M1.00 (20 episodes)(20 episodeで評価)1
Measured, and negative計測結果:ネガティブ

The curriculum cleared reach at 54 k steps, then stalled on push: rolling success peaked at 0.60 against the 0.8 gate, so 99.7% of the budget went to push and lift was never trained. From scratch, lift crossed 0.6 inside the first million steps. What failed is the gate, not the transfer: push at 0.8 is a harder bar than lift at 0.6 from scratch, so the curriculum blocked the task it was meant to help. One seed; a lower push gate or a per-stage step cap is the next test.

Curriculumはreachを54 k stepで突破しましたが、pushで停滞しました。直近の成功率は昇格基準0.8に対して最大0.60にとどまり、 予算の99.7%がpushに費やされ、liftは一度も学習されませんでした。ゼロから学習した場合、liftは最初の100万step以内に0.6を超えました。 失敗したのは転移ではなく昇格基準です。pushの0.8は、ゼロから学習するliftの0.6より高いハードルであり、curriculumが本来助けるはずのタスクを妨げてしまいました。 1 seedのみの結果です。次に試すのは、pushの昇格基準を下げるか、ステージごとにstep上限を設けることです。

The transfer table転移の比較表

--dr full samples the bench's ranges at every reset; --dr none trains on the vendored model as is. Both policies are then run on every held-out cell, plus a dr cell with in-range sampling, which is the DR policy's home ground. Each cell is 100 episodes × 5 seeds.

--dr fullはリセットのたびにベンチの範囲からサンプリングし、--dr noneはvendoringしたモデルのまま学習します。 両方のpolicyを全held-outセルで実行し、さらにDR policyの得意領域である範囲内サンプリングのdrセルでも実行します。各セルは100 episode × 5 seedです。

Three failed runs, kept失敗した3つの学習(記録として残す)

Step size。8 epoch/更新の素のclipped PPOでは、4.46 M stepの時点でclip fractionが0.77、近似KLが1.44、σが0.50から0.054まで下がり、成功率は0.02でした。 対策:KLが0.02を超えた時点でepochループを打ち切る。ホバリング。KL stopを入れると、liftは把持を覚えたものの、returnが上がる一方で成功率が下がりました。 調査スクリプトで確認すると、150 stepのうち138 stepでキューブが4.7〜4.9 cmに保持されていました。成功ラインの5.0 cmのすぐ下です。 成功するとepisodeが終了するため、保持し続けるshaping rewardの方がボーナスより大きかったのです。 対策:学習中は成功してもterminationしない。評価では引き続き最初の成功をカウントします。 DRでゼロから学習。同じ手順を完全なランダム化のもとで実行すると停滞しました。直近の成功率は最大0.09に達した後、4.9 M stepまでの700回の更新でちょうど0のままで、KLとclip fractionは正常でした。 この学習は打ち切り、代わりにnominal policyをランダム化のもとで10 M step fine-tuneしました。1 seedのみなので、これはseed 0でこの手順が失敗したことを示すだけで、DRでのゼロからの学習が不可能だという意味ではありません。

ゼロから学習したnominalは1.0 M stepで0.6を超え、20 Mを2時間10分で完了しました。速度は、静かなホストで3,043 env-steps/s、Windows側が忙しいときは2,425でした。 ExportしたONNX policy(DR fine-tune版、73,990パラメータ)はPyTorchと2.1e-6の精度で一致し、1スレッドでp50 0.008 ms、p99 0.015 msで動作します。

Step size. Plain clipped PPO at 8 epochs per update drove clip fraction to 0.77, approximate KL to 1.44 and σ from 0.50 to 0.054 by 4.46 M steps, with success at 0.02. Fix: stop the epoch loop once KL passes 0.02. Hovering. With the KL stop, lift learned to grasp and then its success fell while return rose: a probe showed the cube held at 4.7–4.9 cm for 138 of 150 steps, just under the 5.0 cm success line, because success ended the episode and the shaping reward for holding was worth more than the bonus. Fix: do not terminate on success during training; every evaluation still counts the first success. DR from scratch. The same recipe under full randomisation stalled: rolling success peaked at 0.09, then sat at exactly 0 for 700 updates up to 4.9 M steps, with normal KL and clip fraction. It was stopped and replaced by fine-tuning the nominal policy under randomisation for 10 M steps. One seed, so that says the recipe failed on seed 0, not that DR from scratch cannot work.

Nominal from scratch crossed 0.6 at 1.0 M steps and finished 20 M in 2 h 10 min, at 3,043 env-steps/s on a quiet host and 2,425 while the Windows side was busy. The exported ONNX policy (the DR fine-tune, 73,990 parameters) matches PyTorch to 2.1e-6 and runs in 0.008 ms p50, 0.015 ms p99 on one thread.

physics物理条件nominal-trainednominal学習DR fine-tunedDRでfine-tunedelta差
nominal0.998 ± 0.0040.998 ± 0.004+0.000
heavy (mass 3×)(質量3×)0.998 ± 0.0040.988 ± 0.008−0.010
slippery (friction 0.3×, inert)(摩擦0.3×、効果なし)0.998 ± 0.0040.998 ± 0.004+0.000
weak (kp 0.45×)0.982 ± 0.0131.000 ± 0.000+0.018
laggy (3 steps)(3 stepの遅延)0.458 ± 0.0520.760 ± 0.030+0.302
noisy (3× obs noise)(observationノイズ3×)0.956 ± 0.0170.948 ± 0.024−0.008
small (9 mm)0.878 ± 0.0510.960 ± 0.020+0.082
dr (in-range)(範囲内)0.888 ± 0.0380.958 ± 0.013+0.070
mean drop vs own nominal (6 held-out cells)自身のnominal値からの平均低下(held-out 6セル)0.1200.056−0.064

The DR fine-tune halves the mean drop, and almost all of it is one cell: three steps of action latency, one step past the randomised range, costs the nominal policy more than half its success and the DR policy a quarter. The mass shift costs neither anything. The friction row says nothing: the slippery cell turned out inert (see the note under the imitation tables). Two things weaken the claim: one training seed per column (the ± is over evaluation seeds only), and the DR column has 10 M more training steps, so part of the gain may be training length. A 30 M-step nominal run is the control that would separate the two, and it has not been run.

DRでのfine-tuneにより平均低下は半分になりますが、その大部分は1つのセルによるものです。 ランダム化範囲を1 step超える3 stepのaction latencyで、nominal policyは成功率の半分以上を失い、DR policyは4分の1を失います。 質量の変化はどちらにも影響しません。摩擦の行からは何も言えません。slipperyセルは効果がないことが判明したためです(imitationの表の下の注記を参照)。 この主張を弱める点が2つあります。各列の学習seedが1つだけであること(±は評価seed間のばらつきのみ)、 そしてDRの列は学習stepが10 M多いため、改善の一部は学習期間の長さによる可能性があることです。 この2つを切り分ける対照実験は30 M stepのnominal学習ですが、まだ実行していません。

A smaller mean drop for the DR policy is evidence that randomising these factors transfers to shifts in these factors. It would say nothing about the physical SO-ARM100, whose unmodelled effects (backlash, cable friction, camera latency) are in neither column. The scripted expert's own numbers on the same cells, from the bench, are the ceiling to read the table against.

DR policyの平均低下が小さいことは、これらの要素をランダム化するとこれらの要素の変化に転移する、という根拠になります。 実機のSO-ARM100については何も言えません。モデル化していない影響(backlash、ケーブルの摩擦、カメラのlatency)はどちらの列にも含まれていないからです。 この表は、ベンチで計測した同じセルでのスクリプト化エキスパートの数値を上限として読んでください。

Checkpoints and exportCheckpointとexport

Runs are chunked and resumable. The checkpoint carries model, optimiser, normaliser, RNG and curriculum state, and a test asserts that two updates after a reload equal two updates without one, bit for bit. The throughput monitor warns when the rolling env-steps/s drops more than 20% below the first five updates; the machine cannot read its own temperature and CPU contention looks identical, so the warning says to check both. Export folds the normaliser into the actor's mean as one ONNX graph that takes raw observations, verified against PyTorch to 1e-5 on 1,000 random observations before any latency is quoted.

学習は分割実行と再開に対応しています。Checkpointにはモデル、optimiser、normaliser、乱数状態、curriculumの状態が含まれ、 再読み込み後の2回の更新が、再読み込みなしの2回の更新とビット単位で一致することをテストで確認しています。 Throughputモニターは、直近のenv-steps/sが最初の5回の更新より20%以上下がると警告を出します。 このマシンは自身の温度を読み取れず、CPUの競合も同じように見えるため、警告では両方を確認するよう促します。 Exportではnormaliserをactorの平均出力に畳み込み、生のobservationを受け取る1つのONNXグラフにします。 Latencyの数値を示す前に、1,000件のランダムなobservationでPyTorchとの一致を1e-5の精度で検証しています。

F="--seed 0 --target-kl 0.02 --no-terminate-on-success"
nice -n 10 python train.py --task lift --no-curriculum --dr none $F --out runs/lift_scr_nominal
nice -n 10 python train.py --task lift --curriculum    --dr none $F --out runs/lift_cur_nominal
nice -n 10 python train.py --task lift --no-curriculum --dr full $F --total-steps 10000000 \
    --init-from runs/lift_scr_nominal/policy.pt --out runs/lift_ft_dr
python eval_gap.py --ckpt runs/lift_scr_nominal/policy.pt --task lift --tag nominal --jobs 8
python eval_gap.py --ckpt runs/lift_ft_dr/policy.pt       --task lift --tag dr      --jobs 8
python compare_gap.py runs/gap_nominal.json runs/gap_dr.json
python export_onnx.py --ckpt runs/lift_ft_dr/policy.pt --out runs/policy.onnx
06

Route 2: imitationアプローチ2:imitation learning

Behaviour cloning, DAgger and a chunked transformer from scripted demonstrations, and the question of how many demonstrations each needs.

スクリプトのデモからのbehaviour cloning、DAgger、chunk出力のtransformer。そして、それぞれに必要なデモの数。

Imitation is the route physical arms mostly take: no reward shaping, no privileged state, a few hundred demonstrations and a camera. Here the policy sees what the real arm would see, the 15-d proprioception vector and a 96 × 128 front-camera image, and nothing else.

実機アームで主に使われるのはimitationです。reward shapingも特権状態も使わず、数百件のデモンストレーションとカメラだけで学習します。 ここでのpolicyが見るのは、実機アームが見るものと同じ、15次元のproprioceptionベクトルと96 × 128の前方カメラ画像だけです。

The expert plays two rolesエキスパートの2つの役割

demonstratorデモンストレーター
Successful expert episodes are written as a LeRobotDataset v3: proprio, front image, the expert's absolute joint targets as the action, and an instruction drawn from the training templates only.
成功したエキスパートのepisodeをLeRobotDataset v3として書き出します。内容はproprio、前方画像、actionとしてのエキスパートの絶対関節目標値、そして学習用テンプレートからのみ選んだ指示文です。
oracleオラクル
DAgger needs a label at states the learner visits, which a human demonstrator cannot give after the fact. A scripted expert can: asked at any state, it returns what it would do from there, its phase machine advancing on the true state. A test checks that with the mixing coefficient at 1 the labels equal what the expert alone would have done.
DAggerには学習側が訪れた状態でのラベルが必要ですが、人間のデモンストレーターは事後にそれを与えられません。 スクリプト化したエキスパートなら可能です。任意の状態で問い合わせると、真の状態に基づいてフェーズ遷移を進め、そこから取る行動を返します。混合係数が1のとき、ラベルがエキスパート単独の行動と一致することをテストで確認しています。

Three models, one loss3つのモデル、1つのloss

modelモデルinput入力output出力why it is there位置づけ
StateMLP15-d proprio15次元のproprio1 actionaction 1つThe floor. Proprioception alone cannot locate the cube; this is the number the image models must beat.下限。Proprioceptionだけではキューブの位置がわからないため、画像モデルが上回るべき基準値です。
ImagePolicyimage + proprio画像 + proprio1 actionaction 1つA small CNN ending in a spatial soft-argmax over 16 keypoint channels. The last layer is a coordinate, so position is handed to the network rather than learned. Keypoints and proprio feed an MLP.16チャンネルのkeypointに対する空間soft-argmaxで終わる小さなCNN。最終層がそのまま座標になるため、位置は学習させるのではなくネットワークに与えられます。KeypointとproprioをMLPに入力します。
ACTLiteimage + proprio画像 + propriochunk of 20 actions20 action分のchunkACT without the variational latent: keypoint tokens and a proprio token through a 2-layer encoder, 20 learned queries through a 2-layer decoder. Overlapping chunks are blended at run time.変分潜在変数を省いたACT。keypointトークンとproprioトークンを2層encoderに通し、学習済みの20クエリを2層decoderに通します。実行時には重なり合うchunkをブレンドします。

All three train with L1 on normalised actions. Mean-squared error fits the conditional mean, and when demonstrations are multimodal (two valid grasp yaws, two ways round a cube) the mean is a third, invalid action. L1 fits the conditional median, which is one of the modes, and it is what ACT trains with. Padded chunk entries are masked. Normalisation statistics come from the training episodes only and travel with the checkpoint. The split is by episode, never by frame, and the final epoch is reported rather than the best one on validation.

3つとも、正規化したactionに対するL1 lossで学習します。二乗誤差は条件付き平均にフィットするため、デモが多峰性を持つ場合(有効な把持ヨー角が2つ、キューブを回り込む経路が2つ)、 平均は第3の無効なactionになってしまいます。L1は条件付き中央値にフィットし、これはいずれかのモードと一致します。ACTもL1で学習します。 Chunkのパディング部分はマスクします。正規化統計は学習用episodeのみから算出し、checkpointと一緒に保存します。 分割は常にepisode単位でフレーム単位ではなく、報告するのはvalidationで最良のepochではなく最終epochの値です。

The experiments実験

Scaling curve. For 10, 25, 50, 100 and 200 episodes and three training seeds each (six for ACT), train on the first n episodes for 20 epochs and evaluate 50 episodes on one evaluation seed. That is lighter than the bench protocol, to keep 15 runs per model affordable on a CPU. Every seed sees the same first episodes, so seeds differ only in initialisation and shuffling, and a cell's spread is over the training seeds. At 50 episodes one success is 0.02.

スケーリング曲線。10、25、50、100、200 episodeのそれぞれについて学習seedを3つ(ACTは6つ)使い、 先頭のn episodeで20 epoch学習し、1つの評価seedで50 episodeを評価します。 モデルあたり15回の学習をCPUで回せるよう、ベンチのプロトコルより軽くしています。どのseedも同じ先頭episodeを使うため、 seed間の違いは初期化とシャッフルだけで、各セルのばらつきは学習seed間のものです。50 episodeでは、1回の成功が0.02に相当します。

episodesstateimageact
100.01 ± 0.010.01 ± 0.010.08 ± 0.10
250.01 ± 0.010.03 ± 0.010.24 ± 0.19
500.00 ± 0.000.02 ± 0.030.30 ± 0.28
1000.02 ± 0.000.04 ± 0.020.41 ± 0.29
2000.03 ± 0.010.05 ± 0.060.51 ± 0.36

Three training seeds (six for ACT) × 50 episodes per cell, mean ± sd over seeds, measured 2026-09-25 and 2026-09-30. More demonstrations do not rescue single-step cloning: the image policy's validation L1 falls fivefold from 10 to 200 episodes (0.181 to 0.036) while its success stays between 0.01 and 0.05, so the compounding error below is not a data-quantity problem at this scale. ACT's mean climbs, 0.08 to 0.51, and has not levelled off at 200.

1セルあたり学習seed 3つ(ACTは6つ)× 50 episode、seed間の平均 ± 標準偏差で、2026-09-25と2026-09-30に計測しました。 デモを増やしても、single-stepのcloningは改善しません。画像policyのvalidation L1は10から200 episodeで5分の1(0.181 → 0.036)に下がる一方、 成功率は0.01〜0.05にとどまります。つまり後述する誤差の累積は、この規模ではデータ量の問題ではありません。 ACTの平均は0.08から0.51まで上昇し、200の時点でもまだ頭打ちになっていません。

もう1つの結果はばらつきです。200 episodeでは、ACTの6つのseedが0.92、0.82、0.76と、0.24、0.18、0.12の2群にはっきり分かれ、その中間はありません。 平均の0.51はどちらの群も表していません。50 episodeでは成功率0.5の二項標準誤差は0.07なので、これは評価ノイズではなく学習のばらつきです。 Seedがすべてのサイズで初期化とシャッフルを固定するため、50、100、200 episodeのいずれでも同じ3つのseedが低い群に入ります。 順位はこのばらつきの中で部分的にしか保たれません。100 episodeではACTの最悪のseedが画像policyの最良を上回りますが(0.12対0.06)、200では同点です(0.12と0.12)。 Validation lossは良いseedを見分ける信頼できる指標ではありません。50 episodeではL1が中間の値のseedが最も低い成功率で、200 episodeではL1の順序が2群の順序と一致しています。 このページの他の表はすべて学習seedが1つで、この曲線は、評価seed間の±が実際の不確かさを過小評価していることを示しています。 Chunk出力とsingle-stepの差はそれでも残るほど大きいですが、held-out表の0.06程度の差は残らないかもしれません。

The spread is the other result. At 200 episodes ACT's six seeds split into two groups, 0.92, 0.82 and 0.76 against 0.24, 0.18 and 0.12, with nothing in between, so the mean of 0.51 describes neither. At 50 episodes the binomial standard error of a 0.5 rate is 0.07, so that is training variance, not evaluation noise. The same three seeds are in the low group at 50, 100 and 200 episodes, because a seed fixes the initialisation and the shuffling for every size. The ranking only partly survives it: at 100 episodes ACT's worst seed is above the image policy's best (0.12 against 0.06), at 200 they tie (0.12 and 0.12). Validation loss is no reliable guide to the good seed: at 50 episodes the seed with the middle L1 has the worst success, though at 200 it does order the two groups. Every other table on this page is one training seed, and this curve says their ± over evaluation seeds understates the real uncertainty. The chunked-versus-single-step gap is large enough to survive that; a 0.06 difference in the held-out table may not.

DAgger. Mixing coefficient βi = 0.5 · 0.5i, 20 rollouts per iteration, labels from the shadow expert, retrain from scratch on the aggregate, five iterations. The comparison is BC on the same 200 demonstrations.

DAgger。混合係数βi = 0.5 · 0.5i、1イテレーションあたり20 rollout、ラベルはシャドーエキスパートから取得し、 集約したデータでゼロから再学習、これを5イテレーション行います。比較対象は同じ200件のデモで学習したBCです。

BC, 200 demosBC(デモ200件)DAgger, 200 demos + 100 relabelled rolloutsDAgger(デモ200件 + 再ラベル付けしたrollout 100件)
lift, nominal0.05 ± 0.020.14 ± 0.07

100 episodes × 5 seeds, mean ± sd over seeds. Per seed, DAgger scores 0.18, 0.06, 0.09, 0.22 and 0.13; BC scores 0.03, 0.07, 0.05, 0.06 and 0.04. Four of the five DAgger seeds beat BC's best, a gap of about three standard errors. The gain is real and small. The learner's own success per iteration (20 episodes each, so ±0.1 is noise) went 0.05, 0.20, 0.10, 0.05, 0.05 and never climbed. Relabelling the states the learner visits does not give a single-step policy the temporal context it lacks.

100 episode × 5 seed、seed間の平均 ± 標準偏差です。Seedごとの値は、DAggerが0.18、0.06、0.09、0.22、0.13、 BCが0.03、0.07、0.05、0.06、0.04です。DAggerの5 seedのうち4つがBCの最良値を上回り、差は標準誤差のおよそ3倍です。 改善は本物ですが、小さいものです。各イテレーションでの学習側自身の成功率(各20 episodeなので±0.1はノイズ)は0.05、0.20、0.10、0.05、0.05と推移し、上昇しませんでした。 学習側が訪れた状態にラベルを付け直しても、single-step policyに欠けている時間方向の文脈は補えません。

Held-out physics. Both image policies on every EVAL_PHYSICS cell, 100 episodes × 5 seeds. The demonstrations were recorded on nominal physics, so this is a transfer table, and the expert's own table from the bench is the reference column. Training data: the recorder kept 200 of 218 expert attempts, 14,487 frames. Final-epoch validation L1 was 0.034 for the single-step policy and 0.123 for ACT, and the table shows how little that predicts.

Held-out物理条件。2つの画像policyを、すべてのEVAL_PHYSICSセルで100 episode × 5 seed評価しました。 デモはnominalの物理条件で記録したので、これは転移の表です。基準列はベンチで計測したエキスパート自身の値です。 学習データ:レコーダーはエキスパートの試行218回のうち200回を保存し、14,487フレームです。最終epochのvalidation L1はsingle-step policyが0.034、ACTが0.123で、 表を見ればこの値がほとんど何も予測しないことがわかります。

physics物理条件expertエキスパートBC imageACT
nominal0.93 ± 0.020.05 ± 0.020.77 ± 0.05
heavy0.90 ± 0.020.02 ± 0.010.78 ± 0.06
slippery (inert)(効果なし)0.93 ± 0.020.05 ± 0.020.77 ± 0.05
weak0.97 ± 0.020.00 ± 0.000.70 ± 0.04
laggy0.92 ± 0.030.00 ± 0.000.65 ± 0.02
noisy0.93 ± 0.020.06 ± 0.010.72 ± 0.08
small0.73 ± 0.050.01 ± 0.020.38 ± 0.05

Chunking is the whole difference. Same demonstrations, same keypoint encoder, same loss: the single-step policy lifts the cube 5% of the time, ACT 77%. The pipeline was checked before that was believed. Replaying a recorded episode through the evaluation env reproduces the state to 7e-7, and on the expert's own trajectory the policy's worst-joint error against the demonstration is 0.033 rad median and 0.18 at the 95th percentile. Closed loop, its error against the expert grows from 0.4 to 0.5 rad in the first 10 steps to 1.1 to 4.6 rad by step 60 to 150, on 3 evaluation seeds. That is compounding error, the textbook failure of behaviour cloning, here measured.

差を生んでいるのはchunk出力だけです。デモも、keypoint encoderも、lossも同じです。それでもsingle-step policyがキューブを持ち上げるのは5%、ACTは77%です。 この結果を信じる前にパイプラインを検証しました。記録したepisodeを評価用envで再生すると状態は7e-7の精度で再現され、 エキスパート自身の軌道上では、デモに対するpolicyの最悪関節誤差は中央値0.033 rad、95パーセンタイルで0.18です。 閉ループでは、エキスパートとの誤差が最初の10 stepの0.4〜0.5 radから、60〜150 step目には1.1〜4.6 radまで拡大します(評価seed 3つ)。 これがbehaviour cloningの教科書的な失敗である誤差の累積であり、ここではそれを計測しています。

ACT transfers, with two real losses. Heavy and noisy stay within noise of nominal. Three steps of latency cost it 0.12 and the weak servo 0.06, where the expert loses at most 0.01. The small cube costs ACT 0.39 against the expert's 0.20. An 18 mm cube (9 mm half-extent, against 25 mm nominal) in a 96 × 128 image is a perception problem, and the expert, which reads the true pose, does not have it.

ACTは転移するが、実質的な低下が2つある。heavyとnoisyはnominalとの差がノイズの範囲内です。 3 stepのlatencyでは0.12、weakサーボでは0.06低下し、エキスパートの低下は最大でも0.01です。小さいキューブではACTが0.39低下し、エキスパートは0.20です。 96 × 128の画像に写る18 mmのキューブ(半辺長9 mm、nominalは25 mm)は認識の問題であり、真の姿勢を読み取るエキスパートにはこの問題がありません。

Found while measuring: the slippery cell is inert計測中に判明:slipperyセルは効果がない

Nominal and slippery are bit-identical in every table on this page: the expert, both RL policies, BC and ACT. The bench scales the cube's sliding friction by 0.3, but MuJoCo gives a contact the larger friction of its two geoms, and the fingers and floor stay at 1.0, so the contact never changes. The same rule means the DR friction range of 0.5 to 1.5 only acts above 1.0. The rows are kept as measured. Fixing it (scale the finger friction too, or set contact priority) would be a new experiment and would be labelled as one.

このページのすべての表(エキスパート、2つのRL policy、BC、ACT)で、nominalとslipperyはビット単位で同一です。 ベンチはキューブの滑り摩擦を0.3倍にしますが、MuJoCoは接触する2つのgeomのうち大きい方の摩擦を接触に使います。 指と床は1.0のままなので、接触の摩擦はまったく変わりません。同じ規則により、DRの摩擦範囲0.5〜1.5も1.0を超える部分しか効きません。 各行は計測したまま残しています。修正(指の摩擦もスケールする、または接触のpriorityを設定する)は新しい実験となり、そのように明記します。

Experimental: demonstrations from a hand video実験的機能:手の動画からのデモンストレーション

MediaPipe Hand Landmarker on an overhead phone video; wrist position maps to a point in the spawn box, thumb-to-index pinch distance to jaw angle and a two-level height; the bench's IK turns that into joint targets, and the targets are replayed in the simulator. The video supplies the motion, the simulator supplies everything the policy sees. It has run on synthetic landmarks only and has not been validated on a real recording. The page says so because the repository does.

スマートフォンで俯瞰撮影した動画にMediaPipe Hand Landmarkerを適用します。手首の位置を出現範囲内の点に、親指と人差し指の間隔をジョー角度と2段階の高さに対応付けます。 それをベンチのIKで関節目標値に変換し、シミュレーター上で再生します。動作は動画から、policyが見るものはすべてシミュレーターから得ます。 合成したランドマークでしか動かしておらず、実際の録画では検証していません。リポジトリにそう書いてあるので、このページにも明記しています。

python scripts/record_demos.py --root data/lift_red --repo-id local/so_arm100_lift_red --tasks lift:red --episodes 200
nice -n 10 python scaling.py --root data/lift_red --repo-id local/so_arm100_lift_red --task lift:red --model image --sizes 10 25 50 100 200 --seeds 3
nice -n 10 python dagger.py  --root data/lift_red --repo-id local/so_arm100_lift_red --task lift:red --model image --iters 5 --rollouts 20 --out runs/dagger_image_lift.pt
nice -n 10 python eval_policy.py --ckpt runs/bc_image_lift.pt --task lift:red --out runs/eval_bc_image_lift.json --jobs 4 --budget-min 110
nice -n 10 python eval_policy.py --ckpt runs/bc_act_lift.pt   --task lift:red --out runs/eval_bc_act_lift.json   --jobs 4 --budget-min 110
07

Route 3: languageアプローチ3:言語条件付きpolicy

A small policy that reads a sentence, and three held-out splits that test whether it read it or memorised it.

文を読む小さなpolicyと、それが文を読んでいるのか暗記しているだけなのかを確かめる3つのheld-out分割。

The interesting property of a vision-language-action model is that one policy follows language across tasks and objects and generalises to phrasings and combinations it was not trained on. That property can be tested at about one million parameters on a laptop CPU with a real held-out protocol. What cannot be tested here is scale, and the repository does not pretend otherwise.

Vision-language-actionモデルの興味深い性質は、1つのpolicyがタスクや物体をまたいで言語に従い、学習していない言い回しや組み合わせにも汎化することです。 この性質は、約100万パラメータ規模でも、ノートPCのCPU上で本来のheld-outプロトコルを使ってテストできます。 ここでテストできないのは規模であり、リポジトリもそれを偽ってはいません。

What the policy isPolicyの構成

Three tokens go into a 128-wide, 2-layer transformer encoder: a frozen 384-d sentence embedding, 32 image keypoints from a small CNN, and the arm's proprioception. Ten learned queries go through a 2-layer decoder and come out as a chunk of ten joint-target vectors, blended at run time as chunks overlap. Before the keypoints are pooled, the sentence embedding produces a per-channel scale and shift on the image features (FiLM), so "the blue cube" can sharpen blue before position is read out. Training is L1 on normalised actions over a few thousand expert frames covering four tasks and three colours, all three cubes always on the table.

幅128・2層のtransformer encoderに3つのトークンを入力します。重みを固定した384次元のsentence embedding、小さなCNNから得る32個の画像keypoint、そしてアームのproprioceptionです。 学習済みの10個のクエリが2層decoderを通り、10個の関節目標ベクトルからなるchunkとして出力されます。実行時には重なり合うchunkをブレンドします。 Keypointをプーリングする前に、sentence embeddingが画像特徴にチャンネルごとのスケールとシフトを与えます(FiLM)。 これにより「the blue cube」という指示で、位置を読み出す前に青色を強調できます。 学習は、4タスク・3色をカバーする数千フレームのエキスパートデータに対する、正規化actionのL1 lossです。テーブル上には常に3つのキューブすべてが置かれています。

What it is notこのpolicyではないもの

It is not a foundation model and it does not fine-tune one. SmolVLA-base appears as a zero-shot calibration line, inference only. A LoRA fine-tune of a SmolVLM-sized network is gated on a measured compute check and is future work even where the gate passes.

基盤モデルではなく、基盤モデルをfine-tuneしたものでもありません。SmolVLA-baseはzero-shotの参照ラインとして、推論のみで登場します。 SmolVLM規模のネットワークのLoRA fine-tuneは、計測による計算量チェックで可否を判定するもので、判定を通過した場合でも今後の課題です。

The three splits3つの分割

Sentences and (task, colour) pairs come from the bench's instruction module, so "unseen" means the same sentences the imitation recorder never writes. There are five training and three held-out templates per task, for example training "pick up the {c} cube" and held-out "hoist the {c} block". Nine of the twelve (task, colour) pairs are used in training; lift:blue, push:red and pick_place:green are held out.

文と(タスク, 色)ペアはベンチの指示文モジュールから取るため、「未見」はimitation用レコーダーが決して書き出さない文とまったく同じものを指します。 タスクごとに学習用5個・held-out用3個のテンプレートがあります。例えば学習用は「pick up the {c} cube」、held-outは「hoist the {c} block」です。 12個の(タスク, 色)ペアのうち9個を学習に使い、lift:blue、push:red、pick_place:greenはheld-outにしています。

split分割templatesテンプレート(task, colour) pairs(タスク, 色)ペアwhat success shows成功が示すこと
seentraining学習用training (9 of 12)学習用(12中9)the policy executes what it was shown見せられたことをpolicyが実行できる
paraphraseheld outtraining学習用the instruction is read through the encoder, not matched as a string指示文が文字列照合ではなく、エンコーダーを通して読まれている
combotraining学習用held out (3 of 12)(12中3)colour and task compose; every task and colour was seen, never together色とタスクを組み合わせられる。各タスクと各色は見ているが、その組み合わせは見ていない
split分割success成功率± over seedsseed間の±reachpushliftpick_place
seen0.1100.0810.250.040.070.01
paraphrase0.0970.0600.240.030.030.03
combo0.0270.046—0.030.030.02

Does the language model matter? An ablation with a control言語モデルは効いているのか:対照付きのablation

Two encoders produce the same 384-d shape. MiniLM (all-MiniLM-L6-v2, 22M parameters, frozen) is a sentence model that should place "hoist the blue block" near "lift the blue cube". A hashed bag of words and bigrams has no parameters and no semantics; "hoist" and "lift" land in unrelated buckets. If the hashed policy scores as well as MiniLM on paraphrase, the split was not testing language understanding. If MiniLM wins there and ties on seen, the difference is the encoder's contribution and nothing else, because policy, data and seeds are identical. A third row removes FiLM, leaving language as a token only.

2つのエンコーダーは同じ384次元の出力を持ちます。MiniLM(all-MiniLM-L6-v2、22Mパラメータ、重み固定)は、 「hoist the blue block」を「lift the blue cube」の近くに配置するはずの文モデルです。 単語とbigramのハッシュによるbag of wordsはパラメータも意味も持たず、「hoist」と「lift」は無関係なバケットに入ります。 ハッシュ版のpolicyがparaphraseでMiniLMと同等のスコアを出すなら、その分割は言語理解をテストしていなかったことになります。 MiniLMがそこで勝ち、seenで同点なら、policy・データ・seedが同一なので、その差はエンコーダーの寄与そのものです。 3行目はFiLMを外し、言語をトークンとしてのみ入力します。

encoderエンコーダーseenparaphrasecombo
MiniLM0.110 ± 0.0810.097 ± 0.0600.027 ± 0.046
hashedハッシュ0.092 ± 0.0460.073 ± 0.0570.027 ± 0.021
MiniLM, no FiLM(FiLMなし)0.137 ± 0.0750.110 ± 0.0560.033 ± 0.038
Measured, and weak計測結果:性能は低い

The policy barely works: reach about a quarter of the time, push, lift and pick-place between 0 and 7%. Every encoder row sits inside the others' spread, so the ablation cannot separate them; with the base policy this close to the floor there is no headroom for the encoder to show. The training record says why: final L1 on held-out demonstration episodes is 0.128 against 0.057 on training ones, from about 20 demonstrations per (task, colour) pair. The policy does not generalise from its demonstrations before language enters, so the next experiment is more data per pair, not a different encoder. Protocol deviations: 20 episodes per seed instead of 100 and one training seed per encoder instead of three, both for evaluation time (1.7 hours per policy on this CPU).

このpolicyはほとんど機能していません。reachの成功は約4分の1、push・lift・pick-placeは0〜7%です。 どのエンコーダーの行も他の行のばらつきの範囲内にあり、ablationでは区別できません。ベースのpolicyがこれほど下限に近いと、エンコーダーの効果が現れる余地がありません。 理由は学習記録に表れています。(タスク, 色)ペアあたり約20件のデモから学習し、最終L1はheld-outのデモepisodeで0.128、学習用では0.057です。 言語が関わる以前に、policyがデモから汎化できていません。したがって次の実験は、別のエンコーダーではなく、ペアあたりのデータを増やすことです。 プロトコルからの逸脱:seedあたり100ではなく20 episode、エンコーダーあたり3つではなく1つの学習seed。どちらも評価時間のためです(このCPUでpolicyあたり1.7時間)。

One thing already measured about the encoderエンコーダーについて計測済みのこと

Cosine similarities of MiniLM embeddings on these templates, recorded by a test rather than asserted away: "lift the green cube" is 0.59 from its paraphrase "raise the green block into the air" and 0.38 from "hoist the green block", but 0.63 from "push the red cube to the target" and 0.82 from "lift the blue cube". The encoder is driven by shared surface words, and the colour word moves the embedding very little. So the paraphrase split is hard for a reason that sits in the encoder, and the combo split asks the policy to read colour out of a small difference between two nearly parallel vectors. Whether FiLM on the image features is enough to do that is what the ablation measures.

これらのテンプレートに対するMiniLM embeddingのコサイン類似度を、assertで片付けずにテストで記録しています。 「lift the green cube」は、言い換えの「raise the green block into the air」とは0.59、「hoist the green block」とは0.38です。 一方で「push the red cube to the target」とは0.63、「lift the blue cube」とは0.82です。 エンコーダーは表層的に共通する単語に引っ張られ、色の単語はembeddingをほとんど動かしません。 つまりparaphrase分割が難しい理由はエンコーダー側にあり、combo分割はほぼ平行な2つのベクトルのわずかな差から色を読み取ることをpolicyに求めています。 画像特徴へのFiLMでそれが十分にできるかどうかが、ablationで計測する内容です。

SmolVLA-base, zero-shot, same simulatorSmolVLA-base:同じシミュレーターでzero-shot評価

lerobot/smolvla_base was pretrained on community SO-100/101 data: real arms, real cameras, motor units. Here it receives a rendered 96 × 128 frame letterboxed to its 512 × 512 input, six joint angles in radians zero-padded to its state width, and the instruction. Nothing is adapted and the expected result is low. It is a calibration line, not a comparison of capability: different embodiment statistics, camera placement, units and control rate make it evidence about this protocol, not about SmolVLA. A dry-run mode validates the observation mapping against a stub with the same feature keys, so the test suite covers it without the download.

lerobot/smolvla_baseは、コミュニティのSO-100/101データ(実機アーム、実カメラ、モーター単位の値)で事前学習されています。 ここでは、レンダリングした96 × 128のフレームを512 × 512の入力にレターボックスで合わせ、ラジアン単位の6つの関節角をstate幅までゼロ埋めし、指示文と一緒に与えます。 何も適応させていないので、低い結果が予想されます。これは能力の比較ではなく参照ラインです。 身体性の統計、カメラ配置、単位、制御周期が異なるため、この結果はSmolVLAについてではなく、このプロトコルについての根拠になります。 Dry-runモードでは、同じ特徴キーを持つスタブを相手にobservationの対応付けを検証するため、ダウンロードなしでテストスイートがこれをカバーできます。

Measured over 10 episodes per task: reach 0.00, push 0.00, lift 0.00, pick_place 0.00, 0 of 40 as expected. One 50-step action chunk takes 3.16 s at the median (p90 3.30 s, n = 130) on 8 CPU threads, 64 times the 50 ms control period: on CPU a 500M-parameter VLA is not a real-time controller, whatever it scores after fine-tuning.

タスクあたり10 episodeで計測した結果はreach 0.00、push 0.00、lift 0.00、pick_place 0.00で、予想どおり40回中0回でした。 50 stepのaction chunk 1つの生成に、CPU 8スレッドで中央値3.16秒(p90 3.30秒、n = 130)かかり、50 msの制御周期の64倍です。 CPU上では、500Mパラメータ規模のVLAは、fine-tune後のスコアがどうであれリアルタイムのコントローラーにはなりません。

The LoRA gateLoRAの可否判定

Before proposing a fine-tune, measure whether one step of it is affordable. The gate builds a decoder with SmolVLM-256M's language-model shape (hidden 576, 30 layers, 9 heads, MLP 1536), attaches rank-8 LoRA to the query and value projections, and times one forward-backward-optimiser step at batch 1, sequence 256, on 8 threads. The rule was fixed before measuring: go under 5 s per step, otherwise no-go. At 5 s per step, 2,000 steps is 2.8 hours, the most a chunked, attended CPU run can carry.

Fine-tuneを提案する前に、その1 stepが現実的なコストかどうかを計測します。 判定では、SmolVLM-256Mの言語モデルと同じ形状(hidden 576、30層、9ヘッド、MLP 1536)のdecoderを構築し、queryとvalueの射影にrank 8のLoRAを付けます。 そしてバッチ1、系列長256、8スレッドで、順伝播・逆伝播・optimizer更新の1 stepを計時します。 判定基準は計測前に決めました。1 stepあたり5秒未満なら実施、それ以外は見送りです。 1 step 5秒なら2,000 stepで2.8時間となり、見守りながら分割実行するCPU学習で扱える上限です。

Measured: a stand-in of 176.7M parameters with 0.55M trainable (0.31%), 0.51 s per step on 8 threads, best of two, so the gate passes and 2,000 steps would be about 0.3 h. The gate times the language-model half only; the real SmolVLA action expert adds a vision tower and a flow-matching head that were not timed. A pass says a fine-tune is affordable to try, not that it would help.

計測結果:176.7Mパラメータの代替モデル(学習対象は0.55M、0.31%)で、8スレッドで1 stepあたり0.51秒(2回中の最良値)でした。 判定は通過で、2,000 stepなら約0.3時間です。この判定で計時したのは言語モデル部分のみで、実際のSmolVLAのaction expertには、計時していないvision towerとflow-matchingヘッドが加わります。 通過が意味するのはfine-tuneを試すコストが許容範囲だということであり、それが性能向上につながるということではありません。

python record_data.py --root data/multitask --episodes 20            # ~10 min of software rendering
nice -n 10 python train.py --root data/multitask --encoder minilm --epochs 30
nice -n 10 python train.py --root data/multitask --encoder hash   --epochs 30
python eval_language.py --ckpt runs/policy_minilm_s0.pt --episodes 100 --seeds 5
python smolvla_reference.py --run --episodes 10
OMP_NUM_THREADS=8 nice -n 10 python lora_gate.py
08

What is measured so far, and what is not計測済みの項目と未計測の項目

The facts that exist today, the development readings that are explicitly not results, and the tables still waiting for an idle machine.

現時点で確定している事実、結果ではないと明示した開発時の読み値、そして負荷のないマシンでの計測を待っている表。

repositoryリポジトリtestsテスト数what they pin downテストで固定している内容CI
so-arm100-sim63vendored model hash, observation and action contract, IK, expert success gates, every held-out cell outside the DR range, vector env, recordervendoringしたモデルのハッシュ、observationとactionのインターフェース契約、IK、エキスパートの成功率の合格基準、全held-outセルがDR範囲外であること、vector env、レコーダーgreen, Python 3.10 and 3.12(Python 3.10と3.12)
so-arm100-rl21GAE by hand, normaliser, curriculum promotion, bit-exact resume, 2,048-step training smoke, ONNX round trip, KL stop, success-termination flag, warm start, parallel evaluation equals serial手計算のGAE、normaliser、curriculumの昇格、ビット単位で一致する再開、2,048 stepの学習スモークテスト、ONNXの往復変換、KL stop、成功時terminationフラグ、warm start、並列評価と逐次評価の一致green
so-arm100-il21action windows, model shapes, ensembling, shadow expert at β = 1, hand-landmark mapping, record → train → evaluate smoke, resumed evaluation equals serial, time-budget stop and rerunactionウィンドウ、モデルの形状、アンサンブル、β = 1でのシャドーエキスパート、手のランドマークの対応付け、記録 → 学習 → 評価のスモークテスト、再開した評価と逐次評価の一致、時間予算での停止と再実行green
so-arm100-vla24both encoders, splits, windowing, shapes, chunk ensembling, LoRA identity-at-init and exact merge, SmolVLA mapping, end-to-end smoke2つのエンコーダー、分割、ウィンドウ化、形状、chunkのアンサンブル、初期化時に恒等写像となるLoRAと厳密なmerge、SmolVLAの対応付け、end-to-endスモークテストgreen

Measured facts計測済みの事実

  • The latency-buffer off-by-one in the bench, found by a tracking test and fixed.
  • MiniLM cosine similarities on the instruction templates, above: paraphrases are further apart than sentences that share surface words.
  • The LoRA gate: 0.51 s per step on 8 threads for a 176.7M-parameter stand-in, rule fixed before measuring.
  • The cost of an image-policy evaluation: about 52 ms per control step on one core, render plus policy, so the seven-cell held-out table is about 6 core-hours per model. It ran in resumable (physics, seed) units under a time budget, and it bounds the imitation and language tables, not the models.
  • Bare mj_step on this arm model at about 18 µs single-process during development, roughly 2,200 env-steps/s per process before any Python overhead. A development reading, not the throughput table.
  • ベンチのlatencyバッファのoff-by-oneバグ。追従性のテストで発見し、修正済み。
  • 前述した指示文テンプレートでのMiniLMのコサイン類似度。言い換え同士の方が、表層の単語を共有する文同士より離れている。
  • LoRAの可否判定:176.7Mパラメータの代替モデルで、8スレッドで1 stepあたり0.51秒。判定基準は計測前に固定。
  • 画像policyの評価コスト:描画とpolicyを合わせて1コアで制御ステップあたり約52 ms。7セルのheld-out表はモデルあたり約6コア時間になる。 時間予算のもとで(物理条件, seed)単位に再開可能な形で実行しており、これがimitationとlanguageの表の制約になっている(モデルの制約ではない)。
  • 開発中に計測した、このアームモデルでの素のmj_stepは単一プロセスで約18 µs。Pythonのオーバーヘッドを除けばプロセスあたり約2,200 env-steps/s。 開発時の読み値であり、throughput表の値ではない。

Development readings that are not the reference基準値ではない開発時の読み値

The expert's success gates in the bench tests were set from 30 episodes and one seed: reach 1.00 everywhere; lift 0.93 nominal, 0.87 small, 0.97 weak, 0.93 heavy; push 0.83, 0.80, 0.77, 0.80; pick_place 0.93, 0.80, 0.93, 0.90. The gates sit below those, at 0.95, 0.75, 0.65 and 0.75. The 100 × 5 table above is the published result; these are only what the tests hold the expert to.

ベンチのテストにあるエキスパートの成功率の合格基準は、30 episode・1 seedの値から設定しました。 reachはすべて1.00、liftはnominal 0.93・small 0.87・weak 0.97・heavy 0.93、pushは0.83、0.80、0.77、0.80、pick_placeは0.93、0.80、0.93、0.90です。 合格基準はそれより低い0.95、0.75、0.65、0.75に置いています。公開する結果は前述の100 × 5の表であり、これらはテストがエキスパートに課す基準にすぎません。

09

Limits, stated明記しておく限界

What these four repositories cannot show, regardless of what the tables end up saying.

表の結果がどうであれ、この4つのリポジトリでは示せないこと。

  • シミュレーションのみ。どの数値も実機のSO-ARM100についての主張ではありません。backlash、ケーブルの摩擦、カメラのlatencyはどの列にも含まれていません。
  • 固定カメラ。前方・側方・上方の3台で、手首カメラはまだありません。4つのリポジトリのうち3つで未解決のissueになっています。
  • 3色のキューブ3個で、対象は一度に1つ。散らかった環境、遮蔽、複数物体の推論については何も言えません。
  • エキスパートはスクリプト。IKスクリプトを模倣するpolicyは、スクリプトの癖と失敗パターンを引き継ぎます。pushの狙いを付け直すことはできますが、ライン上からヨー方向に回転してしまったキューブは立て直せません。
  • 指示文はテンプレート。否定、空間関係、数の数え上げは対象外です。
  • RL policyは状態ベース。キューブの真の位置を見ています。画像ベースの制御は他の2つのプロジェクトの課題です。
  • DR範囲とheld-outセルは1つの選択にすぎない。別の選択をすれば別の表になります。
  • CPUの予算。8スレッド、見守りながらの分割実行、1フレーム約20 msのソフトウェアレンダリング。モデルとデータセットのサイズはこれに収まるよう選んでおり、 throughputモニターは電力制限とマシン上の別プロセスを区別できません。
  • Simulation only. No number is a claim about the physical SO-ARM100. Backlash, cable friction and camera latency are in none of the columns.
  • Fixed cameras. Front, side and top; no wrist camera yet. That is an open issue in three of the four repositories.
  • Three cubes of three colours, one active at a time. Nothing about clutter, occlusion or multi-object reasoning.
  • The expert is a script. A policy that imitates an IK script inherits the script's style and its failure modes; it re-aims a push but cannot recover a cube that has yawed off the line.
  • Language is templated. Negation, spatial relations and counting are outside the set.
  • The RL policy is state-based. It sees the cube's true position; image-based control is the other two projects' problem.
  • The DR ranges and held-out cells are one choice. A different choice gives a different table.
  • CPU budget. Eight threads, chunked attended runs, software rendering at about 20 ms per frame. Model sizes and dataset sizes were chosen to fit that, and the throughput monitor cannot tell power limiting from another process on the machine.
10

Running it実行方法

Setup for the bench and for the three policy repositories, and the order the commands go in.

ベンチと3つのpolicyリポジトリのセットアップ、そしてコマンドを実行する順序。

The benchベンチ

git clone https://github.com/AungKaung1928/so-arm100-sim.git
cd so-arm100-sim
python3 -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"              # mujoco + numpy + pytest
./verify.sh                          # tests, camera PNGs, then prints the two measurement commands

python scripts/expert_success.py --episodes 100 --seeds 5      # -> runs/expert_success.json, one core
nice -n 10 python scripts/bench_throughput.py                  # -> runs/throughput.json, loads the machine

The three policy repositories (Python ≥ 3.12, because of lerobot)3つのpolicyリポジトリ(lerobotの都合でPython ≥ 3.12)

git clone https://github.com/AungKaung1928/so-arm100-rl.git     # or -il, -vla
cd so-arm100-rl
python3 -m venv .venv && . .venv/bin/activate
pip install torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt      # installs the bench from its v0.1.0 tag
pip install -e .
./verify.sh                          # tier 1 tests in under a minute; tiers 2-4 print the long commands

Optional extras on the bench: .[lerobot] for the dataset writer, .[gym] for the gymnasium adapter, .[image] for PNG output. Rendering needs a GL context: MUJOCO_GL=glfw with a display, or egl / osmesa headless. Tests that render skip cleanly without one. Each repository also builds as a Docker image that runs the offline tests: docker build -t so-arm100-sim . && docker run --rm so-arm100-sim.

ベンチのオプション:データセット書き出し用の.[lerobot]、gymnasiumアダプター用の.[gym]、PNG出力用の.[image]。 レンダリングにはGLコンテキストが必要です。ディスプレイがあればMUJOCO_GL=glfw、ヘッドレスならegl / osmesaを使います。 GLコンテキストがない場合、描画を伴うテストは正しくスキップされます。各リポジトリはオフラインのテストを実行するDockerイメージとしてもビルドできます: docker build -t so-arm100-sim . && docker run --rm so-arm100-sim。

Every training script refuses to start on a loaded machine, runs chunked with --resume, and logs its throughput so a drop is visible. The CPU-only pins on torch and torchvision matter: an unpinned install pulls the CUDA build, which is several gigabytes and fails to import inside lerobot on a machine without a GPU.

どの学習スクリプトも、負荷のかかったマシンでは起動せず、--resumeで分割実行し、低下が見えるようthroughputをログに残します。 torchとtorchvisionをCPU版に固定していることが重要です。固定せずにインストールするとCUDA版が入り、数GBになるうえ、GPUのないマシンではlerobot内でのimportに失敗します。

Licencesライセンス

MIT for the code in all four repositories. The arm description under so_arm100_sim/assets/trs_so_arm100/ is from MuJoCo Menagerie, Apache-2.0, vendored unchanged from commit 822c2d8.

4つのリポジトリのコードはすべてMITです。so_arm100_sim/assets/trs_so_arm100/以下のアーム記述はMuJoCo Menagerie由来(Apache-2.0)で、 コミット822c2d8から無改変でvendoringしています。

Measured environment計測環境

Intel Core Ultra 5 225H, 14 cores, no hyperthreading, 21 GB available to WSL2. Windows 11 + WSL2, Ubuntu 22.04, Python 3.12.14, MuJoCo 3.13.0, torch 2.11.0 CPU, lerobot 0.6.1, software rendering through WSLg. No CUDA anywhere.

Intel Core Ultra 5 225H(14コア、ハイパースレッディングなし)、WSL2で使用可能なメモリ21 GB。Windows 11 + WSL2、 Ubuntu 22.04、Python 3.12.14、MuJoCo 3.13.0、torch 2.11.0 CPU版、lerobot 0.6.1、WSLg経由のソフトウェアレンダリング。CUDAは一切使っていません。

11

The short versionまとめ

The four repositories in one paragraph.

4つのリポジトリを1段落で。

4つのリポジトリで、シミュレーション上のSO-ARM100にキューブへのリーチ・押し出し・持ち上げ・配置を学習させます。 1つ目はベンチです。Menagerieのアームは無改変のまま、MjSpecで卓上シーンを追加し、成功条件が1つずつの4タスク、 180度の把持の曖昧さを解決し1〜2 cm垂れるサーボに対してループを閉じたIKエキスパート、domain randomisationの範囲、 それぞれがその範囲外であることを証明済みの6つのheld-out物理セル、そして100 episode × 5 seedの評価プロトコル1つを備えます。 残りの3つは、その上で3通りの方法で学習します。1つ目は、特権状態を入力とし、reach → push → liftのcurriculumを使うPPOで、 ランダム化ありとなしで学習してheld-outセルでテストし、価値の目標値ではtruncationとterminationを区別しています。 2つ目は、カメラ画像とproprioceptionからのbehaviour cloning、スクリプトのエキスパートをオラクルとするDAgger、chunk出力のtransformerで、 10〜200件のデモによるデータセットサイズ曲線を取っています。 3つ目は、重みを固定したMiniLMエンコーダーが画像特徴を変調する100万パラメータのlanguage-conditioned policyで、 held-outの言い換えとheld-outのタスク・色ペアで、単語ハッシュの対照と比較してテストします。SmolVLA-baseをzero-shotの参照ラインとし、 LoRA fine-tuneは1 stepの計時で可否を判定し、結果は0.51秒でした。 129のテストはgreenで、すべての表はスクリプトが出力したJSONから埋めています。エキスパートのliftは0.93です。 ランダム化したRLのfine-tuneはheld-outでの成功率の低下を半分にし(0.120 → 0.056)、その大部分はaction latencyによるものです。 200件のデモから学習すると、chunk出力のtransformerはカメラ画像から0.77の成功率で持ち上げ、single-stepのcloningは0.05にとどまります。 ここでは誤差の累積がすべてを説明しており、DAggerでも0.14までしか回復しません。 データセットサイズ曲線では、デモを増やしてもsingle-stepのcloningは改善せず、chunk出力policyの平均は200件で0.51まで上がりますが、 6つの学習seedは0.12〜0.24と0.76〜0.92に分かれ、これがこのページで最大の不確かさです。 Language policyの性能は低く(seenで0.11、未見のタスク・色ペアで0.03)、SmolVLA-baseはzero-shotで40回中0回でした。 1つのセルは何もテストしていなかったことがわかりました。MuJoCoは接触する2面のうち大きい方の摩擦を使うため、キューブの摩擦だけを下げても効果がありません。 これも判明したとおりに報告しています。

Four repositories teach a simulated SO-ARM100 to reach, push, lift and place a cube. The first is a bench: the Menagerie arm untouched, a tabletop attached through MjSpec, four tasks with one success rule each, a scripted IK expert that had to resolve a 180-degree grasp ambiguity and close the loop on servos that sag 1 to 2 cm, domain-randomisation ranges, six held-out physics cells each proven outside those ranges, and one evaluation protocol of 100 episodes × 5 seeds. The other three learn on it in three ways. PPO on privileged state with a reach → push → lift curriculum, trained with and without randomisation and tested on the held-out cells, with truncation and termination kept apart in the value target. Behaviour cloning, DAgger with the scripted expert as oracle, and a chunked transformer, all from a camera image and proprioception, on a dataset-size curve from 10 to 200 demonstrations. And a one-million-parameter language-conditioned policy with a frozen MiniLM encoder modulating the image features, tested on held-out paraphrases and held-out task-colour pairs against a hashed-words control, with SmolVLA-base as a zero-shot calibration line and a LoRA fine-tune gated on a step timing that came in at 0.51 s. 129 tests are green and every table is filled from a script's JSON. The expert lifts 0.93. The randomised RL fine-tune halves the held-out success drop (0.120 to 0.056), almost all of it on action latency. From 200 demonstrations the chunked transformer lifts 0.77 from the camera while single-step cloning manages 0.05, so compounding error is the whole story there, and DAgger recovers only to 0.14. On the dataset-size curve more demonstrations do nothing for single-step cloning while the chunked policy's mean climbs to 0.51 at 200, with six training seeds split between 0.12 to 0.24 and 0.76 to 0.92, the largest uncertainty on the page. The language policy is weak (0.11 seen, 0.03 on unseen task-colour pairs), and SmolVLA-base scores 0 of 40 zero-shot. One cell turned out to test nothing: MuJoCo takes the larger friction of two touching surfaces, so lowering only the cube's friction is inert. That is reported as found.