Instructions to use IntelligentDecisionLab/xlerobot-coffee-model-real-b-force with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use IntelligentDecisionLab/xlerobot-coffee-model-real-b-force with LeRobot:
- Notebooks
- Google Colab
- Kaggle
xlerobot-coffee-model-real-b-force
Method B β force-added, trained on real-world data. ACT experts for the Coffee Automata chain on the 17-DoF XLeRobot.
One of four repos on the domain Γ method grid; the companion is
β¦-model-real-a-vision-pos.
Contents
Each folder is a complete pretrained_model directory (final 100k checkpoint at the folder
root) with a <folder>/checkpoints/<NNNNNN>/ step sweep alongside. Read the folder suffix
before loading β it encodes both the action space and the camera count, and those are the
variables these models exist to compare.
| folder | action | cameras | run | step sweep |
|---|---|---|---|---|
g135_shared_t1_t3_t5_17dof_50k |
17-D | 1 camera β head | xl_g135_B |
2 |
g135_shared_t1_t3_t5_2cam_17dof |
17-D | 2 cameras β head + right_wrist | 2cam_g135_B |
4 |
g135_shared_t1_t3_t5_2cam_17dof_eval |
17-D | 2 cameras β head + right_wrist | xl2_g135_B |
3 |
g135_shared_t1_t3_t5_2cam_6dof |
6-D | 2 cameras β head + right_wrist | 2cam6_g135_B |
4 |
g135_shared_t1_t3_t5_6dof |
6-D | 1 camera β head | real6_g135_B |
4 |
g35_shared_t3_t5_17dof_50k |
17-D | 1 camera β head | xl_g35_B |
2 |
g35_shared_t3_t5_2cam_17dof |
17-D | 2 cameras β head + right_wrist | 2cam_g35_B |
4 |
g35_shared_t3_t5_2cam_17dof_eval |
17-D | 2 cameras β head + right_wrist | xl2_g35_B |
3 |
g35_shared_t3_t5_2cam_6dof |
6-D | 2 cameras β head + right_wrist | 2cam6_g35_B |
4 |
g35_shared_t3_t5_6dof |
6-D | 1 camera β head | real6_g35_B |
4 |
t1_place_cup |
legacy | unknown | pre-dates this naming | 4 |
t1_place_cup_17dof_50k |
17-D | 1 camera β head | xl_t1_B |
2 |
t1_place_cup_2cam_17dof |
17-D | 2 cameras β head + right_wrist | 2cam_t1_B |
4 |
t1_place_cup_2cam_17dof_eval |
17-D | 2 cameras β head + right_wrist | xl2_t1_B |
3 |
t1_place_cup_2cam_6dof |
6-D | 2 cameras β head + right_wrist | 2cam6_t1_B |
4 |
t2_push_button_17dof |
17-D | 1 camera β head | real_t2_B |
4 |
t2_push_button_17dof_50k |
17-D | 1 camera β head | xl_t2_B |
2 |
t3_cup_to_tray_17dof_50k |
17-D | 1 camera β head | xl_t3_B |
2 |
t3_cup_to_tray_2cam_17dof |
17-D | 2 cameras β head + right_wrist | 2cam_t3_B |
4 |
t3_cup_to_tray_2cam_17dof_eval |
17-D | 2 cameras β head + right_wrist | xl2_t3_B |
3 |
t3_cup_to_tray_2cam_6dof |
6-D | 2 cameras β head + right_wrist | 2cam6_t3_B |
4 |
t5_tray_to_table_17dof_50k |
17-D | 1 camera β head | xl_t5_B |
2 |
t5_tray_to_table_2cam_17dof |
17-D | 2 cameras β head + right_wrist | 2cam_t5_B |
4 |
t5_tray_to_table_2cam_17dof_eval |
17-D | 2 cameras β head + right_wrist | xl2_t5_B |
3 |
t5_tray_to_table_2cam_6dof |
6-D | 2 cameras β head + right_wrist | 2cam6_t5_B |
4 |
t5_tray_to_table_6dof |
6-D | 1 camera β head | real6_t5_B |
4 |
t4_navigate exists only as t4_navigate_17dof_50k, and only for Method A β it was never trained force-aware.
t2_push_button has no 2-cam rung β it is absent from that dataset.
Which weights were actually evaluated
*_2cam_17dof_eval are the models the on-robot evaluation scored (160 rollouts,
109 success / 51 failure). *_2cam_17dof without the suffix is a sibling run: same recipe,
same data, same architecture, but a separate training run β GPU kernels are not
deterministic by default, so an identical seed does not reproduce identical weights across
machines. Cite the _eval folders for any result tied to the robot trials.
Two 17-DoF vintages β read the suffix
*_17dof_50k are the E03/E04 ladder (50k steps, 2-checkpoint sweep), folded in from the
retired β¦-17dof repos so everything lives in four repos instead of six. These are the
models the on-robot evaluation rounds were run against. *_17dof without the suffix are
this round's 100k retrains. They are different models on the same task β same rung name
does not mean same weights.
The two action spaces
*_17dof predicts the whole 17-D action; *_6dof predicts only the arm that performs the
task. The pair exists to test whether ACT's loss β a mean over all 17 dims, of which only
~6β9 move β dilutes the signal on the dims that matter.
Measured answer: it does not, to any reliable degree. Over 22 matched pairs (12 sim, 10 real 2-cam), scoring both models on the same 6 acting-arm joints:
| set | n | mean Ξ | 95% CI |
|---|---|---|---|
| sim, 1 cam | 12 | +4.2% | [β5.1%, +13.5%] |
| real, 2 cam | 10 | +9.4% | [β5.2%, +23.9%] |
| combined | 22 | +6.5% | [β1.7%, +14.7%] |
Positive = 17-DoF lower error. Every interval contains zero and 6-DoF wins 11 of 22, so the
two are indistinguishable on accuracy. Prefer *_17dof for deployment β it matches the
platform, needs no per-task arm choice, and keeps bimanual behaviour reachable (real
t2_push_button genuinely uses both arms) β not because it predicts better.
β Do not compare the two by training loss. ACT's loss is a mean over action dims, so the 17-D and 6-D numbers are different quantities; the 17-D mean is dragged down by frozen channels and appears better for that reason alone.
t2_push_button is a RIGHT-arm task in simulation, not left β the acting arm was chosen
per task by measured action variation, not assumed.
Architecture
- 17-DoF: ACT + Module A (A1) Β· action[17], observation.hpi[24] = [left 9 | right 9 | wholebody 6 zeros] in a dedicated token, multiscale dense window + 1D-CNN encoder, no contact gate. Needs the Coffee_Automata / hpi_act branch to instantiate.
- 6-DoF: ACT + Module A (A1) Β· action[6], observation.hpi[9] = that arm's block (gripper tau_ext/q/dq + 6-D TCP wrench), multiscale + 1D-CNN, no gate.
Recipe
ACT Β· chunk_size 100 Β· n_action_steps 100 Β· batch 8 Β· 100k steps Β· seed 1000 β identical for every model here, so domain / method / action-dim / camera-count are each read in isolation. hpi_fps follows the DATA rate (30 for real and 2-cam, 20 for the 20 fps sim recordings); a mismatch puts the HPI window off the frame grid and the dataset rejects it. Trained on idlab_server1 (RTX PRO 6000 Blackwell) for the 1-camera models and idlab2 (RTX 5090) for the 2-camera ladder.
Normalization statistics are floored per the xlerobot_norm_floor rule (1e-2 state/action,
1e-5 HPI) β the fix for the degenerate-std defect in docs/coffee/EVAL_POSTMORTEM.md.
The real recordings carry no observation.hpi; it comes from the published xlerobot-coffee-real-force-sidecar, the same per-arm DOB-EKF output, joined on (episode_index, frame_index).
Loading
PreTrainedPolicy.from_pretrained has no subfolder support, so load through the project
helper, or snapshot the folder you want:
from huggingface_hub import snapshot_download
from lerobot.policies.act.modeling_act import ACTPolicy
root = snapshot_download("IntelligentDecisionLab/xlerobot-coffee-model-real-b-force", allow_patterns="t1_place_cup_17dof/*")
policy = ACTPolicy.from_pretrained(f"{root}/t1_place_cup_17dof")
Method B needs the Coffee_Automata / hpi_act branch to instantiate (HPI token).
Caveats
- These are offline-trained policies with no on-robot success numbers yet. The DoF comparison above is action-prediction error, not task success; closed-loop compounding error can rank models differently.
- 1-cam vs 2-cam is not a controlled comparison. The 2-cam dataset has 5β6Γ the episodes of the 1-cam real set, so camera count and dataset size are confounded.
- No 2-camera simulation data exists, so simβreal cannot be read at two cameras.
- 100k steps on ~50 episodes is ~90β110 epochs and likely overfit; the step sweep is provided so evaluation can pick a checkpoint rather than assume the last one is best.
t2_push_buttonMethod B is a ~10x error outlier versus Method A on the same task, in BOTH action spaces β a Method-B-on-t2 issue, not a DoF one. Treat T2 force results as suspect until understood.
Part of the X-Lerobot Coffee Automata project. AS-CITI Intelligent Decision Lab.