购买了成品机械臂,只需要自己标定就可以了
1. 配置arm步骤
装好lerobot环境之后:
pip install -e ".[feetech]"
1.1 查找每个机械臂对应的 USB 端口
要确认每个总线舵机适配器对应的端口,请将 MotorBus 通过 USB 接入电脑并上电。运行下面的脚本,在提示时再断开 MotorBus:
python -m lerobot.find_port
主臂/dev/ttyACM0
从臂/dev/ttyACM1
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
1.2 标定
这个标定文件是存储在电脑的环境中所以即便官方已经做了测试,但还需要自己标定一次。
接下来,你需要对机器人进行校准,以确保领导臂(leader arm)和跟随臂(follower arm)在相同物理位置时具有相同的位置值。校准过程非常重要,因为它允许在一个机器人上训练的神经网络能够在另一个机器人上运行。
注意!标定时要把所有关节都运动到极限,否则会出问题!!
如果两机械臂标定关节移动/转动范围不匹配,会导致主臂夹爪稍微打开,从臂夹爪就完全打开了。
follower
运行以下命令或 API 示例来校准跟随器机械臂:
python -m lerobot.calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=strawberry_follower_arm
(lerobot) strawberry@strawberry-E500-G9-WS760T:~/zzy/project/lerobot$ python -m lerobot.calibrate --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=strawberry_follower_arm
INFO 2025-07-21 19:41:00 calibrate.py:73 {'robot': {'calibration_dir': None,
'cameras': {},
'disable_torque_on_disconnect': True,
'id': 'strawberry_follower_arm',
'max_relative_target': None,
'port': '/dev/ttyACM0',
'use_degrees': False},
'teleop': None}
INFO 2025-07-21 19:41:00 follower.py:101 strawberry_follower_arm SO101Follower connected.
INFO 2025-07-21 19:41:00 follower.py:108
Running calibration of strawberry_follower_arm SO101Follower
Move strawberry_follower_arm SO101Follower to the middle of its range of motion and press ENTER....
Move all joints sequentially through their entire ranges of motion.
Recording positions. Press ENTER to stop...
-------------------------------------------
-------------------------------------------
NAME | MIN | POS | MAX
shoulder_pan | 1687 | 2032 | 2088
shoulder_lift | 859 | 864 | 2190
elbow_flex | 1927 | 3077 | 3081
wrist_flex | 2034 | 2990 | 2990
wrist_roll | 1117 | 1130 | 2047
gripper | 2037 | 2043 | 2362
Calibration saved to /home/strawberry/.cache/huggingface/lerobot/calibration/robots/so101_follower/strawberry_follower_arm.json
INFO 2025-07-21 19:43:03 follower.py:210 strawberry_follower_arm SO101Follower disconnected.
首先,你需要将机器人移动到所有关节处于其运动范围中间的位置。然后,按下 Enter 后,你需要将每个关节移动到其完整的运动范围内。
leader
python -m lerobot.calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=strawberry_leader_arm
(lerobot) strawberry@strawberry-E500-G9-WS760T:~/zzy/project/lerobot$ python -m lerobot.calibrate --teleop.type=so101_leader --teleop.port=/dev/ttyACM1 --teleop.id=strawberry_leader_arm
INFO 2025-07-21 19:49:18 calibrate.py:73 {'robot': None,
'teleop': {'calibration_dir': None,
'id': 'strawberry_leader_arm',
'port': '/dev/ttyACM1',
'use_degrees': False}}
INFO 2025-07-21 19:49:18 01_leader.py:79 strawberry_leader_arm SO101Leader connected.
INFO 2025-07-21 19:49:18 01_leader.py:86
Running calibration of strawberry_leader_arm SO101Leader
Move strawberry_leader_arm SO101Leader to the middle of its range of motion and press ENTER....
Move all joints sequentially through their entire ranges of motion.
Recording positions. Press ENTER to stop...
-------------------------------------------
-------------------------------------------
NAME | MIN | POS | MAX
shoulder_pan | 2045 | 2073 | 2079
shoulder_lift | 875 | 885 | 2056
elbow_flex | 2045 | 3093 | 3098
wrist_flex | 1352 | 2856 | 2858
wrist_roll | 932 | 1419 | 2230
gripper | 2031 | 2047 | 2763
Calibration saved to /home/strawberry/.cache/huggingface/lerobot/calibration/teleoperators/so101_leader/strawberry_leader_arm.json
INFO 2025-07-21 19:50:22 1_leader.py:143 strawberry_leader_arm SO101Leader disconnected.
2. 开始使用真实机器人
本教程将解释如何训练一个神经网络来自主控制一个真实的机器人。
你将学习:
-
如何记录和可视化你的数据集。
-
如何使用你的数据训练策略并为评估做准备。
-
如何评估你的策略并可视化结果。
通过遵循这些步骤,你将能够复制任务,如捡起乐高积木并将其放入箱子中,并达到高成功率。
本教程并不专门针对某一特定机器人:我们将带你了解可以适配任何支持平台的命令和 API 代码片段。
在数据收集过程中,你将使用“遥操作”设备,如主臂或键盘,来遥控机器人并记录其运动轨迹。
一旦你收集到足够的轨迹数据,你将训练一个神经网络来模仿这些轨迹,并部署训练好的模型,使你的机器人能够自主执行任务。
2.1 远程操作(Teleoperate)
在此示例中,我们将演示如何对 SO101 机器人进行遥操作。对于每一条命令,我们也提供了对应的 API 示例。
注意: 机器人所关联的 id 会用于存储其标定文件。在使用同一套硬件配置进行遥操作、数据记录和评估时,请务必保持使用相同的 id。
python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=strawberry_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=strawberry_leader_arm
遥操作命令将自动执行以下操作:
-
识别任何缺失的标定并启动标定程序。
-
连接机器人和遥操作设备并开始遥操作。
疑问:每次断开usb和电源之后都要查找端口,给权限,标定吗?标定貌似不用,其他的好像要,可以做个实验。
2.2 相机
LeRobot 提供多种视频捕捉选项,包括手机相机、内置笔记本电脑相机、外接网络摄像头和 Intel RealSense 相机。为了高效地从大多数相机录制帧,你可以使用 OpenCVCamera 或 RealSenseCamera 类。
查找相机
要实例化一个相机,你需要一个相机标识符。这个标识符可能会发生变化,特别是在重新启动计算机或重新插拔相机后,这种行为主要依赖于你的操作系统。
要查找系统中连接的相机的索引,可以运行以下脚本:
python -m lerobot.find_cameras opencv
lerobot.find_cameras opencv
--- Detected Cameras ---
Camera #0:
Name: OpenCV Camera @ /dev/video0
Type: OpenCV
Id: /dev/video0
Backend api: V4L2
Default stream profile:
Format: 0.0
Width: 640
Height: 480
Fps: 30.0
--------------------Finalizing image saving...
Image capture finished. Images saved to outputs/captured_images
如果你想在 Linux 上使用手机作为相机,请按照以下步骤设置虚拟相机:
1. 安装 v4l2loopback-dkms 和 v4l-utils
这两个软件包是创建虚拟相机设备(v4l2loopback)和使用 v4l2-ctl 工具验证其设置所必需的。使用以下命令安装:
2.在手机上安装 DroidCam
该应用程序适用于 iOS 和 Android 系统。
3.安装 OBS Studio
这款软件将帮助你管理相机视频流。使用 Flatpak 安装:
flatpak install flathub com.obsproject.Studio
4.安装 DroidCam OBS 插件
该插件将 DroidCam 与 OBS Studio 集成。使用以下命令安装:
flatpak install flathub com.obsproject.Studio.Plugin.DroidCam
5. 启动 OBS Studio
使用以下命令启动:
flatpak run com.obsproject.Studio
6. 将手机添加为源
按照这里的说明进行操作,确保将分辨率设置为 640x480。
7. 调整分辨率设置
在 OBS Studio 中,转到 文件 > 设置 > 视频,手动将 基础(画布)分辨率 和 输出(缩放)分辨率 设置为 640x480。
8. 启动虚拟相机
在 OBS Studio 中,按照这里的说明启动虚拟相机。
9. 验证虚拟相机设置
使用 v4l2-ctl
列出设备:
v4l2-ctl --list-devices
You should see an entry like:
VirtualCam (platform:v4l2loopback-000): /dev/video1
10. 检查相机分辨率
使用 v4l2-ctl
确保虚拟相机的输出分辨率为 640x480。将 /dev/video1
替换为从 v4l2-ctl --list-devices
输出中获得的虚拟相机端口。
v4l2-ctl -d /dev/video1 --get-fmt-video
你应该看到类似以下的条目:
>> Format Video Capture:
>> Width/Height : 640/480
>> Pixel Format : 'YUYV' (YUYV 4:2:2)
2.3 使用相机进行遥操作
通过 rerun,你可以在遥操作的同时,同时可视化相机视频流和关节位置。
python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=strawberry_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=strawberry_leader_arm \
--display_data=true
但是延迟有200ms,抖动非常严重,也有桌子的原因,导致容易接触不稳而断开连接。
如果摄像头不清楚,需要拧一拧。
---抖动剧烈原因有待排查
3. 记录数据
一旦你熟悉了遥操作,你就可以开始记录你的第一个数据集。
我们使用 Hugging Face Hub 的功能来上传数据集。如果你之前没有使用过 Hugging Face Hub,请确保能够通过命令行界面(CLI)登录,并使用一个具有写入权限的令牌。你可以通过 Hugging Face 设置页面生成这个令牌。
通过以下命令将你的令牌添加到 CLI 中:
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
然后,你将被提示输入你的令牌。只需粘贴令牌并按回车即可。
一旦成功登录,你就可以开始记录数据集,并将其上传到 Hugging Face Hub 中。
添加到环境变量:
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER
现在,你可以记录数据集。要记录 2 个回合并将你的数据集上传到 Hugging Face 仓库,执行以下命令,针对 SO101 定制:
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=strawberry_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=strawberry_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=2 \
--dataset.single_task="Grab the box and place in bowl"
也可以用不带摄像头的遥操:
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=strawberry_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=strawberry_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test1 \
--dataset.num_episodes=2 \
--dataset.single_task="Grab the box and place in bowl"
记录完一个数据之后,按键盘右箭头,然后显示需要reset环境,我们重置环境后,再按右箭头记录下一个数据,结束之后再按右箭头。
3.1 数据集上传
在本地,您的数据集存储在这个文件夹中:~/.cache/huggingface/lerobot/{repo-id}
。数据记录结束后,您的数据集将上传到您的 Hugging Face 页面(例如:https://huggingface.co/datasets/cadene/so101_test)。您可以通过运行以下命令来获取链接:
echo https://huggingface.co/datasets/${HF_USER}/so101_test
您的数据集将自动标记为 LeRobot,方便社区成员轻松找到它,您还可以添加自定义标签
您可以通过搜索 LeRobot 标签,在 Hugging Face Hub 上查找其他 LeRobot 数据集。
点击Huggingface然后按提示上传数据集就可以,可以直接拖文件夹还是挺方便的。
不能直接上传record-test1文件夹,否则后续会找不到meta
3.2 record函数
record
函数提供了一整套工具,用于在机器人操作过程中捕获和管理数据:
1. 数据存储
数据使用 LeRobotDataset 格式存储,并在录制期间保存在磁盘上。
默认情况下,数据集会在录制结束后上传到您的 Hugging Face 页面。
-
如果要禁用上传功能,可以使用
--dataset.push_to_hub=False
。
2. 检查点和恢复
录制过程中会自动创建检查点。
-
如果发生问题,您可以通过重新运行相同的命令并使用
--control.resume=true
来恢复。 -
如果要从头开始录制,可以手动删除数据集目录。
3. 录制参数
使用命令行参数设置数据录制的流程:
-
--dataset.episode_time_s=60
每个数据录制回合的时长(默认:60秒)。 -
--dataset.reset_time_s=60
每个回合结束后重置环境的时长(默认:60秒)。 -
--dataset.num_episodes=50
总共要录制的回合数(默认:50)。
4. 录制期间的键盘控制
使用键盘快捷键控制数据录制流程:
-
右箭头(→):提前结束当前回合或重置时间并开始下一个回合。
-
左箭头(←):取消当前回合并重新录制。
-
Esc(ESC):立即停止会话、编码视频并上传数据集。
数据采集小贴士
一旦您熟悉了数据录制流程,可以创建更大的数据集用于训练。一个好的起点任务是抓取一个物体并将其放入箱子中,您可以通过以下方式开始:
-
建议至少录制 50 个回合,每个位置 10 个回合。保持相机固定并保持一致的抓取行为。
-
确保您操作的物体在相机画面中可见。一个好的经验法则是,您应该只看相机画面就能够完成任务。
接下来的步骤是训练您的神经网络。通过稳定的抓取表现后,您可以开始在数据采集时引入更多变化,例如额外的抓取位置、不同的抓取技术和改变相机位置。
避免过快地加入太多变化,因为这可能会影响您的结果。
如果您希望深入了解这个重要话题,可以查看我们写的关于什么样的数据集是好数据集的博客文章。
故障排除:
-
在 Linux 系统上,如果在数据录制期间左右箭头键和 ESC 键没有任何效果,请确保您已设置
$DISPLAY
环境变量。详情请见pynput
限制。
3.3 可视化数据集
如果您使用 --control.push_to_hub=true
将数据集上传到 Hugging Face Hub,您可以通过复制并粘贴由系统提供的仓库 ID 来在线查看您的数据集。
echo ${HF_USER}/so101-test
但是为什么不播放呢?是因为没有视频。
3.4 回放动作回合
一个有用的功能是重放功能,它允许你重放任何已录制的回合,或者来自任何数据集的回合。这个功能帮助你测试机器人动作的可重复性,并评估同型号机器人之间的可迁移性。
你可以使用以下命令在机器人上重放第一个回合:
python -m lerobot.replay \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=strawberry_follower_arm \
--dataset.repo_id=${HF_USER}/record-test1 \
--dataset.episode=0
遇到了一个问题:说是我的仓库没有version,于时我建立了一个py文件并运行
from huggingface_hub import HfApi
hub_api = HfApi()
hub_api.create_tag("wantobcm/record-test1", tag="_version_", repo_type="dataset")
然后就可以回放数据了
4. 训练策略
4.1 开始训练
要训练一个策略来控制你的机器人,可以使用 python lerobot/scripts/train.py
脚本。需要提供一些参数。以下是一个示例命令:
python src/lerobot/scripts/train.py \
--dataset.repo_id=wantobcm/youliangtan_so101_strawberry_grape \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--policy.repo_id=wantobcm/act-youliangtan-so101-strawberry-grape \
--wandb.enable=true
让我们解释一下这个命令:
-
数据集:我们通过
--dataset.repo_id=${HF_USER}/so101_test
提供了数据集作为参数。 -
策略:我们通过
policy.type=act
提供了策略类型,这会加载来自configuration_act.py
的配置。重要的是,这个策略将自动适应你机器人(例如笔记本电脑和手机)的电机状态、动作和相机的数量,这些信息已保存在你的数据集中。 -
设备:我们通过
policy.device=cuda
指定了在 Nvidia GPU 上进行训练,但你也可以使用policy.device=mps
在 Apple silicon 上训练。 -
Weights and Biases:我们通过
wandb.enable=true
启用了 Weights and Biases 用于可视化训练图表。这是可选的,但如果你使用它,确保先登录,使用命令wandb login
。
训练过程应该需要几个小时。你将在 outputs/train/act_so101_test/checkpoints
文件夹中找到检查点。
执行过程:
别人的这个数据集要下载到.cache里wantobcm对应文件夹里。
从检查点恢复训练:
以下是一个从 act_so101_test
策略的最后一个检查点恢复训练的示例命令:
python lerobot/scripts/train.py \
--config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true
4.2 上传策略检查点
一旦训练完成,你可以使用以下命令上传最新的检查点:
huggingface-cli upload ${HF_USER}/act_so101_test \
outputs/train/act_so101_test/checkpoints/last/pretrained_model
你也可以上传中间的检查点,使用以下命令:
CKPT=010000
huggingface-cli upload ${HF_USER}/act_so101_test${CKPT} \
outputs/train/act_so101_test/checkpoints/${CKPT}/pretrained_model
4.3 评估你的策略
你可以使用 lerobot/record.py
中的录制脚本,但这次需要将策略检查点作为输入。例如,运行以下命令来录制 10 个评估回合:
python -m lerobot.record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM1 \
--robot.cameras="{ up: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30}, side: {type: intelrealsense, serial_number_or_name: 233522074606, width: 640, height: 480, fps: 30}}" \
--robot.id=strawberry_arm \
--display_data=false \
--dataset.repo_id=$HF_USER/eval_so100 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=${HF_USER}/my_policy
正如你所见,这个命令几乎和之前用来录制训练数据集的命令一样。两个主要变化是:
-
增加了
--control.policy.path
参数,它指示了策略检查点的路径(例如:outputs/train/eval_act_so101_test/checkpoints/last/pretrained_model
)。如果你已经将模型检查点上传到 Hugging Face 仓库,也可以使用仓库路径(例如:${HF_USER}/act_so101_test
)。 -
数据集的名称以
eval
开头,以表示你正在运行推理(例如:${HF_USER}/eval_act_so101_test
)。