Skip to main content
Version: 6.1.0 (Latest)

Alicia模仿学习系统介绍

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

1. 安装与环境准备

1.1 创建 Python 环境

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

1.2 安装依赖


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

验证安装:

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

以上指令仅需运行一次。

2 单遥操套件物块抓取

采用的设备/物品:

  • Alicia D遥操套件;
  • 一个C10 玄雅相机;
  • 一个D405 RealSense 相机;
  • 2.5 cm x 2.5 cm 正方体;
  • 收纳盒;

将正方体和收纳盒放置在操作臂工作空间内,D405安装在机械臂腕部支架上,并调整C10前置相机视角如下图所示:

2.1 硬件连接

2.1.1 仅连接示教臂

  • 将D405腕部相机(wrist)和C10前置相机(front)连接电脑
  • 示教臂数据线连接电脑
  • 遥操同步线连接示教臂和操作臂

该模式下操作臂的当前状态(Observation)和给定的动作(Action)均通过示教臂数据线获取,二者之间间隔一个fps。

2.1.2 示教臂和操作臂数据分别获取

  • 将D405腕部相机(wrist)和C10前置相机(front)连接电脑
  • 示教臂和操作臂数据线均连接电脑
  • 遥操同步线连接示教臂和操作臂(可选)

该模式下操作臂的当前状态(Observation)和给定的动作(Action)分别从操作臂数据线和示教臂数据线获取。

2.2 数据采集

2.2.1 端口号获取

  1. 检测相机RBG端口号
cd lerobot
conda activate lerobot
python examples/camera/camera_detection.py

得到如下结果:

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/video7
Closing feed for TSTC USB20 WEB CAMERA.

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

All camera streams have been shown. Exiting.

分别记录前置相机和腕部相机的RGB端口号为:7/4。

  1. 检测机械臂端口号
  • Linux系统:
ls /dev/ttyACM*

仅连接示教臂得到:/dev/ttyACM0;

分别连接示教臂和操作臂得到:/dev/ttyACM0 /dev/ttyACM1,其中,示教臂端口号为0, 操作臂为1。

  • Windows系统:

打开“设备管理器” → 展开“端口 (COM 和 LPT)” → 查找类似 “USB-SERIAL CH340 (COM3)” 或 “Silicon Labs CP210x USB to UART Bridge (COM5)” 的设备名称。

或使用 mode 命令(CMD/PowerShell 均可):

mode

后续指令以Linux系统为主,Windows/macOS用户可将对应的机械臂/相机端口号替换为对应系统版本。

2.2.2 仅连接示教臂

lerobot-record \
--robot.type=alicia_d_follower \
--robot.cameras='{
front_camera: {type: opencv, index_or_path: /dev/video7, width: 640, height: 480, fps: 30},
wrist_camera: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30}
}' \
--robot.id=black \
--teleop.type=alicia_d_leader \
--teleop.id=leader_arm \
--teleop.port=/dev/ttyACM0 \
--teleop.use_action_as_observation=true \
--dataset.repo_id=ubuntu/grab-cube-dataset1 \
--dataset.root=/home/ubuntu/Data/LerobotData1 \
--dataset.num_episodes=10 \
--dataset.single_task="Grab the cube" \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=5 \
--display_data=true \
--dataset.push_to_hub=false

--resume=true 加上该行可基于当前数据集继续采集。

2.2.3 示教臂和操作臂数据分别获取

lerobot-record \
--robot.type=alicia_d_follower \
--robot.port=/dev/ttyACM1 \
--robot.cameras='{
front_camera: {type: opencv, index_or_path: /dev/video7, width: 640, height: 480, fps: 30},
wrist_camera: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30}
}' \
--robot.id=black \
--teleop.type=alicia_d_leader \
--teleop.id=leader_arm \
--teleop.port=/dev/ttyACM0 \
--teleop.use_action_as_observation=false \
--dataset.repo_id=ubuntu/grab-cube-dataset2 \
--dataset.root=/home/ubuntu/Data/LerobotData2 \
--dataset.num_episodes=10 \
--dataset.single_task="Grab the cube" \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=5 \
--display_data=true \
--dataset.push_to_hub=false

