d
搭建SO-ARM101机械臂,从代码控制迈向模型控制
Ember
### 物料清单
| 物料准备 | 数量 | 备注 |
| --- | --- | --- |
| 飞特C001舵机 | 1个 | 仅用于主臂第2号关节 |
| 飞特C044舵机 | 2个 | 用于主臂第1号和第3号关节 |
| 飞特C046舵机 | 3个 | 用于主臂第4号、第5号关节及第6号夹爪 |
| 飞特C047舵机 | 6个 | 适用于从臂所有关节 |
| 舵机驱动板 | 2个 | 没有区别主从均可使用 |
| USB-C线缆 | 2条 | 确保有数据传输功能 |
| 电源适配器 | 2个 | 5.5 mm×2.1 mm DC 12 V 2 A(从臂Follower) 5.5 mm×2.1 mm DC 5 V 4 A(主臂Leader) |
| USB摄像头 | 2个 | 建议使用1米左右的信号线 |
| 手臂的3D打印部件 | 1套 | 可选择购买、代打或自行打印(看打印清单) |
| 3D打印桌面夹具 | 4个 | 可选择购买、代打或自行打印(看打印清单) |
### 工具清单
| 设备工具 | 数量 | 备注 |
| --- | --- | --- |
| 电脑 | 1台 | 电脑的操作系统建议为Ubuntu X86,电脑USB-A口越多越好 |
| 螺丝刀套装 | 一套 | 用着舒服的就行 |
| 插线板 | 2个 | 插线板插槽越多越好 |
| 拓展坞 | 1个 | 需要USB-A口多的,注意要拓展坞不要集线器 |
### 打印清单
如果身边刚好有一台打印机的话,可以使用以下链接,下载对应模型,自行打印物料。
| 3D模型文件 | 模型下载链接 |
| --- | --- |
| SO-ARM101 | [SO-ARM101模型文件-Github](https://github.com/TheRobotStudio/SO-ARM100/tree/main/STL/SO101) |
| 可活动夹具 | [可活动固定夹具](https://makerworld.com.cn/zh/models/1937099-qiang-li-jia-ju-yi-yu-da-yin-20chong-chi-cun?from=search#profileId-2190630) |
### 必看说明
1. 关于电脑和操作系统
理论上来说,Lerobot环境可以在`Windows10/11`、`Linux` 和 `Mac` 上运行。如果想在本地跑采集本地跑模型,那么可稳定运行的环境建议为`Ubuntu22.04LST`且为台式机。以下是一些参考,但不绝对。
| 配置项 | 基础使用 (连接与操控) | 进阶使用 (本地 AI 训练) |
| --- | --- | --- |
| 操作系统 | Windows, macOS, Linux | Ubuntu 22.04+ |
| CPU | 无特殊要求 | 6核以上,推荐8核 |
| 内存 | 无特殊要求 | 16GB以上,推荐32GB |
| 显卡 (GPU) | 无需独立显卡 | 必需 NVIDIA 独显,显存 8GB 以上 |
| 硬盘 | 无特殊要求 | 1TB 以上,推荐 NVMe 固态硬盘 |
| USB 接口 | 一个空闲的 USB 端口 | 4到6个,或准备一个 USB 扩展坞 |
### Lerobot
LeRobot是一个面向现实世界机器人应用的学习框架,旨在降低机器人技术的入门门槛,让研究者和开发者能够快速使用预训练模型和共享数据集进行机器人学习 。它不仅提供算法实现,还集成了数据集管理、仿真环境接口和物理机器人控制模块,形成完整的端到端训练与部署流程。
要让`SO-ARM101`动起来的话,首先要在电脑上配置好`lerobot`环境。那么请按照下列命令来安装`lerobot`。所有的命令都是在终端上运行的,所以可以先熟悉熟悉命令行终端。
### 初始化环境
```shell
For Ubuntu X86
1.Ubuntu 22.04
2.CUDA 12+
3.Python 3.12
4.Torch 2.6
```
这里需要保证的只有 `Ubuntu 22.04` 这个 `Linux` 操作系统,其他的只是之后会涉及到的,电脑是否有显卡对机械臂的遥操作和数据集收集没有很大的影响,但最好还是要有。
Ubuntu这个系统优先推荐安装在台式物理机,次之为台式虚拟机,再次为笔记本物理机,再再次为笔记本虚拟机,最次为WSL(如果对这个特别熟悉的话,可以一试,它的配置特别麻烦,主要体现在USB透传上),其他操作系统也是这个排序。
### 搭建环境(Ubuntu 22.04)
1、安装 `Miniforge`:\
一条命令一条命令复制到终端上运行,下述所有命令行命令都是一样的
```shell
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
chmod +x Miniforge3-Linux-x86_64.sh
./Miniforge3-Linux-x86_64.sh
# 按照提示安装完成后:
source ~/.bashrc
# 初始化所有 shell
conda init --all
```
如果下载命令太慢的话可以去镜像站下载`Miniforge3-Linux-x86_64.sh`如:\
[清华源-Miniforge3-Linux-x86_64.sh](https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/Release%2026.5.3-0/Miniforge3-Linux-x86_64.sh)通过这种方式下载的文件一般位于 Download(下载)目录下,可以在当前目录下参考上述安装。
2、创建并激活一个新的 `conda` 环境用于 `lerobot`:
```shell
conda create -y -n lerobot python=3.12 && conda activate lerobot
```
3、克隆 `LeRobot` 仓库:(这里需要git,教程:[Git教程 - 廖雪峰](https://liaoxuefeng.com/books/git/introduction/index.html))
```shell
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
# clone 速率差的话可以使用以下加速源
# git clone https://gitclone.com/github.com/Seeed-Projects/lerobot.git
# git clone https://wget.la/https://github.com/Seeed-Projects/lerobot.git
# git clone https://hk.gh-proxy.org/https://github.com/Seeed-Projects/lerobot.git
# git clone https://ghfast.top/https://github.com/Seeed-Projects/lerobot.git
# git clone https://githubfast.com/Seeed-Projects/lerobot.git
```
4、使用 `miniforge` 时,在环境中安装 `ffmpeg`:
```shell
conda install ffmpeg -c conda-forge
```
> 4.5、如果你使用的是新配置的 `Ubuntu 22.04` 的机器,尤其是最小化安装版本,系统可能默认不带 `gcc` 等 `C` 编译工具。此时在安装带有 `feetech` 电机依赖的 `LeRobot` 时,`evdev` `Python` 包可能会因为缺少`C`编译器而构建失败。\
> 可以先安装基本编译工具:
>
> ```bash
> sudo apt update
> sudo apt install build-essential
> ```
5、安装带有 `feetech` 电机依赖的 `LeRobot`:
```bash
cd ~/lerobot
pip install -e ".[feetech]"
# 如果安装太慢的话可以使用临时镜像源加速
# pip install -e ".[feetech]" -i https://pypi.tuna.tsinghua.edu.cn/simple
```
6、检查 `PyTorch` 和 `Torchvision`:
由于通过 pip 安装 lerobot 环境时会卸载原有的 PyTorch 和 Torchvision 并安装 CPU 版本,因此需要在 Python 中进行检查。
```python
python
import torch
print(torch.cuda.is_available())
exit() # 退出python
```
如果输出结果显示为 `False`,表示当前环境中的 PyTorch 是 CPU 版本。若你需要使用 GPU 进行训练或推理,请根据[官网教程](https://pytorch.org/index.html)安装与你的 CUDA 版本匹配的 PyTorch 和 Torchvision。对于装有 NVIDIA GPU 并需要使用 GPU 的环境,最终检查结果应为 `True`。
> 6.5 NVIDIA 的 RTX 50 系列显卡需要安装 CUDA 12.8 及以上版本的预览版
>
> ```Shell
> pip install --pre torch Torchvision torchaudio --index-url https://download.PyTorch.org/whl/nightly/cu128
> ```
7、验证:
正常安装成功之后可以先输入`lerobot`,然后快速点几下`Tab`键,命令行就会跳出如下匹配上的`CLI`命令即代表安装成功。
```Shell
ember@Ember:~$ lerobot
lerobot-annotate lerobot-find-cameras lerobot-record
lerobot-teleoperate lerobot-calibrate lerobot-find-joint-limits
lerobot-replay lerobot-train-tokenizer lerobot-dataset-viz
lerobot-find-port lerobot-rollout lerobot-train
lerobot-edit-dataset lerobot-imgtransform-viz lerobot-setup-can
lerobot-eval lerobot-info lerobot-setup-motors
```
8、其他:
在这里,我们所使用的是conda隔离环境,因此有一些命令会日常用到,这里我记录几个,也辅助自己记忆。这里的1、2、3、4······等等不是一定要做的步骤,只是一个标识,后方有简易流程。如果要深入学习,请移步互联网。
```bash
1. 查看所有环境
conda env list
# 等价
conda info --envs
2. 进入 / 激活环境
# 进入lerobot环境
conda activate lerobot
# 进入默认base环境
conda activate base
3. 退出当前环境
conda deactivate
执行后提示符前 (xxx) 消失,脱离所有 conda 环境。
4. 切换环境(不用先退出,直接切)
比如当前在 base,直接切 lerobot:
conda activate lerobot
conda 会自动关闭上一个环境,无需手动deactivate。
5. 新建环境(示例)
conda create -n 环境名(如larobot) python=3.10
6. 删除无用环境(谨慎)
conda remove -n 环境名 --all
极简流程示例
# 1. 查看有哪些环境
conda env list
# 2. 进入项目环境
conda activate lerobot
# 3. 用完退出
conda deactivate
# 4. 想切回base
conda activate base
```
### 说明
这里会有一个小问题,`Ubuntu22.04` 的 `ttyUSB`、`ttyACM` 端口可能会被一个 `brltty` 服务抢占端口,这个时候直接删掉即可。[Ubuntu22.04(无法访问 /dev/ttyUSB /dev/ttyACM: 没有那个文件或目录)问题解决](https://blog.csdn.net/weixin_49513223/article/details/127068065)
- `sudo dmesg | grep brltty`
- 若果出现`[ 7033.078452] usb 1-13: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1` 这样的结果,则意味着是驱动占用问题;
- 运行 `sudo apt remove brltty` 然后重新插拔一下设备即可解决问题。
```bash
sudo apt remove brltty
```
### 配置舵机
1. 找到与每个手臂关联的 USB 端口:
要找到每个总线伺服适配器的端口,请通过 USB 和电源将 MotorBus 连接到你的计算机。运行以下脚本并在提示时断开 MotorBus:
```shell
lerobot-find-port
```
在 Linux 上,需要通过运行以下命令来授予对 USB 端口的访问权限:
```shell
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
```
示例输出:
```shell
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.
[...断开相应的 leader 或 follower 手臂并按 Enter...]
The port of this MotorsBus is /dev/ttyACM1
Reconnect the USB cable.
```
其中找到的端口是:`/dev/ttyACM1`,对应你的`leader`或 `follower` 手臂。
2. 设置电机 ID 和波特率
每个电机通过总线上的唯一 ID 进行识别。全新的电机通常带有默认 `ID 1`。为了使电机和控制器之间的通信正常工作,我们首先需要为每个电机设置一个唯一的、不同的 ID。此外,总线上数据传输的速度由波特率决定。为了相互通信,控制器和所有电机需要配置相同的波特率。
为此,我们首先需要使用控制器单独连接到每个电机以设置这些参数。由于我们将这些参数写入电机内部存储器`(EEPROM)`的非易失性部分,因此我们只需要执行一次此操作。
如果你正在重新利用来自另一个机器人的电机,你可能也需要执行此步骤,因为 ID 和波特率可能不匹配。
#### Follower
将 USB 电缆从你的计算机和电源连接到 follower 手臂的控制器板。然后,使用你在上一步中获得的端口运行以下命令。你还需要使用 `id` 参数为你的 leader 手臂命名。
```shell
lerobot-setup-motors \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 # <- 在此粘贴上一步找到的端口
```
你应该看到以下说明
```shell
Connect the controller board to the 'gripper' motor only and press enter.
```
按照指示,插入夹爪的电机。确保它是连接到板上的唯一电机,并且电机本身尚未菊花链连接到任何其他电机。当你按下 `[Enter]` 时,脚本将自动为该电机设置 ID 和波特率。
然后你应该看到以下消息:
```shell
'gripper' motor id set to 6
```
接着是下一条指令:
```shell
Connect the controller board to the 'wrist_roll' motor only and press enter.
```
你可以从控制器板上断开 3 针电缆,但可以将其连接到另一端的夹爪电机上,因为它已经在正确的位置。现在,将另一根 3 针电缆插入腕部滚动电机并将其连接到控制器板。与之前的电机一样,确保它是连接到板上的唯一电机,并且电机本身未连接到任何其他电机。
按照指示对每个电机重复操作。
在按 Enter 之前检查每一步的接线。例如,当你操作板时,电源电缆可能会断开连接。
完成后,脚本将简单地结束,此时电机已准备好使用。你现在可以将每个电机的 3 针电缆插入下一个电机,并将第一个电机(ID=1 的 'shoulder pan')的电缆插入控制器板,该控制器板现在可以连接到手臂的底座。
#### Leader
对 leader 手臂执行相同的步骤。
```shell
lerobot-setup-motors \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 # <- 在此粘贴上一步找到的端口
```
### 组装机械臂
舵机到手之后按表格顺序排列
| | | |
| --- | --- | --- |
| ID号 | Leader | Follower |
| 1 | ST-3215-C044 | ST-3215-C047 |
| 2 | ST-3215-C001 | ST-3215-C047 |
| 3 | ST-3215-C044 | ST-3215-C047 |
| 4 | ST-3215-C046 | ST-3215-C047 |
| 5 | ST-3215-C046 | ST-3215-C047 |
| 6 | ST-3215-C046 | ST-3215-C047 |
为什么这里的ID号是这样的先按下不表,先以此为顺序,安装机械臂的各个关节。\
安装`ID1`舵机\
安装两个电机角。用 M3x6mm 螺丝固定顶部的角。底部的角不需要螺丝。
- 将第一个电机放入底座。
- 用 4 颗 M2x6mm 螺丝(最小的螺丝)固定电机。顶部两颗,底部两颗。
- 滑过第一个电机支架并使用两颗 M2x6mm 螺丝(每侧一颗)固定。
- 连接肩部零件。
- 用顶部 4 颗 M3x6mm 螺丝和底部 4 颗 M3x6mm 螺丝拧紧肩部零件
- 添加肩部电机支架。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/73411fef6a094d529e29feca33ebeb65.mp4)
安装`ID2`舵机\
安装两个电机角。用 M3x6mm 螺丝固定顶部的角。底部的角不需要螺丝。
- 从顶部滑入第二个电机。
- 用 4 颗 M2x6mm 螺丝固定第二个电机。
- 用每侧 4 颗 M3x6mm 螺丝连接上臂。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/df2085453d634d0ea7fdb0ef1d254a85.mp4)
安装`ID3`舵机\
安装两个电机角。用 M3x6mm 螺丝固定顶部的角。底部的角不需要螺丝。
- 插入电机 3 并使用 4 颗 M2x6mm 螺丝固定。
- 使用每侧 4 颗 M3x6mm 螺丝将前臂连接到电机 3。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/7dcc4b58d2f3436d82b9358e4a5d8845.mp4)
安装`ID4`舵机\
安装两个电机角。用 M3x6mm 螺丝固定顶部的角。底部的角不需要螺丝。
- 滑过电机支架 4。
- 滑入电机 4。
- 用 4 颗 M2x6mm 螺丝固定电机 4。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/b6a0620cb1fa43549cd08bacf5656c6c.mp4)
安装`ID5`舵机\
将电机 5 插入腕部支架并用 2 颗 M2x6mm 前螺丝固定。
- 仅在腕部电机上安装一个电机角,并用 M3x6mm 角螺丝固定。
- 使用两侧各 4 颗 M3x6mm 螺丝将腕部固定到电机 4。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/3c9241cb23b94675b0f8edeb1eea88df.mp4)
安装Leader臂的舵机`(这里对应为ID6-leader的舵机)`\
将 leader 支架安装到腕部并用 4 颗 M3x6mm 螺丝固定。
- 使用 1 颗 M2x6mm 螺丝将手柄连接到电机 5。
- 插入夹爪电机,用每侧 2 颗 M2x6mm 螺丝固定,使用 M3x6mm 角螺丝连接电机角。
- 用 4 颗 M3x6mm 螺丝连接 follower 触发器。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/4b9b2e4b41684342bc217a5ea0316530.mp4)
安装Follower臂的舵机`(这里对应为ID6-Follower的舵机)`\
将夹爪连接到电机 5,使用 4 颗 M3x6mm 螺丝将其连接到腕部的电机角。
- 插入夹爪电机并用每侧 2 颗 M2x6mm 螺丝固定。
- 在夹爪电机上安装两个电机角。用 M3x6mm 螺丝固定顶部的角;底部的角不需要螺丝。
- 安装夹爪爪并用两侧各 4 颗 M3x6mm 螺丝固定。\
[视频](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/67b2473d-7789-43dd-9c90-4a1620fe89ce/files/video/787cf12901f044f38bb392b850122401.mp4)
### 校准
接下来,你需要校准机器人,以确保 leader 和 follower 手臂在相同的物理位置时具有相同的位置值。 校准过程非常重要,因为它允许在一个机器人上训练的神经网络在另一个机器人上工作。
#### Follower
运行以下命令来校准 follower 手臂:
```shell
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \ # <- 你的机器人端口
--robot.id=follower1 # <- 给机器人一个唯一的名称
```
下面的视频显示了如何执行校准。首先,你需要将机器人移动到所有关节都处于其范围中间的位置。然后在按 Enter 后,你必须将每个关节移动通过其完整的运动范围。
执行相同的步骤来校准 leader 手臂,运行以下命令:
```shell
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \ # <- 你的机器人端口
--teleop.id=leader1 # <- 给机器人一个唯一的名称
```
### 遥操作
先赋予权限:
```bash
# 查看当前所有接入的 ttyACM 或者是 ttyUSB 设备
ls -al /dev/ttyACM*
# 赋予读写权限
sudo chmod 666 /dev/ttyACM*
```
这里如果连上设备了,但是使用`ls`查看的时候,显示没有那个文件或者是文件夹,请看[说明1](#explain1)。
#### 仅机械臂
```bash
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=leader1
```
#### 添加摄像头
为了实例化摄像头,你需要一个摄像头标识符。这个标识符可能会在你重启电脑或重新插拔摄像头时发生变化,这主要取决于你的操作系统。
要查找连接到你系统的摄像头的摄像头索引,请运行以下脚本:
```bash
# 使用如下命令会列举当前接入电脑的所有摄像头
lerobot-find-cameras opencv # or realsense for Intel Realsense cameras
```
会输出类似如下的内容:
```bash
--- Detected Cameras ---
Camera #0:
Name: OpenCV Camera @ 0
Type: OpenCV
Id: 0
Backend api: AVFOUNDATION
Default stream profile:
Format: 16.0
Width: 1920
Height: 1080
Fps: 15.0
--------------------
(more cameras ...)
```
你可以在 `~/lerobot/outputs/captured_images` 目录中找到每台摄像头拍摄的图片。
> 在 `macOS` 中使用 `Intel RealSense` 摄像头时,你可能会遇到 `Error finding RealSense cameras: failed to set power state”` 的错误。这可以通过使用 `sudo` 权限运行相同的命令来解决。
之后,你就可以在遥控操作时在电脑上显示摄像头画面了,只需运行以下代码即可。\
带摄像头的遥操作:
```bash
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--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=leader1 \
--display_data=true
```
如果你有更多摄像头,可以通过更改 `--robot.cameras` 参数来添加。你应该注意`index_or_path` 的格式,它由 `lerobot-find-cameras opencv` 命令输出的摄像头 ID 的最后一位数字决定。\
添加更多摄像头:
```shell
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--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=leader1 \
--display_data=true
```
`--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"}}"`\
在这一段命令中,加入了两个摄像头 `front` 和 `side`
```shell
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"}
```
`fourcc: "MJPG"`格式图像是经过压缩后的图像,你可以尝试更高分辨率,当然你可以尝试`YUYV`格式图像,但是这会导致图像的分辨率和FPS降低导致机械臂运行卡顿。目前`MJPG`格式下可支持`3`个摄像头`1920*1080`分辨率并且保持`30FPS`, 但是依然不推荐2个摄像头通过同一个USB HUB接入电脑。
### 1、数据集采集制作
数据集在本地保存:
```shell
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--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=leader1 \
--display_data=true \
--dataset.repo_id=myrobot/robot1 \
--dataset.num_episodes=50 \
--dataset.single_task='Grab the black cube' \
--dataset.push_to_hub=false \
--dataset.episode_time_s=60 \
--dataset.reset_time_s=60
```
其中`repo_id`可以自定义修改,`push_to_hub=false`,最后数据集会保存在主目录的`~/.cache/huggingface/lerobot`下会创建上述`myrobot/robot1`文件夹。
| 采集功能参数说明 | 描述 | 默认值 |
| --- | --- | --- |
| `--dataset.episode_time_s` | 每个 episode 的持续时间,单位为秒。 | 60 |
| `--dataset.reset_time_s` | 每个 episode 结束后的环境重置时间,单位为秒。 | 60 |
| `--dataset.num_episodes` | 要记录的 episode 总数。 | 50 |
| 录制过程中的键盘控制 | 动作 |
| --- | --- |
| →(右箭头) | 提前结束当前 episode 或 reset,进入下一阶段。 |
| ←(左箭头) | 取消当前 episode,并重新录制。 |
| ESC | 立即停止会话,编码视频,并上传数据集。 |
数据集在云端保存:\
使用Huggingface的功能:\
添加令牌
```shell
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
```
将你的 Hugging Face 仓库名称存储在一个变量中,以运行以下命令:
```shell
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER
```
测试:记录 5 个回合并将你的数据集上传到 Hub
```shell
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--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=leader1 \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task='Grab the black cube' \
--dataset.push_to_hub=true \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30
```
你会看到类似如下数据:
```shell
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)
```
#### 收集数据的技巧
一旦你熟悉了数据记录,就可以创建一个更大的数据集进行训练。一个好的起始任务是在不同位置抓取物体并将其放入箱子中。我们建议至少记录 50 个回合,每个位置 10 个回合。在整个记录过程中保持相机固定并保持一致的抓取行为。还要确保你正在操作的物体在相机上可见。一个好的经验法则是,你应该能够仅通过查看相机图像来完成任务。
在以下部分中,你将训练你的神经网络。在实现可靠的抓取性能后,你可以在数据收集期间开始引入更多变化,例如额外的抓取位置、不同的抓取技术和改变相机位置。
避免过快添加太多变化,因为这可能会妨碍你的结果。
如果你想深入了解这个重要主题,可以查看关于什么是好数据集的[博客文章](https://huggingface.co/blog/lerobot-datasets#what-makes-a-good-dataset)。
### 2、训练模型
#### 训练 ACT
ACT 与标准 LeRobot 训练流程无缝配合。以下是在你的数据集上训练 ACT 的完整示例:
```shell
lerobot-train \
--dataset.repo_id=${HF_USER}/your_dataset \
--policy.type=act \
--output_dir=outputs/train/act_your_dataset \
--job_name=act_your_dataset \
--policy.device=cuda \
--wandb.enable=true \
--policy.repo_id=${HF_USER}/act_policy
```
训练完成后,你可以使用 `lerobot-record` 命令和你训练的策略来评估你的 ACT 策略。这将运行推理并记录评估回合:
```shell
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_robot \
--robot.cameras='{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}' \
--display_data=true \
--dataset.repo_id=${HF_USER}/eval_act_your_dataset \
--dataset.num_episodes=10 \
--dataset.single_task="你的任务描述" \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2 \
# --dataset.camera_encoder.vcodec=auto \
--policy.path=${HF_USER}/act_policy
```
#### 训练 SmolVLA
首先需要安装环境:
```shell
pip install -e ".[smolvla]"
# 如果安装太慢的话可以使用临时镜像源加速
# pip install -e ".[smolvla]" -i https://pypi.tuna.tsinghua.edu.cn/simple
```
训练:
```shell
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
```
评估微调模型并实时运行:
```shell
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \ # <- 使用您的端口
--robot.id=my_blue_follower_arm \ # <- 使用您的机器人 ID
--robot.cameras='{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30}}' \ # <- 使用您的摄像头
--dataset.single_task="抓取乐高积木并将其放入箱子中。" \ # <- 使用您在数据集录制中使用的相同任务描述
--dataset.repo_id=${HF_USER}/eval_DATASET_NAME_test \ # <- 这将是 HF Hub 上的数据集名称
--dataset.episode_time_s=50 \
--dataset.num_episodes=10 \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2 \
# --dataset.camera_encoder.vcodec=auto \
# <- 如果您想在回合之间进行遥操作,Teleop 是可选的 \
# --teleop.type=so100_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_red_leader_arm \
--policy.path=HF_USER/FINETUNE_MODEL_NAME # <- 使用您的微调模型
```