使用 SO-100 录制一个可用的 LeRobot 数据集:校准、主从遥操作、实际的 lerobot-record 标志和默认值、摄像头设置、剧集数量,以及导致运行失败的缺陷。
一个SO-100从动机器人,一个相同设计的引导臂和两个USB摄像头可以在一个下午内微调一个策略。同样的测试台也可以轻松生成六十个在文件浏览器中看起来正常的片段,并浪费六小时的GPU运行时间。差异很少在于模型;而在于伺服系统和parquet文件之间发生的事情。
这是手动路线,然后是更短的路线。每个命令都来自lerobot 0.6.1,该版本于2026年8月3日发布,目前在PyPI上。它已移至控制台入口点,因此运行python lerobot/scripts/control_robot.py的教程描述了一个不再存在的文件。
简要版本
- •lerobot 0.6.1 记录 v3.0;GR00T N1.7 和 N1.5 需要 v2.1。在按下记录前确定格式。
- •四个命令:lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record。在校准和录制会话中保持相同的 --robot.id 和 --teleop.id。
- •实际默认值:30 fps,每集 60 秒,重置 60 秒,50 集,大约 100 分钟的实际运行时间。
- •此处最少集数:SmolVLA 为 30 集,其余为 50 集。
- •多样性胜过数量。数据集因四件事而失效:摄像头索引互换、帧丢失或冻结、关节停在其极限位置、任务字符串无法读取。
录制会话捕获了什么
一个 LeRobot 数据集 不是视频文件夹,而是带有视频的时间索引表:每个控制循环周期写入一行,其中包含指令动作、跟随器达到的状态、每个摄像头的一帧、时间戳和索引。策略只查看这些列。lerobot/svla_so100_pickplace 的模式,从其 meta/info.json 中读取。
| 特征 | 数据类型 | 形状 | 描述 |
|---|---|---|---|
| action | float32 | [6] | 来自主导臂的关节目标 |
| observation.state | float32 | [6] | 跟随器达到的关节位置 |
| observation.images.top | video | [480, 640, 3] | 场景摄像头,MP4(此处为 av1) |
| observation.images.wrist | video | [480, 640, 3] | 腕部摄像头,相同帧率 |
| timestamp | float32 | [1] | 自剧集开始以来的秒数 |
| frame_index, episode_index, index, task_index | int64 | [1] | 自动填充的簿记信息 |
关节包括 main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll 和 main_gripper:SO-100 的六个自由度。动作和状态共享一个形状,因为主从遥操作记录了一个目标以及一步之后达到的位置。这个差距是信息:手臂在哪里对抗重力或卡住的物体。这些字符串是该数据集的。今天用 0.6.1 记录的会话会写入 shoulder_pan.pos 到 gripper.pos,总线上的 ID 为 1 到 6:相同的六个关节,不同的键,这在配置按名称寻址特征时很重要。
该数据集包含 50 个剧集和 19,631 帧,帧率为 30 fps:每个剧集大约 393 帧,或 13 秒。如果您的平均时长为一分钟,那么您正在做更困难的事情,或者在两端记录了空闲时间。