--teleop.directly_controls_robot=false当去除遥操同步线改用电脑从示教臂读取数据再控制操作臂时使用。

--resume=true 加上该行可基于当前数据集继续采集。

2.3 数据集训练

lerobot-train \
--dataset.repo_id=ubuntu/grab-cube-dataset1 \
--dataset.root=/home/ubuntu/Data/LerobotData1 \
--dataset.video_backend=pyav \
--policy.type=act \
--policy.push_to_hub=false \
--output_dir=outputs/train/act_grab_cube \
--job_name=act_grab_cube \
--policy.device=cuda \
--wandb.enable=true \
--wandb.project=alicia-d-grasp-cube \
--steps=50000 \
--batch_size=32 \
--save_freq=5000 \
--log_freq=100 \
--eval_freq=5000

参数选择:

--policy.type=act: 选择训练模型,ACT为act,DP为diffusion。 --dataset.repo_id=username/dataset_name: 数据集标识符。

--dataset.root=/path/to/parent/directory: 训练使用的数据集地址路径。尽量采用和采集时相同的路径。

--output_dir=/path/to/training_result: 训练完成的模型输出路径,该路径目录下包括不同的检查点。

继续训练

lerobot-train \
--config_path=outputs/train/act_grab_cube/checkpoints/050000 \
--dataset.repo_id=ubuntu/grab-cube-dataset \
--dataset.root=/home/ubuntu/Data/LerobotData/test2 \
--dataset.video_backend=pyav \
--policy.type=act \
--policy.device=cuda \
--steps=100000 \
--batch_size=32

2.4 模型推理

单臂推理示例:

python examples/alicia/eval_alicia_arms.py \
--policy.path=outputs/train/act_grab_cube/checkpoints/last/pretrained_model \
--robot.type=alicia_d_follower \
--robot.port=/dev/ttyACM1 \
--robot.cameras="{front: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}}" \
--policy.device=cuda \
--task="Grab the cube" \
--duration=120 \
--fps=10 \
--num_episodes=5 \
--record_eval=false

关键参数:

--policy.path: 训练好的策略检查点目录路径(例如:outputs/train/act_grab_cube/checkpoints/last/pretrained_model 或 outputs/train/act_grab_cube/checkpoints/050000/pretrained_model)

--robot.port: 操作臂的串口

--task: 任务描述(应与训练时使用的任务匹配)

--duration: 每个评估回合的持续时间(秒) --fps: 动作执行频率(Hz)

--num_episodes: 要运行的评估回合数

--record_eval: 是否将评估回合录制到数据集(true 或 false)

--eval_dataset_repo_id: 用于录制评估回合的数据集仓库 ID(如果 record_eval=true 则需要)

3 双遥操套件物体抓取

采用的设备/物品:

  • 双Alicia D遥操套件;
  • 2个C10 玄雅相机;
  • 2个D405 RealSense 相机;
  • 待抓取物体;
  • 收纳盒;

3.1 硬件连接

3.1.1 仅连接示教臂

  • 将D405腕部相机(wrist),C10前置和上方相机(front and top)连接电脑
  • 两个示教臂数据线连接电脑
  • 遥操同步线连接示教臂和操作臂

该模式下操作臂的当前状态(Observation)和给定的动作(Action)均通过示教臂数据线获取,二者之间间隔一个fps。

3.1.2 示教臂和操作臂数据分别获取

  • 将D405腕部相机(wrist),C10前置和上方相机(front and top)连接电脑
  • 两个示教臂和两个操作臂数据线均连接电脑
  • 遥操同步线连接示教臂和操作臂(可选)

该模式下操作臂的当前状态(Observation)和给定的动作(Action)分别从操作臂数据线和示教臂数据线获取。

3.2 数据采集

3.2.1 仅连接示教臂

