模型推理与真实机械臂部署
Inference & Deployment
加载训练好的模型,在真实机械臂上进行推理和部署
未开始
完成后会同步到学习路径和首页统计
训练完成,硬盘上躺着一个几百 MB 的 checkpoint。现在让它真的指挥机械臂动起来。
要有心理准备:第一次推理成功率往往只有 10-30%,这很正常,不是你做错了。训练 loss 低 ≠ 实测高 —— 训练数据有限、真实环境有扰动、而且第 1 章的复合误差虽被 ACT 大幅缓解但没完全消除。
这一章教你加载 checkpoint 上岗、把 fps 锁稳、用 EMA 平滑治抖动,把成功率一步步调上去。
推理是"从能训练"到"真能用"的最后一公里,也是最考验调参直觉的地方:
- 不知道首次成功率本就低 → 一看效果差就以为前面全白做,放弃
- fps 不稳 → 抖动的头号元凶,不锁就调不动
- 不会 EMA → 机械臂动作毛躁,看着就不靠谱
- 不理解复合误差会重现 → 看到"前几秒顺、后面歪"不知道为什么
掌握这一章,你能把一个"勉强能动"的模型调成"稳定可用"。
- 加载训练好的模型检查点
- 配置推理参数
- 在真实机械臂上运行策略
- 1推理时需要保持与训练一致的观测空间
- 2实时控制需要考虑延迟和稳定性
- 3安全措施防止机械臂意外动作
推理时的实时循环
flowchart LR
Cam["📷 相机 + 状态"] --> Pre["预处理/归一化"]
Pre --> Policy["🧠 ACT 策略"]
Policy --> Chunk["📦 100 步动作"]
Chunk --> Smooth["✨ EMA 平滑"]
Smooth --> Motor["🦾 Follower 执行"]
Motor -.->|"30 fps 回到下一帧"| Cam
style Policy fill:#22c55e,stroke:#22c55e,color:#fff
style Smooth fill:#f59e0b,stroke:#f59e0b,color:#fff加载 checkpoint 上岗
推理还是用 control_robot.py,但加 --policy-path 指向训练输出里的 checkpoints/last/pretrained_model。按 Enter 后 Follower 会自己开始动,Leader 退休(不再需要人操作)。
运行推理
python lerobot/scripts/control_robot.py record \ --robot-path lerobot/configs/robot/so100.yaml \ --policy-path outputs/train/act_so100/checkpoints/last/pretrained_model \ --num-episodes 5[INFO] Loading policy from checkpoints/last/... [INFO] Robot ready. Press Enter to start inference episode 1/5.
想用某个中间检查点就把 last 换成 step_50000 之类。
把 fps 锁死在训练时的值
不稳定的 fps 是抖动的系统性元凶。把推理 fps 锁成和训练数据一致(通常 30)——模型"感觉"到的节奏要和它学的时候一样,差太多会懵。
GPU 不够强、每帧推理 > 33ms 时实际跑不到 30 fps,会丢帧依旧抖,这时要么换卡、要么训练时也用更低 fps。
锁定推理帧率
python lerobot/scripts/control_robot.py record \ --robot-path lerobot/configs/robot/so100.yaml \ --policy-path outputs/.../pretrained_model \ --fps 30 --num-episodes 5推理 fps 和训练 fps 不一致是新手"模型在仿真好好的、实机就乱"的常见隐藏原因。
加 EMA 平滑治抖动
EMA(指数移动平均)把当前动作和上一刻动作按权重融合,抑制高频抖动,一行代码:
smoothed = α × current + (1-α) × previous,α 一般取 0.3(新动作占 30%)。机械臂会明显变顺,代价是响应略慢(对多数任务可接受)。
推理循环里的 EMA
prev = Nonealpha = 0.3for obs in robot_loop(): action = policy(obs) if prev is not None: action = alpha * action + (1 - alpha) * prev robot.send_action(action) prev = actionα 是旋钮:0.3 强平滑(推荐起点),0.1 极强(响应慢),0.5 中等。
运行推理
python lerobot/scripts/control_robot.py record --robot-path lerobot/configs/robot/so100.yaml --policy-path outputs/train/act_so100/checkpoints/last/pretrained_model可视化推理
python lerobot/scripts/visualize_dataset.py --repo-id your-name/so100-task第一次推理成功率很低,是不是前面白做了?
根本原因
误以为训练 loss 低就该实测高。
正确认识
首次 10-30% 很正常。先锁 fps、加 EMA、必要时补数据,一步步调。sim2real gap 永远存在,调参是常态。
机械臂前几秒动作顺,越往后越歪。
根本原因
复合误差 —— ACT 缓解了它但没根除,段与段之间仍会累积。
正确认识
这是预期现象。用更稳的 fps + EMA + Temporal Ensembling 进一步压制;长任务尤其明显,必要时增加训练数据覆盖更多中后段状态。
加了 EMA 还是抖。
根本原因
抖动来源不止一处(fps、噪声、USB、数据)。
正确认识
按顺序排:① fps 锁稳(最关键)② α 调小(0.3→0.2→0.1)③ Temporal Ensembling ④ 查 USB 接线 ⑤ 补训练数据。90% 到第 3 步解决。
- 模型加载成功
- 推理帧率稳定
- 机械臂动作平滑
理解 EMA 的 α
上一刻动作是 10,模型这一刻输出 20,α=0.3。EMA 平滑后实际发给电机的动作是多少?α 调到 0.1 又是多少?说说哪个更"跟手"。
机械臂推理时抖动
- 原因:
- 控制频率不稳定或模型输出噪声大
- 解决:
- 检查 fps 设置,考虑添加平滑滤波
- ACT 原论文:Temporal Ensembling 一节
EMA 之上更强的平滑方案,把多个 chunk 的预测加权平均。
- ALOHA 项目主页
看 ACT 在真实双臂上推理的视频,建立"调好之后能做到什么"的预期。
--policy-path 加载 checkpoint 上岗。首次成功率 10-30% 是正常的,别灰心。
抖动调优顺序:锁 --fps 30(和训练一致)→ EMA 平滑(α=0.3 一行代码)→ Temporal Ensembling → 查接线 → 补数据。复合误差会让长任务后段变歪,是预期现象。
最后一章教你系统化应对一切意外。
本章讨论区
登录后即可参与讨论 —— 点击右上角的 登录 按钮
加载中…