8.2 双臂数据录制

8.2 双臂数据录制

双臂录制与单臂录制(5.3 数据采集指令)使用相同的 lerobot-record 命令,区别在于机器人类型和端口配置。

关键要点

  • 数据集命名建议包含 "bimanual" 标识,便于与单臂数据集区分
  • 录制时确认左右臂状态和相机画面都同步正常
  • 双臂需要配置至少 3 个相机(left / top / right),确保所有视角都被覆盖

录制参数说明

参数 说明 建议
--robot.type=bi_so101_follower 双臂 Follower 类型 必填
--robot.left_arm_port / --robot.right_arm_port 左右臂串口 务必确认端口与实物对应
--teleop.type=bi_so101_leader 双臂 Leader 类型 必填
--teleop.left_arm_port / --teleop.right_arm_port Leader 左右臂串口 务必与 Follower 端口区分
--dataset.num_episodes 动作重复次数 先录 10 组跑通,效果好再增加
--dataset.episode_time_s 单次任务周期(秒) 根据任务耗时设定
--dataset.single_task 任务描述 如 "Pick up cube with left and place with right"

录制控制

按键 功能
→ 向右键 提前结束当前 episode
← 向左键 重录当前 episode
ESC 退出录制

注意事项

  • 双臂录制前先单独测试每只臂的遥操作(8.1 双臂遥操作),确认动作同步正常
  • 录制过程中注意双臂不要互相碰撞
  • 第 2 次录制用相同 repo_id 会报 "File exists",需换名或加 --resume=true
  • 数据保存路径(Linux / macOS):~/.cache/huggingface/lerobot/<HF_USER>/<dataset_name>
  • 数据保存路径(Windows):%USERPROFILE%\.cache\huggingface\lerobot\<HF_USER>\<dataset_name>
  • 建议先录 10 组验证全流程,效果好再录 ≥50 组

双臂录制(Linux)

linux: lerobot-record \
    --robot.type=bi_so101_follower \
    --robot.left_arm_port=/dev/so101_follower_left \
    --robot.right_arm_port=/dev/so101_follower_right \
    --robot.left_id=Left --robot.right_id=Right \
    --robot.cameras='{left: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30}, top: {"type": "opencv", "index_or_path": 0, "width": 640, "height": 360, "fps": 30}, right: {"type": "opencv", "index_or_path": 4, "width": 640, "height": 480, "fps": 30}}' \
    --teleop.type=bi_so101_leader \
    --teleop.left_arm_port=/dev/so101_leader_left \
    --teleop.right_arm_port=/dev/so101_leader_right \
    --teleop.left_id=R07252710 --teleop.right_id=R07254799 \
    --dataset.repo_id=test/bimanual-so101-test \
    --dataset.push_to_hub=false \
    --dataset.num_episodes=10 \
    --dataset.single_task="Task description"
macos: lerobot-record \
    --robot.type=bi_so101_follower \
    --robot.left_arm_port=/dev/tty.usbmodem58760431541 \
    --robot.right_arm_port=/dev/tty.usbmodem58760431551 \
    --robot.left_id=Left --robot.right_id=Right \
    --robot.cameras='{left: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30}, top: {"type": "opencv", "index_or_path": 0, "width": 640, "height": 360, "fps": 30}, right: {"type": "opencv", "index_or_path": 4, "width": 640, "height": 480, "fps": 30}}' \
    --teleop.type=bi_so101_leader \
    --teleop.left_arm_port=/dev/tty.usbmodem58760431561 \
    --teleop.right_arm_port=/dev/tty.usbmodem58760431571 \
    --teleop.left_id=R07252710 --teleop.right_id=R07254799 \
    --dataset.repo_id=test/bimanual-so101-test \
    --dataset.push_to_hub=false \
    --dataset.num_episodes=10 \
    --dataset.single_task="Task description"
windows: lerobot-record `
    --robot.type=bi_so101_follower `
    --robot.left_arm_port=COM74 `
    --robot.right_arm_port=COM8 `
    --robot.left_id=Left --robot.right_id=Right `
    --robot.cameras='{left: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30}, top: {"type": "opencv", "index_or_path": 0, "width": 640, "height": 360, "fps": 30}, right: {"type": "opencv", "index_or_path": 4, "width": 640, "height": 480, "fps": 30}}' `
    --teleop.type=bi_so101_leader `
    --teleop.left_arm_port=COM6 `
    --teleop.right_arm_port=COM69 `
    --teleop.left_id=R07253101 --teleop.right_id=R07253102 `
    --dataset.repo_id=test/bimanual-so101-test `
    --dataset.push_to_hub=false `
    --dataset.num_episodes=10 `
    --dataset.single_task="Task description"