工作台所需物品
| 项目 | 详情 | 备注 |
|---|---|---|
| 从动臂 | SO-100,六个 Feetech STS3215 舵机 | 零件成本约 110 至 150 欧元 |
| 主臂 | 第二个 SO-100,已移除齿轮 | 所有六个主电机均已去除齿轮:仅编码器,摩擦更小 |
| 电源 | 与物料清单中 7.4 V STS3215 型号匹配 | 参见下方警告 |
| 摄像头 | 两个 USB 摄像头,640x480 @ 30 fps | 一个场景视图,一个在手腕上 |
| 主机 | Python 3.12 或更高版本,ffmpeg | requires-python >= 3.12 |
| Hub 账户 | Hugging Face 写入令牌 | 可选,使用 --dataset.push_to_hub=false |
STS3215 有两个版本:SO-ARM100 README 将 7.4 V 版本额定为 16.5 kg.cm 堵转扭矩(在 6 V 下测量),12 V 版本额定为 30 kg.cm,并指出选择 12 V 电机也意味着购买 12 V 5 A+ 电源而非 5 V 电源。物料清单列出了 7.4 V 舵机。向额定 7.4 V 的舵机提供 12 V 电压会损坏它们,因此在接线前请阅读电机标签。舵机无响应。
如果机械臂尚未组装,那将是另一项任务:请从和开始。如果您尚未购买任何部件,请先阅读:SO-101 是更新的版本,改进了布线,无需拆卸齿轮,并且录制工作流程是相同的。
安装 lerobot 0.6.1
conda create -y -n lerobot python=3.12
conda activate lerobot
# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge
# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'
lerobot-info附加组件最容易让人困惑。pip install lerobot仅安装核心机器学习依赖项,不包括与机器人通信的组件。Koch 机械臂需要dynamixel而不是feetech。如果您的 shell 从未听说过 lerobot-record,这就是原因。
端口、电机ID和校准
在零件和正常工作的遥操作循环之间,有三个一次性步骤。 使得在您的机械臂上训练的策略可以在其他机械臂上运行,将原始编码器计数映射到共享的关节约定。
- 1查找每个机械臂的USB端口
在两个机械臂都插入的情况下运行它,当提示时拔下您正在识别的那个,并记下哪个端口消失了。在Linux上,您可能需要
sudo chmod 666 /dev/ttyACM0。bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2写入电机ID和波特率
ID是逐个电机写入的,文档对操作方式有严格规定:只连接一个电机到控制器板,不要与其他电机串联。脚本会向后遍历链条,首先提示夹爪并为其分配ID 6,然后是腕部旋转(wrist_roll)ID 5,一直到肩部平移(shoulder_pan)ID 1。请在组装前完成此操作。
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3校准两个机械臂
将每个关节移动到其范围的中间,按回车键,然后将每个关节扫过其完整范围。
id将成为配置文件名。bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader - 4在录制任何内容之前进行遥操作
这是对上述所有步骤的验收测试。如果遥操作出现卡顿、镜像或某个关节不跟随,录制会在50个片段中保留这些问题。
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader \ --display_data=true
配置文件存储在$HF_LEROBOT_CALIBRATION(默认为~/.cache/huggingface/lerobot/calibration),ID是查找键。为lerobot-record提供一个已校准的ID,它会提示按回车键以重用配置文件,或按c键重新校准。如果提供一个未知ID,则没有文件,它会在会话中途进入校准模式。
摄像头决定策略看到什么
lerobot-find-cameras opencv # or: lerobot-find-cameras realsense
# --- 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两个视角,它们的位置很重要:一个覆盖工作空间的固定场景摄像头,以及一个靠近末端执行器的腕部摄像头,显示夹持器即将接触的物体。LeRobot 社区数据集清单要求最好有两个 480x640 / 720p 或更高分辨率的视角,一个静态背景,中性稳定的照明,并且主导臂和人体肢体不在画面中。录制指南补充了一条经验法则:您应该能够仅通过查看摄像头图像来完成任务。
OpenCV 索引来自枚举顺序,因此重启或重新插拔可能会导致索引 0 和 2 互换位置,并将腕部视图置于整个会话的顶部插槽。lerobot 自己也这么说:它的摄像头类既接受设备路径也接受整数,并警告说索引在重启或端口更改后不稳定,尤其是在 Linux 上。将 `index_or_path` 指向 `/dev/v4l/by-id/` 下的 udev 符号链接,该链接遵循设备而非枚举顺序。这是数据集内部不一致的最常见原因,并且训练无法修复它。未检测到摄像头。
record 命令和所有标志
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_so100_follower \
--robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--teleop.type=so100_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_so100_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so100_pick_cube \
--dataset.single_task="Pick the red cube and drop it in the box" \
--dataset.num_episodes=50 \
--dataset.fps=30 \
--dataset.episode_time_s=25 \
--dataset.reset_time_s=10 \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2下面的默认值来自 src/lerobot/configs/dataset.py 的 main 分支,而非教程。其中一些并非人们所预期的。
| 标志 | 默认值 | 作用 |
|---|---|---|
| --dataset.repo_id | 空 | 名称;默认附加时间戳 |
| --dataset.single_task | 空 | 每个 episode 存储的任务字符串 |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | 写入路径,默认为 ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | 控制循环速率和数据集帧率 |
| --dataset.episode_time_s | 60 | episode 自动推进前的秒数 |
| --dataset.reset_time_s | 60 | 场景重置;机械臂移动,不存储任何数据 |
| --dataset.num_episodes | 50 | 本次会话记录的 episode 数量 |
| --dataset.push_to_hub | true | 会话结束时上传;false 则保留在本地 |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | 捕获期间编码;明确设置它 |
| --dataset.encoder_queue_maxsize | 30 | 每个相机缓冲的帧数,30 fps 时约 1 秒 |
| --dataset.encoder_threads | null (codec decides) | 每个编码器的线程数;如果捕获卡顿则降低 |
| --dataset.no_stamp | false | 保持 repo_id 与输入完全一致 |
| --resume | false | 追加到现有数据集;需要 --dataset.root |
你的数据集名称与你输入的名称不符。 lerobot 会附加一个日期时间标签,因此 so100_pick_cube 会变成 so100_pick_cube_20260823_141530。使用 --dataset.no_stamp=true 来获取一个稳定的名称。恢复模式计算的是增量,而非总量。使用 --resume=true 时,--dataset.num_episodes 计算的是额外的 episode 数量,并且 --dataset.root 变为强制项。在一个包含 30 个 episode 的数据集中请求 50 个,你将得到 80 个。
会话期间的键盘控制
- 右箭头或
n:提前结束 episode 或重置阶段。这是你最常用的键,因为一次干净的抓取很少需要 25 秒。 - 左箭头或
r:丢弃当前 episode 并重做。一次糟糕的尝试现在不花任何成本,但以后会付出很多。 - Escape 或
q:停止会话,完成编码,上传。 - 这些在 X11、Wayland 和无头 SSH 上都有效:在没有全局键盘后端的情况下,lerobot-record 会从控制终端读取相同的按键。这些字母键在延迟高的 SSH 链接中也能正常工作,而箭头序列可能会被拆分。
- 键盘遥操作则不同,它确实需要一个全局后端:X11、Windows 或带有辅助功能的 macOS。
多少个 episode,以及一个好的 episode 是什么样子
录制指南建议第一个任务至少录制50个片段,每个物体位置大约10个。 策略页面 列出了每个模型的最低要求,低于此要求运行不值得花费GPU时间。
| 策略 | 最少片段数 | Dataset format | GPU层级 | 每次运行成本 |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 或任何 24 GB 显卡 | 约 1 到 3 美元 |
| ACT | 50 | LeRobot v3.0 | RTX 4090 或任何 24 GB 显卡 | 约 1 到 3 美元 |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | 约 4 到 12 美元 |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | 约 4 到 12 美元 |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | 约 4 到 12 美元 |
更好的问题是“多少”和“什么”。 机器人操作模仿学习中的数据扩展定律 (Lin 等人,2024)收集了超过 40,000 个演示,并进行了超过 15,000 次真实世界部署。泛化能力与 环境和物体 的数量大致呈幂律关系,并且在每个环境或物体达到阈值后,额外的演示效果甚微。在一个测试台上:移动物体、改变光照、更换方块,而不是重复一次拍摄。
- 伺服系统可以复现的连续关节轨迹,不像键盘或游戏手柄
- 动作和状态共享一个坐标约定,因此策略学习到一个可以直接控制的目标
- 一个 25 秒的片段加上 10 秒的重置,大约每小时 100 个片段
- 操作员能感觉到从机停滞或卡住,因此在数据提交之前就能发现故障
- 第二个机械臂大约使零件成本翻倍
- 演示继承了操作员的习惯;Mandlekar 等人发现策略质量严重依赖于演示质量
- 主机以循环速率采样,因此暂停会变成几乎相同的行,这会教导策略等待
- 没有什么能强制会话之间的一致性:摄像头移动 5 厘米就是一种隐藏的分布偏移
一个好的片段是无聊的:可重复的起始姿态,只完成一件事,一旦物体进入垃圾箱就结束,任务字符串在清单推荐的25到50个字符之间。 拿起红色方块并将其放入盒子中 是一个任务字符串;task1 是清单明确指出的反模式。模糊的注释是其问题列表的首要项,它们对于 最为重要,因为字符串是模型输入,而不是文件名。
悄然破坏数据集的缺陷
没有一个会抛出异常。所有缺陷都会在训练中幸存下来,表现为看起来正常的损失曲线和什么都不做的机器人。在场景设置时进行检查。
| 缺陷 | 表现形式 | 来源 | 如何发现 |
|---|---|---|---|
| 摄像头视图互换 | 腕部图像在顶部键下 | 重新插拔后索引重新分配 | lerobot-find-cameras 每个会话;按ID路径 |
| 冻结帧 | 数十行都是同一张图像 | 摄像头停止传输;循环重复最后一帧 | 在 lerobot-dataset-viz 中检查 |
| 丢帧 | 行数低于帧率乘以秒数 | 队列溢出,丢弃而非阻塞 | 日志中显示 'Encoder queue full';行数与帧率乘以持续时间 |
| 关节达到极限 | 一个关节平坦地处于最小或最大值 | 主导范围超出跟随者,或中间姿态不佳 | ds.meta.stats 中的每个关节的最小/最大值;事先运行 lerobot-find-joint-limits |
| 图像与动作不同步 | 策略提前或滞后 | 摄像头帧率与循环不同 | 将每个摄像头保持在 --dataset.fps |
| 空闲时间 | 长时间运行相同的动作行 | 操作员暂停但录像机仍在运行 | 连续相同动作行的比例 |
| 不可用的任务字符串 | task1, demo2, test | 快速输入 | v3.0 中的 meta/tasks.parquet (v2.1 中是 meta/tasks.jsonl);使用 lerobot-edit-dataset modify_tasks 修复 |
编码器为每个摄像头维护一个有界队列,默认30帧。当它无法跟上时,帧会被丢弃而不是阻塞:捕获继续,并且不会崩溃。你会收到Encoder queue full for {camera}, dropped N frame(s)消息,并在剧集结束时看到每个摄像头的总丢弃帧数。lerobot的阈值:大约5%的帧丢失意味着系统过载,2%是预期的启动负载。修复措施按顺序:--display_data=false,降低--dataset.encoder_threads,vcodec=h264,关闭流式传输。
一个注意事项:流式编码指南的表格将默认值列为True,而主分支上的数据类显示为streaming_encoding: bool = False。文档和代码不一致,因此请明确设置它;lerobot在每次以该标志关闭启动时都会记录一条提示,建议进行设置。
在租用GPU之前检查数据集
文档中的验收测试:将视频时长与CLI报告的剧集时长进行比较,并确认行数等于帧率乘以时长。按剧集计算,而不是总计。
from lerobot.datasets import LeRobotDataset
ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)
# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])
# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])然后查看它。 lerobot-dataset-viz 在Rerun或Foxglove中,逐帧回放一个片段,并在摄像机视图旁边显示关节轨迹。交换的摄像机和冻结的帧会在十秒内显示出来。人们通常会跳过这一步。
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0
# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0 \
--display-mode foxglove
# Drop the episodes that did not survive review
lerobot-edit-dataset \
--repo_id your-user/so100_pick_cube_20260823_141530 \
--new_repo_id your-user/so100_pick_cube_clean \
--operation.type delete_episodes \
--operation.episode_indices "[3, 17, 41]"
v2.1 或 v3.0:录制前决定
v2.1 为每个剧集写入一个 parquet 文件和一个 MP4 文件。v3.0 将多个剧集连接到共享分片中,并从元数据重建边界,因此 info.json 包含路径模板,例如 data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet 而不是剧集编号。上游的理由是文件更少、更大:更快的初始化和在规模化时更小的文件系统压力。
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| 布局 | 每个剧集一个 parquet 和一个 MP4 文件 | 每个分片多个剧集 |
| 剧集元数据 | JSONL 文件 | 在 meta/episodes/ 下的块状 parquet 文件,通过数据集堆栈 |
| 从 Hub 流式传输 | 否 | 是,通过 StreamingLeRobotDataset |
| 由 lerobot 0.6.1 写入 | 否 | 是,您今天获得的 |
| 由 GR00T N1.7 和 N1.5 读取 | 是 | 否,必须向下转换 |
lerobot 0.6.1 写入 v3.0,但 GR00T N1.7 和 N1.5 读取 v2.0 或 v2.1 并会崩溃。请注意发展方向:src/lerobot/scripts/ 包含 convert_dataset_v21_to_v30.py,但没有反向转换的脚本。请在会话前解决此问题。修复:数据集被拒绝为 v3。
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube
# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube \
--root=/path/to/dataset/directory \
--push-to-hub=false通往同一数据集的两种途径
以上所有操作都在您自己的机器上完成:您负责 USB 枚举、ffmpeg 构建、编码器调优和校准文件。这是理解管道、运行不寻常的相机设置或保持数据本地化的正确途径。
时间:每条机械臂组装一个晚上,一次繁琐的首次校准,以及一次因相机插槽错误而报废的首次会话。
桌面客户端直接从远程操作会话中记录 LeRobot 格式的数据集、片段、摄像头流和关节状态。该数据集用于训练表单:选择模型、数据集和超参数,后端会租用一个根据模型 VRAM 大小调整的 GPU,运行训练器并将检查点写入对象存储。
- 1
- 2从远程操作会话中记录
驱动机械臂;客户端以 LeRobot 格式写入片段。演练:记录您的第一个数据集。
- 3
- 4训练并重新运行
在训练矩阵上选择组合,然后将策略重新运行到机械臂上。在 24 GB 层级大约 1 到 3 美元,在 A100 或 H100 层级 4 到 12 美元。
它不组装或校准您的机械臂,也不修复有缺陷的片段,因此检查步骤仍然适用。另一方面也有一个硬性限制:对于快速任务,推理必须紧邻伺服系统。控制循环每个动作步骤运行 20 到 485 毫秒,再加上公共互联网往返延迟会将一个有效的策略变成一个犹豫不决的策略。
从数据集到策略
五十个干净的片段为每次运行提供数据。仅针对您的任务从头开始训练,大约80 M参数,每个动作步骤大约20毫秒,是五种策略中唯一能适应快速运动的。在大约24 GB的显卡上拥有约450 M参数。是一个大约3 B参数的基础模型,其中涉及大约40 M参数,需要A100或H100显卡,并且需要v2.1数据集。
接下来,您的组合指南:,或;对于首次运行,更简短。当策略在测试台上工作正常,但移动桌子时立即崩溃,这是一个数据问题:和更深入地探讨多样性。
我真正需要多少个片段才能获得第一个可用的策略?▾
SmolVLA需要30个,ACT、Pi0.5、GR00T N1.5和N1.7需要50个,这是AY-Robots训练器强制要求的最低数量。LeRobot指南独立建议,对于第一个任务至少需要50个,每个物体位置大约10个。数据扩展研究发现,泛化能力与环境和物体而非演示次数成正比,因此一个场景的一百次录制不如五个不同放置位置的五十次录制。
我需要一个主控臂,还是可以用键盘进行遥操作?▾
lerobot提供了键盘和游戏手柄遥操作器,因此主控臂并非严格必需,但强烈建议使用:主从模式在记录动作的坐标约定中提供连续的关节轨迹,而键盘输入则产生策略学习为抖动的阶梯式运动。键盘遥操作还需要一个全局按键后端,因此它在Wayland和无头模式下会失效。
我可以在树莓派或小型迷你PC上录制吗?▾
可以,但需要调优。流式编码指南有一个低资源范围,涵盖了现代4核机器和Raspberry Pi 5,并将其“需要一些调优”一栏中的两台640x480分辨率、30 fps的摄像头列入其中。其建议是:通过--dataset.rgb_encoder.vcodec=h264和--dataset.streaming_encoding=false来阻止编码器与捕获循环竞争。它将两台640x480的摄像头评定为每秒约5500万像素,两台1920x1080的摄像头评定为每秒约3.73亿像素。
我如何知道我刚刚录制的数据集是健康的?▾
三个简单的检查。将每个片段的视频时长与CLI报告的时长进行比较,并确认行数等于帧率乘以该时长,按片段而非总时长计算;这是lerobot编码指南给出的验收测试。读取ds.meta.stats,其中最小等于最大值的关节从未移动。然后使用lerobot-dataset-viz回放两三个片段,这是发现视图交换和冻结帧的唯一方法。关于丢帧,指南将缺失率的底线设在约5%;约2%是正常的瞬时负载,通常只是启动时的情况。
我的训练任务拒绝了v3.0数据集。现在怎么办?▾
GR00T N1.7和N1.5读取LeRobot v2.0或v2.1,并在v3.0上崩溃,而lerobot 0.6.1记录的就是v3.0。要么在训练前确定格式,要么使用原生读取v3.0的策略:Pi0.5、SmolVLA或ACT。lerobot提供了一个v2.1到v3.0的转换器,但没有反向转换器。
Sources
- LeRobot: 真实世界机器人上的模仿学习
- LeRobot: SO-100 组装、电机设置和校准
- LeRobot: 摄像头和 lerobot-find-cameras
- LeRobot: 安装和附加矩阵
- LeRobotDataset v3.0: 布局和 v2.1 迁移
- LeRobot: 流媒体视频编码和丢帧
- LeRobot: 将大型数据集移植到 v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: 真实的录制默认值
- lerobot_record.py: 录制循环和恢复处理
- TheRobotStudio/SO-ARM100: 构建仓库和物料清单
- Hugging Face: LeRobot 社区数据集清单
- lerobot/svla_so100_pickplace: 50 集, 19,631 帧
- Lin et al. (2024), 模仿学习中的数据扩展定律
- Mandlekar et al. (2021), 从离线人类演示中学习的关键要素
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started