跳到主要内容

Alicia-M 模仿学习系统介绍

LeRobot 提供了一个覆盖机器人学习完整生命周期的统一框架,功能涵盖 数据采集、模型训练、算法验证与部署 四个环节,帮助研究者和开发者高效地实现从感知到控制的闭环开发。以下是基于LeRobot的灵动-云擎遥操套件的模仿学习示例。

1. 安装与环境准备

1.1 创建 Python 环境

conda create -n lerobot python=3.11 -y
conda activate lerobot

1.2 安装依赖


git clone https://github.com/Synria-Robotics/lerobot.git -b v6.1.1-beta
cd lerobot
pip install -e .

验证安装:

lerobot-record --help
lerobot-train --help

如果没有出现not command相关信息则说明lerobot安装成功

1.3 验证Alicia SDK

python -c "import alicia_d_sdk, alicia_m_sdk; print('Alicia SDKs OK')"

如果你看到:


Alicia SDKs OK

说明两个 SDK 都已经装好。

如果这里报错

单独安装sdk,安装完成之后再运行步骤4的SDK验证

pip install alicia-m-sdk
pip install alicia_d_sdk

以上环境只需要安装一次即可

2 单遥操套件物块抓取

采用的设备/物品:

  • Alicia M操作臂;
  • 灵动Alicia-DL示教臂
  • 两个D405 RealSense 相机;
  • 2.5 cm x 2.5 cm 正方体;
  • 收纳盒;

2.1 激活环境

cd lerobot
conda activate lerobot

2.2 端口检测

将两个摄像头连接至电脑,尽量连接电脑两个USB口,一个扩展坞不要连接两个摄像,可能供电不够导致读取不到图像;(如果使用扩展坞连接两个,则需要额外供电)

2.2.1 摄像头检测

python examples/camera/camera_detection.py

运行之后会打印出摄像头端口,分别是video5和video12

Found 2 usable camera stream(s).
Press 'q' in the video window to cycle to the next camera.

Displaying Camera 1/2: TSTC USB20 WEB CAMERA on /dev/video5
Closing feed for TSTC USB20 WEB CAMERA.

