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"