lerobot-record \
--robot.type=bi_alicia_d_follower \
--robot.left_arm_connect=false \
--robot.right_arm_connect=false \
--robot.cameras='{
right_wrist: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30},
left_wrist: {type: opencv, index_or_path: /dev/video18, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: /dev/video24, width: 640, height: 480, fps: 30},
front: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}
}' \
--robot.id=bimanual_black \
--teleop.type=bi_alicia_d_leader \
--teleop.id=bimanual_leader \
--teleop.left_arm_port=/dev/ttyACM0 \
--teleop.right_arm_port=/dev/ttyACM1 \
--teleop.use_action_as_observation=true \
--dataset.repo_id=ubuntu/grab-cube-bimanual-dataset1 \
--dataset.root=/home/ubuntu/Data/LerobotData1 \
--dataset.num_episodes=10 \
--dataset.single_task="Grab the cube" \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=5 \
--display_data=true \
--dataset.push_to_hub=false

--resume=true 加上该行可基于当前数据集继续采集。

3.2.2 示教臂和操作臂数据分别获取

lerobot-record \
--robot.type=bi_alicia_d_follower \
--robot.left_arm_port=/dev/ttyACM2 \
--robot.right_arm_port=/dev/ttyACM3 \
--robot.cameras='{
right_wrist: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30},
left_wrist: {type: opencv, index_or_path: /dev/video18, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: /dev/video24, width: 640, height: 480, fps: 30},
front: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}
}' \
--robot.id=bimanual_black \
--teleop.type=bi_alicia_d_leader \
--teleop.id=bimanual_leader \
--teleop.left_arm_port=/dev/ttyACM0 \
--teleop.right_arm_port=/dev/ttyACM1 \
--teleop.use_action_as_observation=false \
--dataset.repo_id=ubuntu/grab-cube-bimanual-dataset2 \
--dataset.root=/home/ubuntu/Data/LerobotData2 \
--dataset.num_episodes=10 \
--dataset.single_task="Grab the cube" \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=5 \
--display_data=true \
--dataset.push_to_hub=false

--teleop.directly_controls_robot=false 当去除遥操同步线改用电脑从示教臂读取数据再控制操作臂时使用。

--resume=true 加上该行可基于当前数据集继续采集。

3.3 数据集训练

lerobot-train \
--dataset.repo_id=ubuntu/grab-cube-bimanual-dataset1 \
--dataset.root=/home/ubuntu/Data/LerobotData1 \
--dataset.video_backend=pyav \
--policy.type=act \
--policy.push_to_hub=false \
--output_dir=outputs/train/act_bimanual_grab_cube \
--job_name=act_bimanual_grab_cube \
--policy.device=cuda \
--wandb.enable=true \
--wandb.project=alicia-d-bimanual-grasp-cube \
--steps=50000 \
--batch_size=32 \
--save_freq=5000 \
--log_freq=100 \
--eval_freq=5000

参数选择:

--policy.type=act: 选择训练模型,ACT为act,DP为diffusion。 --dataset.repo_id=username/dataset_name: 数据集标识符。

--dataset.root=/path/to/parent/directory: 训练使用的数据集地址路径。尽量采用和采集时相同的路径。

--output_dir=/path/to/training_result: 训练完成的模型输出路径,该路径目录下包括不同的检查点。

继续训练

lerobot-train \
--config_path=outputs/train/act_bimanual_grab_cube/checkpoints/050000 \
--dataset.repo_id=ubuntu/grab-cube-bimanual-dataset1 \
--dataset.root=/home/ubuntu/Data/LerobotData1 \
--dataset.video_backend=pyav \
--policy.type=act \
--policy.device=cuda \
--steps=100000 \
--batch_size=32

3.4 模型推理

双臂推理示例