Displaying Camera 2/2: Intel(R) RealSense(TM) Depth Ca (usb-0000 on /dev/video12
Closing feed for Intel(R) RealSense(TM) Depth Ca (usb-0000.

All camera streams have been shown. Exiting.

然后运行下面这个查看摄像头详细信息

lerobot-find-cameras opencv

找到对应的摄像头例如video5 这边显示Width和Height均为 640 * 480,为后续使用

2.2.2 检测机械臂串口

首先通过操作臂USB连接电脑,然后执行

ls /dev/ttyACM*

会提示ttyACM0,然后连接示教臂,再执行一次上面命令,可以看到ttyACM0 ttyACM1,因此操作臂对应ttyACM0,示教臂对应ttyACM1

注意:设备编号顺序不固定,请以实际检测结果为准,不要默认操作臂 Alicia-M 一定是 /dev/ttyACM0

2.3 数据采集

2.3.1 采集测试

推荐先录制 1 回合做自检

下面这条命令适合先做一轮设备连通性检查:

需要注意的参数有--robot.port --robot.cameras --teleop.port这几个需要对应好,这些参数就是上面检测的,对应上才能顺利采集

lerobot-record \
--robot.type=alicia_m_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{front: {type: opencv, index_or_path: /dev/video5, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}}" \
--robot.id=alicia_m \
--teleop.type=alicia_d_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.gripper_type=50mm \
--teleop.directly_controls_robot=false \
--teleop.target_follower_type=alicia_m \
--teleop.id=alicia_d \
--dataset.repo_id=user/pick_and_place_v0 \
--dataset.root=data/pick_and_place_v0 \
--dataset.num_episodes=1 \
--dataset.single_task="pick and place" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=15 \
--display_data=true \
--dataset.push_to_hub=false

确认动作方向、相机和串口都正常后,再把 --dataset.num_episodes 改大开始正式采集。由于data/pick_and_place_v0已经存在,可以先删除,或者是在运行修改下面的--dataset.root=data/pick_and_place_v0 为 --dataset.root=data/pick_and_place_v1

2.3.2 正式采集

lerobot-record \
--robot.type=alicia_m_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{front: {type: opencv, index_or_path: /dev/video5, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}}" \
--robot.id=alicia_m \
--teleop.type=alicia_d_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.gripper_type=50mm \
--teleop.directly_controls_robot=false \
--teleop.target_follower_type=alicia_m \
--teleop.id=alicia_d \
--dataset.repo_id=user/pick_and_place_v0 \
--dataset.root=data/pick_and_place_v0 \
--dataset.num_episodes=30 \
--dataset.single_task="pick and place" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=15 \
--display_data=true \
--dataset.push_to_hub=false

运行这个采集代码,核心作用是采集30条数据( --dataset.num_episodes=30)这个数据集主要是抓取和放置物块(--dataset.single_task="pick and place"),每条数据集最长时间为30s(--dataset.episode_time_s=30),采集完成一条数据之后,会有15s的环境重置时间,重新摆放物块(--dataset.reset_time_s=15),会显示窗口查看采集的图像和机械臂信息(--display_data=true)默认不上传到hub保存(--dataset.push_to_hub=false),只保存本地。采集结束后数据会保存到本项目的data/pick_and_place_v0 (--dataset.root=data/pick_and_place_v0)

下图是Rerun可视化页面

录制的过程中

  • 按下方向键 <- 可以重新录制当前回合

  • 按下方向键 -> 结束当前回合录制(如果我提前完成任务,可以按下这个提前结束)

  • 按下 ESC 停止录制

2.3.3 继续采集

要在已有数据集上继续追加 episode,可以使用:

lerobot-record \
... \
--resume=true

恢复录制时要参数和原始数据集一致,在后面添加--resume=true

如果不一致,LeRobot 会报 Dataset metadata compatibility check failed

2.3.3 参数详细说明

Robot 参数
参数名本例填写作用
--robot.typealicia_m_follower指定被控设备是 Alicia-M follower。
--robot.port/dev/ttyACM0Alicia-M 的串口设备。实际使用时请以端口检测结果为准。
--robot.camerasfrontwrist 两路相机配置录制相机。frontwrist 是相机名字;type: opencv 表示使用 OpenCV 相机;index_or_path 是视频设备路径;widthheightfps 分别表示分辨率和帧率。录制、训练、推理阶段建议保持相机名字一致。
--robot.idalicia_m机器人实例 ID,用于区分设备,也会影响校准文件和日志标识。
Teleop 参数
参数名本例填写作用
--teleop.typealicia_d_leader指定示教设备类型是 Alicia-D leader。
--teleop.port/dev/ttyACM1Alicia-D leader 的串口设备。实际使用时请以端口检测结果为准。
--teleop.gripper_type50mmAlicia-D 的夹爪规格,需要和真实硬件一致。
--teleop.directly_controls_robotfalse表示 Alicia-D 不直接通过硬件线控制 follower,而是由计算机读取动作后再转发给 Alicia-M。
--teleop.target_follower_typealicia_m表示 Alicia-D 读到的关节值要按 Alicia-M 的关节约定映射后输出。
--teleop.idalicia_d示教设备实例 ID,用于区分设备和日志标识。
Dataset 参数
参数名本例填写作用
--dataset.repo_iduser/pick_and_place_v0数据集逻辑标识,格式通常是 用户名/数据集名。即使只保存在本地,这个字段也建议按这个格式填写。
--dataset.rootdata/pick_and_place_v0本地数据集保存目录。
--dataset.num_episodes30要录制的 episode 数量,也就是要采集多少条示教数据。
--dataset.single_task"pick and place"任务文本描述,会写入数据集。这个参数必须提供。
--dataset.episode_time_s30每个 episode 最长录制时长,单位是秒。
--dataset.reset_time_s15每个 episode 结束后,留给人工复位场景的时间,单位是秒。
--dataset.push_to_hubfalse录制结束后不自动上传到 Hugging Face Hub,只保存在本地。
其他参数
参数名本例填写作用
--display_datatrue在 Rerun 中显示当前观测和动作,便于调试。它不会改变数据集内容,只影响可视化。

2.4 策略训练

这一部分的目标是:把刚才录制好的示教数据,训练成一个可以自动完成抓取和放置的策略模型。

2.4.1 训练前检查

  • 先确认数据集已经录制完成,例如本例的数据集目录是 data/pick_and_place_v0
  • 训练命令里的 --dataset.repo_id--dataset.root 要与录制时保持一致
  • 建议至少录制 20-30 条数据,想要效果更稳建议 50 条以上
  • 如果训练机有 NVIDIA GPU,就使用 --policy.device=cuda;如果没有 GPU,也可以改成 cpu,只是速度会明显变慢
  • 第一次训练建议先不要同时修改太多参数,先按文档跑通一遍

2.4.2 训练 ACT(推荐先从这里开始)

lerobot-train \
--dataset.repo_id=user/pick_and_place_v0 \
--dataset.root=data/pick_and_place_v0 \
--dataset.video_backend=pyav \
--policy.type=act \
--policy.device=cuda \
--policy.push_to_hub=false \
--output_dir=outputs/train/act_pick_and_place \
--job_name=pick_and_place \
--batch_size=16 \
--steps=50000 \
--save_freq=5000 \
--log_freq=100 \
--eval_freq=0

上面这条命令的含义可以简单理解为:

  • --policy.type=act:训练一个 ACT 模型
  • --dataset.repo_id--dataset.root:指定要读取哪个本地数据集
  • --output_dir:训练结果保存位置
  • --batch_size=16:每次训练读取 16 批数据;如果显存不够,可以改成 84 甚至 2
  • --steps=50000:总训练步数;第一次先用这个数值就可以
  • --eval_freq=0:关闭模拟环境评估,只做离线训练

训练过程中,终端会持续打印日志和 lossloss 上下波动是正常现象,只要没有持续报错或出现 NaN,通常可以继续训练。

训练完成后,重点看这个目录:

outputs/train/act_pick_and_place/checkpoints/last/pretrained_model

如果这个目录里能看到下面几个文件,就说明模型已经成功保存:

  • config.json
  • model.safetensors
  • train_config.json

2.4.3 ACT 继续训练 / 断点续训

如果训练中断了,或者想把 50000 步继续训练到 100000 步,可以执行:

lerobot-train \
--config_path=outputs/train/act_pick_and_place/checkpoints/last/pretrained_model \
--resume=true \
--steps=100000 \
--save_freq=5000 \
--log_freq=100

这里需要注意:

  • --config_path 要指向 pretrained_model 目录,或者直接指向里面的 train_config.json
  • 不要把路径写成 .../checkpoints/050000 这一层,否则很容易找不到配置文件
  • 续训时通常不需要再把数据集、模型类型等参数全部重复写一遍

2.4.4 ACT 推理

推理的意思就是:让训练好的模型接管 Alicia-M,自动执行任务。

第一次推理前,建议先做这 4 件事:

  • 清空机械臂周围容易碰撞的杂物
  • 保持相机位置、物块摆放方式、起始姿态尽量接近录制数据时的状态
  • 先只跑 1 个回合,确认动作方向和速度正常
  • 随时准备断电或急停,不要一开始就长时间连续运行

推荐先用下面这条命令做一次最小验证:

lerobot-record \
--policy.path=outputs/train/act_pick_and_place/checkpoints/last/pretrained_model \
--policy.device=cuda \
--robot.type=alicia_m_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{front: {type: opencv, index_or_path: /dev/video5, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}}" \
--robot.id=alicia_m \
--teleop.type=alicia_d_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.gripper_type=50mm \
--teleop.directly_controls_robot=false \
--teleop.target_follower_type=alicia_m \
--teleop.id=alicia_d \
--dataset.repo_id=temp/eval_act_pick_and_place \
--dataset.root=data/eval_act_pick_and_place \
--dataset.num_episodes=1 \
--dataset.single_task="pick and place" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=15 \
--display_data=true \
--dataset.push_to_hub=false

这条命令和录制数据集的命令很像,但推理阶段最关键的新增参数是:

  • --policy.path=.../pretrained_model:表示这次不是人工示教,而是加载训练好的 ACT 模型来控制机器人

下面把推理命令按用途拆开讲,这样后面你在换模型、换相机或做安全调参时,会更容易知道该改哪一项。

模型加载参数
参数名本例填写作用和修改建议
--policy.pathoutputs/train/act_pick_and_place/checkpoints/last/pretrained_model指向要加载的策略目录。这里必须是 pretrained_model 这一层,目录中至少要有 config.jsonmodel.safetensorstrain_config.json。如果想测试某个固定 checkpoint,可以把 last 改成具体步数目录,例如 050000/pretrained_model
--policy.devicecuda指定模型在哪个设备上推理。推荐优先用 cuda,这样动作延迟更低;如果当前机器没有可用的 NVIDIA GPU,可以改成 cpu,但控制响应会明显变慢。
机器人与观测参数
参数名本例填写作用和修改建议
--robot.typealicia_m_follower指定被 ACT 控制的是 Alicia-M follower。这个参数要和真实硬件类型一致。
--robot.port/dev/ttyACM0Alicia-M 的串口。换 USB 口后这个值可能会变,推理前最好重新确认一次。
--robot.camerasfrontwrist 两路相机这是推理效果最敏感的参数之一。frontwrist 这些名字不是随便写的,它们对应模型训练时使用的观测键名。推理阶段最好保持与录制时相同的相机名字、分辨率、帧率和安装位置,否则模型看到的输入分布会变化,成功率通常会下降。
--robot.idalicia_m机器人实例 ID,主要用于区分设备和关联日志/配置。通常沿用录制数据时的填写即可。
--robot.max_relative_target本例未写,建议首次推理时追加 8这是一个常用的安全限幅参数,用来限制每个控制周期允许的相对目标变化幅度。值越小,动作越慢、越保守;值越大,动作更快,但更容易出现突跳。第一次上线建议从较小值开始试。

如果第一次推理时动作幅度偏大、看起来不够安全,可以先补充:

--robot.max_relative_target=8
Teleop 相关参数
参数名本例填写作用和修改建议
--teleop.typealicia_d_leader指定示教臂设备类型。示例里仍按 Alicia-D leader 这套配置初始化。
--teleop.port/dev/ttyACM1Alicia-D leader 的串口。和 --robot.port 一样,换口后要重新确认。
--teleop.gripper_type50mm示教臂夹爪规格,要和真实硬件一致。
--teleop.directly_controls_robotfalse表示 Alicia-D 不通过同步线直接驱动 Alicia-M,而是由电脑统一读入并转发控制逻辑。若你的接线方式不同,这个参数也要跟着改。
--teleop.target_follower_typealicia_m指定 leader 的关节数据要按 Alicia-M 的关节约定做映射。这个值如果写错,动作方向或关节对应关系可能会异常。
--teleop.idalicia_d示教设备实例 ID,用于日志和设备区分。通常不需要频繁修改。
评估数据与回合控制参数
参数名本例填写作用和修改建议
--dataset.repo_idtemp/eval_act_pick_and_place评估数据的逻辑标识。这里保存的是模型自动执行时产生的评估数据,不是训练权重本身。
--dataset.rootdata/eval_act_pick_and_place本地评估数据目录。推理结束后,你可以到这里回看每个 episode 的执行结果。
--dataset.num_episodes1本次自动运行多少个回合。第一次调试建议先设成 1,确认动作正常后再增加。
--dataset.single_task"pick and place"当前任务描述。建议和训练数据的任务语义保持一致,便于后续回看、筛选和对比评估结果。
--dataset.episode_time_s30单个回合最长持续时间。太短可能任务还没做完就强制结束;太长则在模型异常时会增加风险。
--dataset.reset_time_s15一个回合结束后给人工复位场景的时间。物块需要重新摆放、机械臂需要回到安全起点时,就调大这个值。
--dataset.push_to_hubfalse推理结束后不上传到 Hub,只保存本地。首次验证建议保持 false
--display_datatrue打开可视化窗口,方便观察相机画面、机器人状态和动作输出。第一次推理建议开启,排查问题更直观。
第一次推理时建议怎么调

一个比较稳妥的调试顺序是:

  1. 保持 --dataset.num_episodes=1--display_data=true,只做一回合短时间验证。
  2. 如果动作太猛,就先降低 --robot.max_relative_target;如果动作明显过慢,再逐步调大。
  3. 确认动作方向、抓取时机和复位流程都正常后,再增加 --dataset.num_episodes 做连续评估。

如果模型能正常加载、机械臂开始根据相机画面做动作,并且评估数据目录成功生成,就说明 ACT 推理流程已经跑通。

3. ACT 模型推理成功展示

您的浏览器不支持 video 标签,请访问 视频链接 查看。