从遥操作到策略部署:LeRobot 模仿学习与 ACT

1. LeRobot 的核心思想

LeRobot 是一个面向机器人学习的工具链,重点不是手写控制逻辑,而是通过示范数据训练机器人策略。

它的核心流程是:

Teleoperation → Record → Dataset → Train → Eval → Deploy

|---------------|-----------------------|
| 阶段 | 作用 |
| Teleoperation | 人操作机器人完成任务,提供专家示范 |
| Record | 记录图像、状态、动作和任务信息 |
| Dataset | 形成可训练的 LeRobotDataset |
| Train | 训练 policy,让模型学习动作 |
| Eval | 测试 policy 能否完成任务 |
| Deploy | 把 policy 部署到真实机器人上执行 |

LeRobot 学的是"看到什么状态,就该做什么动作"。

也就是:observation / state → policy → action


2. Teleoperation:遥操作阶段

Teleoperation,也就是 teleop / 遥操作,是 LeRobot 真实机器人流程的第一步。

它的作用不是训练模型,而是让人先控制机器人动起来,检查整条真实机器人链路是否正常。

以 SO101 为例,teleoperation 的数据流可以理解为:

复制代码
人手
 ↓
leader arm / teleop device
 ↓
读取 leader 当前关节位置
 ↓
LeRobot teleoperate 程序
 ↓
映射成 follower 的 action
 ↓
follower robot / SO101
 ↓
电机执行

所以,teleoperate 可以理解为:

人通过 teleop device 产生 action,LeRobot 把 action 发给 robot 执行。

它本身通常不重点保存训练数据,而是用于熟悉硬件、检查标定和验证控制链路。


3. Teleoperation 和 Record 的区别

|---------------|--------------|------------|-----------------|
| 阶段 | 人是否控制机器人 | 是否保存数据 | 主要目的 |
| Teleoperation | 是 | 通常不保存 | 验证硬件、标定、相机、控制链路 |
| Record | 是 | 保存 | 采集专家示范数据 |
| Train | 否 | 读取数据 | 训练 policy |
| Eval / Deploy | 否 | 可选保存结果 | 测试或部署 policy |

Record 的数据流是:

复制代码
人手
 ↓
leader arm / teleop device
 ↓
action ───────────────┐
 ↓                    │
follower robot         │
 ↓                    │
robot state ───────────┤
camera image ──────────┤
timestamp ─────────────┤
                       ↓
              LeRobotDataset

也就是说,record 把人类遥操作过程变成了可以训练 policy 的 demonstration dataset。


4. LeRobotDataset 的数据结构

LeRobotDataset 是按 episode 组织的模仿学习轨迹数据。

一条 episode 表示一次完整任务示范。每个时间步通常包含:

|---------------------|-----------------|
| 字段 | 含义 |
| observation.image | 当前视觉画面 |
| state | 当前机器人或环境状态 |
| action | 专家示范动作 |
| next.reward | 执行动作后的奖励 |
| next.success | 当前任务是否成功 |
| next.done | 当前 episode 是否结束 |

最重要的是:action 是训练目标。

模型训练时,不是单纯看视频,而是学习:

给定当前 observation 和 state,预测专家 action。

可以这样理解三者关系:

|------------------|----------|
| 名称 | 角色 |
| LeRobotDataset | 专家示范数据 |
| lerobot-train | 训练流程入口 |
| policy | 被训练的模型 |
| checkpoint | 训练后的模型存档 |
| lerobot-eval | 加载模型进行测试 |

整体链路:LeRobotDataset → DataLoader → Policy → Loss → Backpropagation → Checkpoint

一条 episode 可以理解成:

复制代码
episode_000
 ├── frame_000
 │    ├── observation.images.front
 │    ├── observation.state
 │    ├── action
 │    └── timestamp
 ├── frame_001
 │    ├── observation.images.front
 │    ├── observation.state
 │    ├── action
 │    └── timestamp
 ├── frame_002
 │    └── ...

5. 已跑通的 PushT 流程与命令

3.1 Dataset 可视化

python src/lerobot/scripts/lerobot_dataset_viz.py \

--repo-id lerobot/pusht \

--episode-index 1 \

--display-compressed-images

|-------------------------------|------------------------|
| 参数 | 含义 |
| --repo-id lerobot/pusht | 查看 lerobot/pusht 数据集 |
| --episode-index 1 | 查看第 1 条 episode |
| --display-compressed-images | 显示压缩图像 |

这一步用于确认 LeRobotDataset 的结构,能看到 observation、state、action、reward、success、done 等字段。

3.2 ACT 小步数训练

lerobot-train \

--dataset.repo_id=lerobot/pusht \

--policy.type=act \

--output_dir=outputs/train/act_pusht_test \

--job_name=act_pusht_test \

--policy.device=cpu \

--steps=200 \

--batch_size=4 \

--wandb.enable=false \

--policy.push_to_hub=false \

--save_checkpoint=true \

--save_freq=100

|-----------------------------------|----------------------------|
| 参数 | 含义 |
| --dataset.repo_id=lerobot/pusht | 指定训练数据集 |
| --policy.type=act | 使用 ACT policy |
| --steps=200 | 训练 200 次参数更新 |
| --batch_size=4 | 每次训练取 4 个样本 |
| --policy.device=cpu | 使用 CPU 训练 |
| --output_dir=... | 指定训练结果保存目录 |
| --save_freq=100 | 每 100 step 保存一次 checkpoint |

