LeRobot机械臂教程
本教程已更新至12月15日,可选择跟随最新版官方文档进行操作,官方文档具体教程可以参考本链接。若需要URDF等文件请参考本链接。9月15日旧版本请参考该链接。SO-ARM101与SO-ARM100运行代码相互兼容。
A. 教程说明
Pro版 黑色主动臂使用5V6A电源适配器,白色从动臂使用12V5A电源适配器!
舵机安装和舵机角度校准要提前做好,可参考官方组装教程,本教程不涉及这些内容!
组装教程可参考 Lerobot机械臂组装教程
若未配置好舵机或未组装机械臂,请先按照这个README中的内容操作。它包含了材料清单,以及获取零件的链接,还包括3D打印零件的说明,以及如果您是第一次打印或者没有3D打印机时的建议。
让我们先从安装 LeRobot 环境开始。
B. 环境准备
For Ubuntu X86:
Ubuntu 22.04
CUDA 12+
Python 3.10
Torch 2.6+
For Jetson Orin:
Jetson Jetpack 6.0+
Python 3.10
Torch 2.5.0a0+872d972e41
安装 LeRobot 环境
1. 安装 Miniconda环境:
需要根据你的 CUDA 版本安装 pytorch 和 torchvision 等环境。
- 对于 Jetson:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod +x Miniconda3-latest-Linux-aarch64.sh
bash ~/Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc或者,对于 X86 Ubuntu 22.04:
mkdir -p ~/miniconda3
cd miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
source ~/miniconda3/bin/activate
conda init --all2. 在想要部署的 目录(创建例如:lerobot) 下为 lerobot 创建并激活一个新的 conda 环境:
请不要在 ~/miniconda3目录下创建或者导入lerobot项目
conda create -y -n lerobot python=3.103. 然后激活您的 conda 环境(每次打开终端使用 lerobot 时都需要执行此操作!):
conda activate lerobot4. 克隆 LeRobot:
git clone https://github.com/Juxi-Technology/lerobot.git可选择跟随最新版:https://github.com/huggingface/lerobot.git
注:最新版本的命令代码可能不一致!
5. 在您的环境中安装 ffmpeg:
使用 miniconda 时,在您的环境中安装 ffmpeg:
conda install ffmpeg -c conda-forge这通常会为你的平台安装使用 libsvtav1 编码器编译的 ffmpeg 7.X。如果不支持 libsvtav1(可以通过 ffmpeg \-encoders 查看支持的编码器),你可以:
【适用于所有平台】显式安装 ffmpeg 7.X:
conda install ffmpeg=7\.1\.1 \-c conda\-forge
无图形依赖(gdk-pixbuf、librsvg)用此命令安装:
conda install ffmpeg=7\.1\.1 \-c conda\-forge \-\-no\-deps
【仅限 Linux】安装 ffmpeg 的构建依赖并从源码编译支持 libsvtav1 的 ffmpeg,并确保使用的 ffmpeg 可执行文件是正确的,可以通过 which ffmpeg 确认。
如果你遇到以下报错,也可以使用上述命令解决。
6. 进入lerobot目录下,安装带有 feetech 电机依赖的 LeRobot:
cd ~/lerobot && pip install -e ".[feetech]"对于 Jetson Jetpack 6.0+ 设备(请确保在执行此步骤前按照此链接教程安装了 Pytorch-gpu 和 Torchvision):
conda install -y -c conda-forge "opencv>=4.10.0.84" # 通过 conda 安装 OpenCV 和其他依赖,仅适用于 Jetson Jetpack 6.0+
conda remove opencv # 卸载 OpenCV
pip3 install opencv-python==4.10.0.84 # 使用 pip3 安装指定版本 OpenCV
conda install -y -c conda-forge ffmpeg
conda uninstall numpy
pip3 install numpy==1.26.0 # 该版本需与 torchvision 兼容7. 检查 Pytorch 和 Torchvision
由于通过 pip 安装 lerobot 环境时会卸载原有的 Pytorch 和 Torchvision 并安装 CPU 版本,因此需要在 Python 中进行检查。
import torch
print(torch.cuda.is_available())如果输出结果为 False,需要根据官网教程重新安装 Pytorch 和 Torchvision。
8. intelRealSense深度相机SDK依赖环境安装(若有intelRealSense深度相机)
若需使用RealSense深度摄像头,在lerobot/src/lerobot/下安装pyrealsense2:
pip install pyrealsense2C. 机械臂控制
端口授权
连接好电源线,黑色主动臂使用5V6A电源适配器,白色从动臂使用12V5A电源适配器,舵机驱动板通过数据线连接到主机端
首先进入到lerobot/src/lerobot/目录下
cd ~/lerobot/src/lerobot/然后激活您的 conda 环境(每次打开终端使用 lerobot 时都需要执行此操作!):
conda activate lerobot1. 运行脚本以查找端口
查找机械臂对应的 USB 端口 为了找到每个机械臂正确的端口,请运行实用脚本两次::
lerobot-find-port2. 示例输出
识别Leader机械臂端口时的示例输出(例如,Mac 上为 /dev/tty\.usbmodem575E0031751,或 Linux 上可能为 /dev/ttyACM0):
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/ttyACM1
Reconnect the USB cable.识别Follower机械臂端口时的示例输出(例如,/dev/tty\.usbmodem575E0032081,或在 Linux 上可能为 /dev/ttyACM1):
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/ttyACM0
Reconnect the USB cable.请记住要拔出 USB 接头,否则将无法检测到接口。
3. 疑难解答
在 Linux 上,您需要通过运行以下命令来授予对 USB 端口的访问权限:
sudo chmod 666 /dev/ttyACM0sudo chmod 666 /dev/ttyACM1校准机械臂
接下来,你需要对你的 SO-10x 机器人接上电源和数据线进行校准,以确保在相同的物理位置时,Leader机械臂和 Follower机械臂的位置信息一致。这个校准过程至关重要,因为它可以让在一个 SO-10x 机器人上训练的神经网络在另一个机器人上也能正常工作。如果需要重新校准机械臂,请完全删除\~/\.cache/huggingface/lerobot/calibration/robots或者\~/\.cache/huggingface/lerobot/calibration/teleoperators下的文件并重新校准机械臂,否者会出现报错提示,校准的机械臂信息会存储该目录下的json文件中。
1. Follower机械臂的手动校准
请通过 3 针接口连接 6 个机器人舵机的接口,并将底盘舵机连接到舵机驱动板,然后运行以下命令或 API 示例来校准机械臂:
以PC(linux)和jetson板卡为例,第一个插入usb接口会映射为ttyACM0,第二个插入usb接口会映射为ttyACM1。
在运行代码前请注意leader和follower的映射接口。
2. 接口授权
首先,您需要授予接口权限,运行以下命令:
sudo chmod 666 /dev/ttyACM*3. 然后校准Follower机械臂
接下来,通过运行以下 Python 命令来校准从动臂:
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm首先,您需要将机器人移动到所有关节都位于其 可活动范围中间 的位置 并 保持机械臂不动。然后,按下回车键后,您必须将每个关节在其完整的运动范围内移动,校准文件会记录下可活动范围的中位、最大值和最小值,并保存在\~/\.cache/huggingface/lerobot/calibration/robots或者\~/\.cache/huggingface/lerobot/calibration/teleoperators 目录下json文件中。
4. 校准Leader机械臂
对主机械臂进行校准的步骤与上述相同,请运行以下命令或 API 示例:
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm[机械臂中位校准视频.mp4]
遥感操作
1. 简单遥感****操作
然后,您就可以准备遥操作您的机器人了!运行这个简单的脚本(它不会连接和显示摄像头):
请注意,与机器人关联的 ID 用于存储校准文件。在使用相同设置进行遥控操作、录制和评估时,使用相同的 ID 至关重要。
先对串口给予权限:
sudo chmod 666 /dev/ttyACM*运行遥操作:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm遥控操作命令将自动执行以下步骤:
识别任何缺失的校准文件并启动校准程序。
连接机器人和遥控设备,并开始遥控操作。
2. 带摄像头显示的远程操作
为了实例化摄像头,您需要一个摄像头标识符。这个标识符可能会在您重启电脑或重新插拔摄像头时发生变化,这主要取决于您的操作系统。
要查找连接到您系统的摄像头的摄像头索引,请运行以下脚本:
lerobot-find-cameras realsense # or realsense for Intel Realsense cameras终端会打印相关摄像头信息。
您可以在 \~/lerobot/outputs/captured\_images 目录中找到每台摄像头拍摄的图片。
在 macOS 中使用 Intel RealSense 摄像头时,您可能会遇到 “Error finding RealSense cameras: failed to set power state” 的错误。这可以通过使用 sudo 权限运行相同的命令来解决。请注意,在 macOS 中使用 RealSense 摄像头是不稳定的。
之后,您就可以在遥控操作时在电脑上显示摄像头画面了,只需运行以下代码即可。这对于在录制第一个数据集之前准备您的设置非常有用。
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=truefourcc: \&\#34;MJPG\&\#34;格式图像是经过压缩后的图像,你可以尝试更高分辨率,当然你可以尝试YUYV格式图像,但是这会导致图像的分辨率和FPS降低导致机械臂运行卡顿。目前MJPG格式下可支持3个摄像头1920\*1080分辨率并且保持30FPS, 但是依然不推荐2个摄像头通过同一个USB HUB接入主机
如果您有更多摄像头,可以通过更改 \-\-robot\.cameras 参数来添加。您应该注意index\_or\_path 的格式,它由 python \-m lerobot\.find\_cameras opencv 命令输出的摄像头 ID 的最后一位数字决定。
例如,如果你想添加摄像头:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_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.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true如果你想添加RealSense深度相机,先运行python \-m lerobot\.find\_cameras realsense 获取Id,并将此命令中robot.cameras参数的serial_number_or_name: "323622271780" 替换为自己的深度相机Id,use\_depth: true 启用深度流:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: intelrealsense, serial_number_or_name: "323622271780", width: 1280, height: 720, fps: 30, use_depth: true}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=trueD. 数据采集
记录一个数据集
- 如果你想数据集保存在本地,可以直接运行:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_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.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=juxi/test \
--dataset.num_episodes=5 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.push_to_hub=false \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30其中dateset\.repo\_id和dataset\.single\_task可以自定义修改,push\_to\_hub=false,最后数据集会保存在主目录的\~/\.cache/huggingface/lerobot下会创建上述juxi/test文件夹,若使用RealSense深度相机,可自行修改运行命令
- 如果您想使用 Hugging Face Hub 的功能来上传您的数据集,并且您之前尚未这样做,请确保您已使用具有写入权限的令牌登录,该令牌可以从 Hugging Face 设置 中生成:
hf auth login将您的 Hugging Face 仓库名称存储在一个变量中,以运行以下命令:
hf auth whoami记录 5 个回合并将您的数据集上传到 Hub:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_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.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.push_to_hub=true \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30你会看到类似如下数据:
INFO 2024-08-10 15:02:58 ol_robot.py:219 dt:33.34 (30.0hz) dtRlead: 5.06 (197.5hz) dtWfoll: 0.25 (3963.7hz) dtRfoll: 6.22 (160.7hz) dtRlaptop: 32.57 (30.7hz) dtRphone: 33.84 (29.5hz)参数说明
episode_time_s: 表示每次收集数据的时间。
reset_time_s: 是每次数据收集之间的准备时间。
num_episodes: 表示预期收集多少组数据。
push_to_hub: 决定是否将数据上传到 HuggingFace Hub。
| 按键 | 动作 |
|---|---|
| 右箭头 → | 提前终止当前剧集/重置;进入下一个。 |
| 左箭头 ← | 取消当前剧集;重新录制。 |
| ESC | 立即停止会话,编码视频,并上传数据集。 |
数据收集技巧
任务建议:在不同位置抓取物体并将其放入箱子中。
规模:记录 ≥50 个剧集(每个位置 10 个剧集)。
一致性:
保持摄像头固定。
保持相同的抓取行为。
确保操作的物体在摄像头画面中可见。
逐步推进:
先从可靠的抓取开始,然后再增加变化(新位置、抓取技巧、摄像头调整)。
避免复杂性急剧增加,以防止失败。
💡 经验法则:仅使用摄像头画面作为指导,只根据屏幕反馈的视频图像,来控制机械臂完成任务。
如果你想要深入了解这个重要主题,可以查看我们撰写的关于什么是好的数据集的博客文章。
在接下来的章节中,你将训练你的神经网络。在实现可靠的抓取性能后,你可以在数据收集过程中引入更多变化,例如增加抓取位置、不同的抓取技巧以及改变相机位置。
避免快速添加过多变化,因为这可能会阻碍您的结果。
"如果你希望将数据保存在本地 (
\-\-dataset\.push\_to\_hub=false),请将\-\-dataset\.repo\_id=$\{HF\_USER\}/so101\_test替换为一个自定义的本地文件夹名称,例如\-\-dataset\.repo\_id=juxi/so101\_test。数据将存储在系统主目录下的\~/\.cache/huggingface/lerobot"如果你通过
\-\-dataset\.push\_to\_hub=true将数据集上传到了 Hugging Face Hub,可以通过 在线可视化你的数据集,只需复制粘贴你的 repo id。在回合记录过程中任何时候按下右箭头 → 可提前停止并进入重置状态。重置过程中同样,可提前停止并进入下一个回合记录。
在录制或重置到早期阶段时,随时按左箭头 ← 可提前停止当前剧集,并重新录制。
在录制过程中随时按 ESCAPE ESC 可提前结束会话,直接进入视频编码和数据集上传。
可以通过重新运行相同的命令并添加
\-\-resume=true来恢复录制。⚠️ 重要提示:在恢复时,需将\-\-dataset\.num\_episodes设置为要额外记录的剧集数量(而不是数据集中目标的总剧集数量)。如果要从头开始录制,请手动删除数据集目录。在 Linux 上,如果在数据记录期间左右箭头键和 Esc 键没有效果,请确保您已设置 $DISPLAY 环境变量。参见 pynput 限制。
如果你的键盘按下后没有反应,可能你需要降低你pynput的版本,例如安装个1.6.8版本的。
pip install pynput==1\.6\.8
可视化一个数据集(可跳过,可尝试)
echo ${HF_USER}/so101_test如果您没有使用 \-\-dataset\.push\_to\_hub=false ,并上传了数据,您也可以在本地通过以下命令进行可视化:
lerobot-dataset-viz \
--repo-id ${HF_USER}/so101_test \如果您使用了 \-\-dataset\.push\_to\_hub=false ,没有上传数据,您也可以通过以下命令在本地进行可视化:
lerobot-dataset-viz \
--repo-id juxi/test \这里,juxi 是数据收集时自定义的 repo\_id 名称。
回放一个片段(可跳过,可尝试)
现在,尝试在您的机器人上重播第一个数据集:
lerobot-replay \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.episode=0此时,机械臂应该做出与你遥操记录时一样的动作。
E. 数据集训练及评估
ACT
参考官方教程ACT
训练
要训练一个控制您机器人策略,使用 python \-m lerobot\.scripts\.train 脚本。需要一些参数。以下是一个示例命令:
lerobot-train \
--dataset.repo_id=${HF_USER}/so101_test \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--wandb.enable=false \
--steps=300000如果您想在本地数据集上进行训练,请确保 repo\_id 与数据收集时使用的名称匹配,并添加 \-\-policy\.push\_to\_hub=false。
lerobot-train \
*--dataset.repo_id*=juxi/test \
*--policy.type*=act \
*--output_dir*=outputs/train/act_so101_test \
*--job_name*=act_so101_test \
*--policy.device*=cuda \
*--wandb.enable*=false \
*--policy.push_to_hub*=false\
*--steps*=300000命令解释
数据集指定:我们通过
\-\-dataset\.repo\_id=$\{HF\_USER\}/so101\_test参数提供了数据集。训练步数:我们通过
\-\-steps=300000修改训练步数,算法默认为800000,根据自己的任务难易程度,观察训练时候的loss来进行调整。策略类型:我们使用
policy\.type=act提供了策略,同样你可以更换[act,diffusion,pi0,pi0fast,pi0.5,sac,smolvla]等策略,这将从configuration\_act\.py加载配置。重要的是,这个策略会自动适应您机器人(例如laptop和phone)的电机状态、电机动作和摄像头数量,这些信息已保存在您的数据集中。设备选择:我们提供了
policy\.device=cuda,因为我们正在 Nvidia GPU 上进行训练,但您可以使用policy\.device=mps在 Apple Silicon 上进行训练。可视化工具:我们提供了
wandb\.enable=true来使用 Weights and Biases 可视化训练图表。这是可选的,但如果您使用它,请确保您已通过运行wandb login登录。
如果你遇到了以下报错:
尝试运行以下命令来解决:
pip install datasets==2.19训练可能需要几个小时。您将在 outputs/train/act\_so101\_test/checkpoints 目录中找到训练结果权重文件。
要从某个训练结果权重文件恢复训练,下面是一个从 act\_so101\_test 策略的最后一个训练结果权重文件恢复训练的示例命令:
lerobot-train \
--config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true评估
您可以使用 lerobot/record\.py 中的 record 功能,但需要将策略训练结果训练结果权重文件作为输入。例如,运行以下命令记录 10 个评估回合:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--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"}}" \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=5 \
--policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
--dataset.push_to_hub=false\-\-policy\.path参数,指示您的策略训练结果权重文件的路径(例如outputs/train/act\_so101\_test/checkpoints/last/pretrained\_model)。如果您将模型训练结果权重文件上传到 Hub,也可以使用模型仓库(例如$\{HF\_USER\}/act\_so101\_test)。数据集的名称
dataset\.repo\_id以eval\_开头,这个操作会在你评估的时候为你单独录制评估时候的视频和数据,将保存在eval_开头的文件夹下,例如juxi/eval\_test123。如果评估阶段遇到
File exists: \&\#39;home/xxxx/\.cache/huggingface/lerobot/xxxxx/juxi/eval\_xxxx\&\#39;请先删除eval\_开头的这个文件夹再次运行程序。当遇到
mean is infinity\. You should either initialize with stats as an argument or use a pretrained model请注意\-\-robot\.cameras这个参数中的front和side等关键词必须和采集数据集的时候保持严格一致。
Smolvla
参考官方教程SmolVLA
pip install -e ".[smolvla]"训练
lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=${HF_USER}/mydataset \
--batch_size=64 \
--steps=20000 \
--output_dir=outputs/train/my_smolvla \
--job_name=my_smolvla_training \
--policy.device=cuda \
--wandb.enable=true验证
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \ # <- Use your robot id
--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"}}" \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.repo_id=juxi/eval_test123 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=5 \
# <- Teleop optional if you want to teleoperate in between episodes \
# --teleop.type=so101_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_awesome_leader_arm \
--policy.path=HF_USER/FINETUNE_MODEL_NAME # <- Use your fine-tuned modelPi0
参考官方教程Pi0
pip install -e ".[pi]"训练
lerobot-train \
--policy.type=pi0 \
--dataset.repo_id=juxi/eval_test123 \
--job_name=pi0_training \
--output_dir=outputs/pi0_training \
--policy.pretrained_path=lerobot/pi0_base \
--policy.compile_model=true \
--policy.gradient_checkpointing=true \
--policy.dtype=bfloat16 \
--steps=20000 \
--policy.device=cuda \
--batch_size=32 \
--wandb.enable=false验证
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--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"}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--policy.path=outputs/pi0_training/checkpoints/last/pretrained_modelPi0.5
参考官方教程Pi0.5
pip install -e ".[pi]"训练
lerobot-train \
--dataset.repo_id=juxi/eval_test123 \
--policy.type=pi05 \
--output_dir=outputs/pi05_training \
--job_name=pi05_training \
--policy.pretrained_path=lerobot/pi05_base \
--policy.compile_model=true \
--policy.gradient_checkpointing=true \
--wandb.enable=false \
--policy.dtype=bfloat16 \
--steps=3000 \
--policy.device=cuda \
--batch_size=32验证
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--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"}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--policy.path=outputs/pi05_training/checkpoints/last/pretrained_modelGR00T N1.5
请参考官方教程GR00T N1.5
F.云服务器训练部署及模型导出
以 AutoDL算力云 为例,www.autodl.com,注册登录充值余额
1.点击“算力市场”,选择需要的显卡,尽量选多核心
2.选择“按量计费”,基础镜像选择“Miniconda/conda3/3.8(ubuntu20.04)/11.8”,点击“立即创建”
3.点击“JupyterLab”进入控制界面,打开终端
4.初始化conda环境
conda env listconda activate baseconda init5.关闭此终端,打开新的终端,配置学术资源加速
参考https://www.autodl.com/docs/network_turbo/
source /etc/network_turbo6.创建lerobot环境
conda create -y -n lerobot python=3.10conda activate lerobotgit clone https://github.com/JuxiTechnology/lerobot.git可选择跟随最新版:https://github.com/huggingface/lerobot.git
注:最新版本的命令代码可能不一致!
conda install ffmpeg -c conda-forge7.进入src目录下的lerobot,安装带有 feetech 电机依赖的 LeRobot:
cd ~/lerobot && pip install -e ".[feetech]"8.数据集导入到云服务器里
分为两种情况,一种是数据采集 时已上传数据集到huggingface数据库里,一种是未上传数据集到huggingface数据库里,通过FileZilla上传本地数据集到云服务器里。
①若 数据采集 时已上传数据集到huggingface数据库里,可通过配置huggingface数据库得到的key获取
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credentialHF_USER=$(huggingface-cli whoami | head -n 1)echo $HF_USERexport HYDRA_FULL_ERROR=1②通过FileZilla上传本地数据集,参考https://www.autodl.com/docs/filezilla/
Linux最简单的安装方式:
sudo apt install filezillafilezilla打开filezilla,点击“文件”选择“站点管理器”,创建“新站点”,选择“SFTP协议”
返回AutoDL算力云复制“登录指令”并粘贴到方便查看的地方,将对应信息复制粘贴进去,点击“连接”
在云服务器的lerobot目录下 创建 data 文件夹
将数据集文件夹 拉到 右边 进行传输,等待传输完成
9.数据集训练
参考本教程的 E.数据集训练及评估,在云服务器中运行训练命令
10.模型文件导出
训练完成后,将对应train目录下的训练模型导出
G. 常见问题
如果使用本文档教程,请git clone本文档推荐的github仓库https://github.com/JuxiTechnology/lerobot.git
本文档推荐的仓库是验证过后的稳定版本,Lerobot官方仓库是实时更新的最新版本,会出现一些无法预知的问题,例如数据集版本不同,指令不同等。
在Jetson设备中,运行评估命令后未设置回合数和回合时间只能通过ctrl+z中断进程会导致机械臂和相机断连,重连后所有端口都改变
在命令中加入评估的回合数和回合时长的参数
如:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--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"}}" \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=5 \
--policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
--dataset.push_to_hub=false- 如果校准舵机ID时候遇到
`Motor ‘gripper’ was not found, Make sure it is connected`请仔细检查通讯线是否与舵机连接正常,电源是否正确电压供电。”
- 如果遇到
Could not connect on port "/dev/ttyACM0"并且通过ls /dev/ttyACM\*看到是有ACM0存在的,则是忘记给串口权限了,终端输入sudo chmod 666 /dev/ttyACM\* 即可
- 如果遇到
No valid stream found in input file. Is -1 of the desired media type?请安装ffmpeg7.1.1,conda install ffmpeg=7\.1\.1 \-c conda\-forge。
- 如果遇到
ConnectionError: Failed to sync read 'Present_Position' on ids=[1,2,3,4,5,6] after 1 tries. [TxRxResult] There is no status packet!需要检查对应端口号的机械臂是否接通电源,总线舵机是否出现数据线松动或者脱落,哪个舵机灯不亮就是前面那个舵机的线松了。
- 如果校准机械臂的时候遇到
Magnitude 30841 exceeds 2047 (max for sign_bit_index=11)对机械臂进行重新断电和上电,再次尝试校准机械臂加准,如果在校准过程中遇到MAX角度达到上万的值也可以使用这个方法,如果不行则需要对相应舵机进行重新舵机校准,即中位校准和ID写入。
- 如果评估阶段遇到
File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/juxi/eval_xxxx'请先删除eval\_开头的这个文件夹再次运行程序。
- 如果评估阶段遇到
`mean` is infinity. You should either initialize with `stats` as an argument or use a pretrained model请注意--robot.cameras这个参数中的front和side等关键词必须和采集数据集的时候保持严格一致。
如果你维修或者更换过机械臂零件,请完全删除
\~/\.cache/huggingface/lerobot/calibration/robots或者\~/\.cache/huggingface/lerobot/calibration/teleoperators下的文件并重新校准机械臂,否者会出现报错提示,校准的机械臂信息会存储该目录下的json文件中。在3060的8G笔记本上训练ACT的50组数据的时间大概为6小时,在4090和A100的电脑上训练50组数据时间大概为2~3小时。
数据采集过程中要确保摄像头位置和角度和环境光线的稳定,并且减少摄像头采集到过多的不稳定背景和行人,否则部署的环境变化过大会导致机械臂无法正常抓取。
数据采集命令的num-episodes要确保采集数据足够,不可中途手动暂停,因为在数据采集结束后才会计算数据的均值和方差,这在训练中是必要的数据。
如果程序提示无法读取USB摄像头图像数据,请确保USB摄像头不是接在Hub上的,USB摄像头必须直接接入设备,确保图像传输速率快。
如果你遇到无法解决的软件问题或环境依赖问题,除了查看本教程末尾的常见问题 部分外,请及时在 LeRobot 平台 或 LeRobot Discord 频道 反馈问题。
Windows查找舵机(飞特舵机上位机调试软件)
为了进行调试,任何 Windows PC 都可以通过 USB 连接来对舵机进行编程、调试或测试。为此,请下载Feetech 软件。对于 Ubuntu 系统,您可以使用FT_SCServo_Debug_Qt 工具。
[fddebug-master.zip]
选择端口号,波特率选1000000,打开,并点击“搜索”
ROS2 仿真控制(可自行实现)
https://github.com/holmsslk/so-arm-moveit-hardware
网页端设置舵机ID和中位校准
https://bambot.org/feetech.js?lang=zh
1、根据舵机型号输入0或1,点击“连接”
2、扫描ID 1~6 的舵机,可以根据扫描结果里的FOUND确认对应ID舵机。例如图片里舵机 ID 1 被扫描到了
3、ID设置和中位校准
①当前舵机ID输入为被扫描到的舵机ID
②在“ID管理”中输入数字,点击“更改ID”即可设置ID
③中位校准(STS3215舵机中位是2047,SCS0009舵机中位是511)
STS舵机:在“位置控制”输入2047,并点击“Set”
SCS舵机:在“位置控制”输入511,并点击“Set”
