lerobot 之 so-101 机械臂数据采集

发布时间:2026/7/21 8:30:08
lerobot 之 so-101 机械臂数据采集 一、环境搭建和框架安装本文在 Ubuntu 22.04 、cuda-12.2 下搭建环境。1、创建虚拟环境在 Miniconda 下创建虚拟环境并激活conda create -n lerobot python3.12 -y conda activate lerobot2、安装 ffmpeg 并验证conda install ffmpeg -c conda-forge -y3、获取 lerobot 源码并安装验证获取并安装git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e .验证也可以分开验证lerobot-train --help lerobot-record --help lerobot-replay --help看是否都正常显示帮助信息。二、LeRobot使用SO101机械臂校准遥操作录制数据1、端口号映射固定查看端口号ls /dev/ttyACM*端口号是系统随机分配的会随着usb的插入顺序和USB端口的不同而改变不固定因此通过添加 udev 规则根据设备的唯一标识序列号等创建固定的符号链接如 /dev/ttyLeader 。1.1 查询设备属性先插入一个usb设备先确认设备名ls /dev/ttyACM*在利用 udevadm 查询设备属性udevadm info -a -n /dev/ttyACM0在输出内容中找以下字段字段说明我的硬件值ATTRS{idVendor}厂商ID1a86 (CH340)ATTRS{idProduct}产品ID55d3ATTRS{serial}设备序列号唯一标识5B3D049275ATTRS{pruduct}产品名称USB Single Serial记录两个 USB 设备的 serial 信息。1.2 编写 udev 规则udev 规则文件存放在 /etc/udev/rules.d 目录下文件名格式为数字-名称.rules数字越大优先级越高进入该目录新建规则并编辑内容sudo touch 99-fixed-serial-ports.rules sudo vim 99-fixed-serial-ports.rules添加sudo bash -ccat/etc/udev/rules.d/99-fixed-serial-ports.rules EOF #Leader 机械臂(序列号:5B14114326) SUBSYSTEMtty,ATTRS{idVendor}1a86,ATTRS{idProduct}55d3,ATTRS{serial}5B3D049275,SYMLINKttyLeader,MODE0666 #Follower 机械臂(序列号:5B14030919) SUBSYSTEMtty,ATTRS{idVendor}1a86,ATTRS{idProduct}55d3,ATTRS{serial}5B61033171,SYMLINKttyFollower,MODE0666重载规则并触发方式一sudo udevadm control --reload-rules sudo udevadm trigger方式二拔掉 USB 设备在插入udev 会自动更新规则。1.3 验证验证 udev 规则是否应用成功ls -l /dev/ttyLeader /dev/ttyFollower此时代码中可直接使用固定名称即可leader_port /dev/ttyLeader follower_port /dev/ttyFollower2、校准赋予端口读写权限sudo chmod 666 /dev/ttyACM*校准主动臂lerobot-calibrate --teleop.typeso101_leader --teleop.port/dev/ttyLeader --teleop.idmy_leader_arm将SO101主动臂放到电机中间位点回车键依次转主动臂的各个电机使其达到最大值和最小值使校准程序采集到每个电机的极限值校准完成后点击回车键保存退出最后会显示校准结果的保存路径。校准文件内容为{ # 肩部水平旋转关节 shoulder_pan: { id: 1, drive_mode: 0, homing_offset: 585, range_min: 1171, range_max: 2993 }, # 肩部抬升关节 shoulder_lift: { id: 2, drive_mode: 0, homing_offset: -566, range_min: 870, range_max: 3136 }, # 肘部弯曲关节 elbow_flex: { id: 3, drive_mode: 0, homing_offset: 771, range_min: 889, range_max: 2970 }, # 腕部俯仰关节 wrist_flex: { id: 4, drive_mode: 0, homing_offset: -307, range_min: 714, range_max: 3013 }, # 腕部旋转关节 wrist_roll: { id: 5, drive_mode: 0, homing_offset: 1506, range_min: 0, range_max: 4095 }, # 夹爪 gripper: { id: 6, drive_mode: 0, homing_offset: -415, range_min: 0, range_max: 2052 } }校准文件的检查在正式采集数据之前建议检查以下内容每个关节 ID 是否正确每个关节运动方向是否正确机械臂零位姿态是否自然关节最小值和最大值是否安全夹爪开合范围是否合理控制过程中是否会撞机械限位标定后是否可以稳定回到初始姿态。从动臂的校准和主动臂一样2、数据采集摄像头连接检查so-101 用了两个摄像头夹爪前端摄像头顶部全局摄像头。终端中执行以下指令遍历和获取摄像头列表数据lerobot-find-cameras opencv相机列表中第一个为主机自带后两个为设备相机。摇操作lerobot-teleoperate \ --robot.typeso101_follower \ --robot.port/dev/ttyFollower \ --robot.idmy_follower_arm \ --robot.cameras{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: MJPG}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: MJPG} } \ --teleop.typeso101_leader \ --teleop.port/dev/ttyLeader \ --teleop.idmy_leader_arm \ --display_datatrue \ --fps30录制数据lerobot-record \ --robot.typeso101_follower \ --robot.port/dev/ttyFollower \ --robot.idmy_follower_arm \ --robot.cameras{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: MJPG}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: MJPG} } \ --teleop.typeso101_leader \ --teleop.port/dev/ttyLeader \ --teleop.idmy_leader_arm \ --display_datatrue \ --dataset.repo_idlocal/put_paper_into_plate \ --dataset.num_episodes50 \ --dataset.single_taskPut the paper into the plate \ --dataset.push_to_hubfalse \ --dataset.episode_time_s30 \ --dataset.reset_time_s20指令说明lerobot-record \ # --------------------------- # Follower Arm从动机械臂 # --------------------------- --robot.typeso101_follower \ # 机器人类型SO101从臂 --robot.port/dev/ttyFollower \ # 从臂串口设备 --robot.idmy_follower_arm \ # 从臂名称自定义 # --------------------------- # 相机配置 # --------------------------- --robot.cameras{ front: { type: opencv, # OpenCV相机驱动 index_or_path: 0, # 前视相机设备 width: 640, # 图像宽度 height: 480, # 图像高度 fps: 30, # 采集帧率 fourcc: MJPG # MJPEG格式 }, side: { type: opencv, # OpenCV相机驱动 index_or_path: 2, # 俯视相机设备 width: 640, height: 480, fps: 30, fourcc: MJPG } } \ # --------------------------- # Leader Arm主动机械臂 # --------------------------- --teleop.typeso101_leader \ # 遥操作设备类型SO101主臂 --teleop.port/dev/ttyLeader \ # 主臂串口 --teleop.idmy_leader_arm \ # 主臂名称 # --------------------------- # 可视化 # --------------------------- --display_datatrue \ # 启用Rerun实时可视化窗口 # --------------------------- # 数据集配置 # --------------------------- --dataset.repo_idlocal/my_grab_test \ # 数据集名称 --dataset.num_episodes50 \ # 录制50条Episode --dataset.single_taskPut the paper into the plate \ # 任务描述将纸放到盘子中 --dataset.push_to_hubfalse \ # 不上传到HuggingFace # --------------------------- # Episode参数 # --------------------------- --dataset.episode_time_s30 \ # 每条Episode录制30秒 --dataset.reset_time_s20 # 每条Episode结束后预留20秒复位时间实际运行效果so-101数采三、模型训练输入以下命令训练 ACT 或 smolvla 模型ACT训练 lerobot-train --dataset.repo_id/media/hxg/软件/dobule_sys_win/VLA/S0-101/github/meta-arm/local--pager2plate/put_paper_into_plate_20260712_101847 --policy.typeact --output_diroutputs/train/act_so101_test --job_nameact_test_123 --policy.devicecuda --wandb.enablefalse --policy.push_to_hubfalse --save_freq20000 --batch_size2 --steps30000 smolvla训练 lerobot-train --dataset.repo_id/media/hxg/软件/dobule_sys_win/VLA/S0-101/github/meta-arm/local--pager2plate/put_paper_into_plate_20260712_101847 --policy.typesmolvla --output_diroutputs/train/smolvla_so101_test --job_namesmolvla_test_123 --policy.devicecuda --wandb.enablefalse --policy.push_to_hubfalse --save_freq20000 --batch_size1 --steps30000推理部分明天再添加先更新