Skip to main content

Alicia-M 模仿学习系统介绍

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.1-beta
cd lerobot
pip install -e .

验证安装:

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

以上指令仅需运行一次。

2 单遥操套件物块抓取

采用的设备/物品:

  • Alicia M操作臂;
  • Alicia D示教臂
  • 一个C10 玄雅相机;
  • 一个D405 RealSense 相机;
  • 2.5 cm x 2.5 cm 正方体;
  • 收纳盒;

2.1 硬件连接

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

  • 将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,其中,灵动示教臂端口号为1, 云擎操作臂为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_m_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras='{
wrist_camera: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30}
}' \
--robot.id=alicia_m \
--teleop.type=alicia_d_leader \
--teleop.id=leader_arm \
--teleop.port=/dev/ttyACM1 \
--teleop.target_follower_type=alicia_m \
--teleop.use_action_as_observation=false \
--dataset.repo_id=ubuntu/grab-cube-demo1 \
--dataset.root=/home/ubuntu/Data/Lerobot \
--dataset.num_episodes=10 \
--dataset.single_task="Grab the cube" \
--dataset.episode_time_s=80 \
--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-demo1 \
--dataset.root=/home/ubuntu/Data/Lerobot \
--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_m_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 则需要)