steps 表示参数更新次数。一次 step 大致是:

复制代码
取 batch → policy 预测 action → 计算 loss → 反向传播 → 更新参数

ACT policy 可以理解为根据当前 observation/state 预测一段连续动作,也就是 action chunk。本次日志中 chunk_size=100,说明它会预测长度为 100 的动作序列。

3.3 Eval 测试

lerobot-eval \

--policy.path=outputs/train/act_pusht_test/checkpoints/000200/pretrained_model \

--env.type=pusht \

--eval.n_episodes=3 \

--eval.batch_size=1 \

--eval.use_async_envs=false \

--policy.device=cpu

Eval 和 Train 的区别:

|--------|------------|--------------|
| 阶段 | 是否更新参数 | 作用 |
| Train | 会更新参数 | 学习专家动作 |
| Eval | 不更新参数 | 测试 policy 表现 |


6. LeRobot 和 ROS2 项目的关系

ROS2 项目更偏工程规则闭环

|--------------------|------------|
| ROS2 模块 | 作用 |
| 感知节点 | 输出目标信息 |
| FSM 状态机 | 决定当前任务状态 |
| motion 节点 | 根据状态生成控制指令 |
| driver 节点 | 调用机器人底层接口 |
| safety / heartbeat | 处理异常和安全停机 |

LeRobot 更偏数据驱动策略闭环

|----------------|-----------------|
| LeRobot 模块 | 作用 |
| observation | 摄像头图像、机器人状态 |
| policy | 根据观测生成动作 |
| action | 控制机器人执行 |
| dataset | 训练 policy 的数据来源 |

两者不是替代关系,而是互补关系:

ROS2 负责系统工程、安全、通信和 driver;LeRobot policy 可以作为智能动作生成模块。


7. 模仿学习、强化学习和规则控制的区别

机器人策略可以大致分成三类:规则控制、模仿学习、强化学习。

|--------|----------|--------------|---------------------------------------|
| 方法 | 核心思想 | 数据来源 | 典型形式 |
| 规则控制 | 人手写逻辑 | 工程经验 | FSM、PID、if-else、行为树 |
| 模仿学习 | 学专家怎么做 | 人类示范数据 | behavior cloning、ACT、Diffusion Policy |
| 强化学习 | 通过奖励试错 | 环境交互和 reward | PPO、SAC、DQN |

ROS2 项目更接近规则控制:感知结果 -> FSM 状态切换 -> motion 规则生成 cmd_vel -> driver 执行

LeRobot 更接近模仿学习:observation/state -> policy -> action

模仿学习的重点不是让机器人自己从零探索,而是先让人示范,然后让模型学习:在这个画面和状态下,专家会执行什么动作

所以 LeRobot 里的核心监督信号是:expert action 而不是 reward。

规则控制适合确定流程和安全逻辑,比如 FSM、急停、限速;模仿学习适合复杂操作技能,比如抓取、推动、放置。LeRobot 主要解决的是"动作策略怎么从示范数据里学出来",而 ROS2 更负责系统调度、安全和真实机器人接口。


8. ACT 的核心理解:Action Chunk

ACT 的全称可以理解为一种面向机器人操作的模仿学习策略。它和普通行为克隆最大的区别是:

普通行为克隆:预测下一步动作 ACT:预测未来一段动作序列

普通行为克隆:image_t + state_t -> action_t

ACT:image_t + state_t -> action_t, action_t+1, ..., action_t+k

这一段未来动作序列叫:action chunk

为什么要预测 action chunk? 因为机器人操作不是孤立动作,而是连续过程。例如机械臂抓取任务包含:

靠近物体 -> 调整夹爪 -> 下探 -> 闭合夹爪 -> 抬起

如果每一步都单独预测,动作可能会抖动、不连贯。ACT 预测一段连续动作,可以让动作更平滑,更符合机器人操作任务。

在 LeRobot 里可以这样理解:

observation.image + observation.state

ACT policy

future action chunk

robot/env 执行动作

ACT 的特点是根据当前图像和机器人状态预测未来一段动作 chunk,而不是只预测单步动作。这样更适合机械臂抓取、推动、放置等连续控制任务,因为这些任务本质上需要一段平滑的动作序列。


9. ACT 和 Diffusion Policy 的区别

ACT 和 Diffusion Policy 都属于模仿学习方法,都可以从 demonstration dataset 中学习机器人动作策略。

共同点:都需要专家示范数据 都学习 observation/state -> action 都适合连续控制任务 都可以用于机械臂操作

区别在于动作生成方式不同。

|------------------|-------------------|-------------------|
| 方法 | 动作生成方式 | 直观理解 |
| ACT | 直接预测 action chunk | 看当前状态,直接输出未来动作序列 |
| Diffusion Policy | 通过扩散去噪生成动作序列 | 先从噪声开始,再一步步生成合理动作 |

ACT 更像:当前观测 -> 直接回归未来动作

Diffusion Policy 更像:当前观测 + 随机噪声 -> 多步去噪 -> 生成动作轨迹

为什么 Diffusion Policy 有用?

机器人任务里经常存在多种合理动作。比如抓同一个物体,可以从左边接近,也可以从右边接近;可以先调整夹爪,也可以先移动末端。Diffusion Policy 更擅长表示这种多模态动作分布。