python examples/alicia/eval_alicia_arms.py \
--policy.path=outputs/train/act_bimanual_grab_cube/checkpoints/last/pretrained_model \
--robot.type=bi_alicia_d_follower \
--robot.left_arm_port=/dev/ttyACM1 \
--robot.right_arm_port=/dev/ttyACM0 \
--robot.cameras='{
right_wrist: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30},
left_wrist: {type: opencv, index_or_path: /dev/video18, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: /dev/video24, width: 640, height: 480, fps: 30},
front: {type: opencv, index_or_path: /dev/video12, width: 640, height: 480, fps: 30}
}' \
--policy.device=cuda \
--task="Grab and handover the red cube to the other arm" \
--duration=120 \
--fps=10 \
--num_episodes=5 \
--record_eval=false

关键参数:

--policy.path: 训练好的策略检查点目录路径(例如:outputs/train/act_bimanual_grab_cube/checkpoints/last/pretrained_model)

--robot.left_arm_port / --robot.right_arm_port: 操作臂的串口

--robot.cameras: 摄像头配置(应与训练设置匹配)

--task: 任务描述(应与训练时使用的任务匹配)

--duration: 每个评估回合的持续时间(秒) --fps: 动作执行频率(Hz)

--num_episodes: 要运行的评估回合数

--record_eval: 是否将评估回合录制到数据集(true 或 false)

--eval_dataset_repo_id: 用于录制评估回合的数据集仓库 ID(如果 record_eval=true 则需要)

4 关键参数

LeRobot 使用命令行参数来配置数据收集任务。以下是一些关键参数:

--robot.type=alicia_d: 指定我们要使用的机器人类型是 Alicia-D。如若需要使用双臂则设置为alicia_d_multi

--control.type=record: 指定我们要执行的任务是数据记录。

--control.fps=30: 设置数据记录的帧率 (每秒捕获多少帧数据)。建议的常用值是 15、30。

--control.single_task="在这里描述您的任务": 对您正在演示或记录的任务进行简短描述,例如 "机械臂抓取红色的积木并放入盒子中"。

--control.root=/path/to/your/datasets/my_alicia_dataset: 指定收集的数据集存储在本地计算机的哪个文件夹。请确保此路径存在,或者 LeRobot 有权限创建它。当采集新数据集时记得修改,否则会报错。

--control.repo_id=username/dataset_name: (必需) 指定数据集标识符。必须使用 用户名/数据集名称 的格式(例如:my_user/alicia_demo)。即使您不上传到 Hugging Face Hub (--control.push_to_hub=false),这个格式也是必需的。

--control.num_episodes=10: 您希望记录多少个 "回合" 或 "演示" 的数据。对于简单动作来说,建议训练30-50次,对于较复杂动作建议进行多次训练。

--control.warmup_time_s=5: 每个回合开始前,等待多少秒。这给您时间准备。

--control.episode_time_s=60: 每个回合计划记录多长时间 (秒)。建议时间设置留有部分余量。

--control.reset_time_s=30: 每个回合结束后,给您多少时间来重置场景或机械臂到初始状态。

--control.push_to_hub=false: 是否在数据收集完成后自动将数据集上传到 Hugging Face Hub。初次使用建议设为 false。

--robot.port="": (可选) 指定机械臂连接的串口。留空则自动搜索。如果自动搜索失败,请手动设置:Linux 示例 "/dev/ttyUSB0",Windows 示例 COM3(将其替换为设备管理器中显示的实际端口)。

--control.display_data=true:(可选)GUI实时显示采集数据与摄像头拍摄数据,可用于采集实验。

--control.video=false:(可选)保存采集图像数据为视频,建议初期选择为true来观测机位是否合理。

--control.play_sounds=false:开始与结束提示音。

5. 键盘快捷键

录制过程中的快捷键:

快捷键操作
重新录制当前回合
提前跳过当前阶段
ESC停止录制

6. 常见问题

  • 端口连接失败:使用 lerobot-find-port 检查,确认用户在 dialout 组中
  • 摄像头初始化失败:使用 ls /dev/video* 检查设备
  • 视频解码错误:训练时使用 --dataset.video_backend=pyav
  • CUDA 内存不足:减小 --batch_size

更多详细信息请参考 lerobot/docs/Alicia_D_Usage_CN.md