真机推理与鲁棒性评估
把训练好的 ACT checkpoint 部署回真机:三终端跑通「硬件层 → 推理节点 → 服务开关」,先 DRY_RUN 干跑再接真机复现开盖-取物-入罐-盖盖闭环,最后用摆放偏移检验策略的鲁棒性。
00课程节奏:五星学习法 · 8 段微课(每段 ≤ 15 min)
本实验按五星学习法组织:先用"checkpoint 部署回真机却猛甩臂"的真实故障聚焦问题,再用「开车眼手脚循环」激活旧知,接着示证新知(ROS2 接口 + 安全机制 + 双线程节拍动画),然后动手应用新知完成三终端启动与真机复现,最后借排障与拓展融会贯通。全程切成 8 段微课、每段不超过 15 分钟,段间停顿 1~2 分钟消化;纯讲授合计约 100 分钟,其余课时用于动手实操与个别辅导。
| 课段 | 五星阶段 | 时长 | 对应章节 | 本段任务 |
|---|---|---|---|---|
| 课段 1 | 聚焦问题 | 12 min | §01 + §02 前半 | 抛出"checkpoint 部署后猛甩臂"的故障,明确推理部署目标 |
| 课段 2 | 激活旧知 | 8 min | §02 后半 | 用"开车眼手脚循环"旧知解释双线程推理与三层平滑 |
| 课段 3 | 示证新知 | 15 min | §03 | 认识 ROS2 接口(订阅/发布/服务)与 DRY_RUN 等安全机制 |
| 课段 4 | 示证新知 | 12 min | §06 | 看摆放偏移容忍带与双线程节拍动画 |
| 课段 5 | 应用新知 | 15 min | §04 + §05 前半 | 三终端启动、DRY_RUN=True 干跑验证动作合理性 |
| 课段 6 | 应用新知 | 15 min | §05 后半 | 切 DRY_RUN=False、SetBool 启停、真机复现开盖入罐闭环 |
| 课段 7 | 应用新知 | 10 min | §07 | 用摆放偏移鲁棒性评估台预判复现表现 |
| 课段 8 | 融会贯通 | 13 min | §08~§10 | 排障口诀收口,拓展阅读与思考题拔高迁移 |
讲课提示:课段 1/2 以讲授 + 提问为主;课段 3~4 用接口表 + 动画;课段 5~6 边讲边演(先干跑再真机);课段 7 学员独立完成;课段 8 答疑拔高。段间停顿 1~2 分钟。
01学习目标课段 1 · 聚焦问题 · 12 min
- 读懂推理节点的双线程结构:50Hz 推理线程出目标、100Hz 发布线程经限速平滑后发指令。
- 掌握三终端启动法与 /model_ifrun 服务开关,理解 DRY_RUN 安全开关的干跑验证流程。
- 能按案例步骤完成家庭收纳闭环真机复现,并记录成功/失败现象。
- 理解「摆放偏移鲁棒性」评估的意义:数据覆盖范围决定策略能容忍多大的场景变化。
02原理:双线程推理与三层平滑课段 1 收尾 + 课段 2 · 激活旧知 · 8 min
推理节点像一位「边看边喊话的指挥」:推理线程每 20ms(50Hz)看一眼三路相机 + 16 维关节状态,让 ACT 算出「接下来该怎么动」;但机器人不能听完就猛动——发布线程每 10ms(100Hz)把目标动作先「磨平」再发出去。为什么要磨平?网络输出偶尔会抖,直接执行等于手臂突然哆嗦。平滑分三层:① 滑动窗口平均(取最近 5 个目标求均值,抹平单点毛刺)、② EMA 平滑(α=0.15,每次只朝目标挪一小步,像轻推弹簧)、③ 硬性限速(臂关节每拍最多变 0.003 rad、夹爪 0.02,物理上封顶)。三层过滤后,动作既跟得上策略又稳如人手。
03硬件与环境:ROS2 接口与安全机制课段 3 · 示证新知 · 15 min
04操作步骤:从干跑到真机复现课段 5~6 · 应用新知 · 2×15 min
回传 checkpoint,改 MODEL_PATH 指向 pretrained_model
三终端启动,只打印动作验证合理性
确认无异常后改 False,服务开关启动执行
恢复采集场景跑闭环,再平移摆放测偏移
- 环境准备:把 lerobot_inference_node_act.py 放入 /home/lindenbot/lerobot-0.4.1/,修改 MODEL_PATH 指向本任务 checkpoint。
- 终端 1 硬件层:运行 01start_robot_act.sh(臂 SDK + 夹爪 + 碰撞检测)。
- 终端 2 推理节点:运行 run_act_node.sh,看到「节点初始化完成,等待 /model_ifrun 启动指令」。
- 终端 3 干跑:先保持 DRY_RUN=True,SetBool true 启动,查看打印的 L_arm/R_arm 动作序列是否合理。
- 切真机:改 DRY_RUN=False 重启节点,SetBool true,机械臂自主完成开盖-取物-入罐-盖盖;SetBool false 停止。
- 鲁棒性评估:环境恢复至采集阶段先跑通闭环;随后将罐子/芒果平移少量位置重复测试,记录成功与失败边界。
SetBool true 后,机械臂应自主完成「开盖 → 取芒果 → 入盒 → 盖盖」。判据就一句话:机械臂能自主把芒果放进不锈钢盒,即任务完成。05关键命令(三终端)随课段 5 / 6 对照使用
# ──终端1:机器人硬件层(臂 SDK + 夹爪 + 碰撞检测,无 CamerasNode)── bash /home/lindenbot/iflytek_armtele_project/start_bash/04model_run_demo/01start_robot_act.sh # ──终端2:ACT 推理节点(首次测新模型务必先 DRY_RUN=True)── bash /home/lindenbot/lerobot-0.4.1/run_act_node.sh # ──终端3:启动 / 停止推理── source /home/lindenbot/iflytek_armtele_project/install/setup.bash ros2 service call /model_ifrun std_srvs/srv/SetBool "{data: true}" # 启动 ros2 service call /model_ifrun std_srvs/srv/SetBool "{data: false}" # 停止
DRY_RUN=True:只打印动作,不发布到机械臂,step=0/10/20… 的 L_arm/R_arm 数列应连续缓变;若出现跳变或方向明显反常,先回 EXP-03 查数据与训练,不要急着接真机。🚀 LeRobot ACT 推理节点启动
⚠️ DRY_RUN=True:只打印动作,不发布到机械臂
✓ 相机设备: /dev/cam_head
✓ 相机设备: /dev/cam_left
✓ 相机设备: /dev/cam_right
📦 加载 ACT 模型 ...
🖥️ 设备: cuda
✅ ACT 模型/处理器加载成功 (chunk_size=100)
📡 创建订阅者 ...
✓ 机械臂状态: /cerebellum_sdk/arm/joint_states
✓ 夹爪状态: /slave/gripper/{left,right}/states
📤 创建发布者 ...
✓ 臂命令 /cerebellum_sdk/arm/joint_commands + 夹爪命令
✅ 节点初始化完成,等待 /model_ifrun 启动指令
🎬 启动推理
🔎 /joint_states 实际关节名(14): [left_shoulder_pitch_joint, left_shoulder_roll_joint, ...]
🪜 ramp 起点(ROS顺序) L_pitch=+0.123 R_pitch=-0.456 -> 目标 L_pitch=+0.130 R_pitch=-0.450
🔄 推理循环启动 (50 Hz)
📡 发布线程启动 (100 Hz, slew限速)
step=0 L_arm[+0.130 -0.200 +0.100 -0.050 +0.300 +0.010 -0.150] L_grip=0.750 ...
step=10 L_arm[+0.135 -0.205 +0.098 -0.048 +0.305 +0.012 -0.148] L_grip=0.752 ...
🔴 DRY_RUN=False:将真正发布命令到机械臂!,开始推理后会出现 ✅ 已切换臂控制模式 mode=1;停止时打印 ⏸️ 停止推理 / 🛑 推理循环结束 / 🛑 发布线程结束。06动画:摆放偏移容忍带与双线程节拍课段 4 · 示证新知 · 12 min
07互动:摆放偏移鲁棒性评估台课段 7 · 应用新知 · 10 min
判读依据均来自案例原文:桌面到机械臂的距离要尽可能保持一致,否则复现效果较差;方位粗略测量、采集数量足够大时场景小范围变动也可以复现;简单任务建议采集 200 次左右、训练步数 500000 步以上。
08常见问题课段 8 · 融会贯通 · 13 min
09拓展阅读课段 8 · 融会贯通
- 《04-聆动机器人推理》:推理源码逐层解析(1.1–1.4)、恒等映射与 cyclic-shift 历史溯源。
- 《聆动机器人案例-家庭场景》第 5 章「复现效果评估」:排查顺序与成功判据原文。
- LeRobot 官方文档:ACTPolicy.select_action 的 FIFO 动作块机制与推理示例。
- 数据增广思路:若希望容忍更大的摆放偏移,可从采集端扩大示范位置覆盖面(回 EXP-02 规划采集)。
- 对照 IND-03 分拣案例:同一套三终端启动与 /model_ifrun 开关,仅换 checkpoint 与场景布设。