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 端口号获取
- 检测相机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。
- 检测机械臂端口号:
- 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。