AY-Robots 教程页面,用于使用 SO-100 机械臂录制您的第一个 LeRobot 数据集
LeRobotSO-100数据集录制遥操作模仿学习

使用 SO-100 录制您的第一个 LeRobot 数据集

AY-Robots ResearchAugust 23, 202616 分钟阅读

使用 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 中读取。

特征数据类型形状描述
actionfloat32[6]来自主导臂的关节目标
observation.statefloat32[6]跟随器达到的关节位置
observation.images.topvideo[480, 640, 3]场景摄像头,MP4(此处为 av1)
observation.images.wristvideo[480, 640, 3]腕部摄像头,相同帧率
timestampfloat32[1]自剧集开始以来的秒数
frame_index, episode_index, index, task_indexint64[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 秒。如果您的平均时长为一分钟,那么您正在做更困难的事情,或者在两端记录了空闲时间。

AY-Robots 词汇表中关于 LeRobot 数据集格式的条目,展示了目录布局和元数据文件
data/、videos/ 和 meta/ 中包含什么,以及哪些策略读取哪个版本。

工作台所需物品

项目详情备注
从动臂SO-100,六个 Feetech STS3215 舵机零件成本约 110 至 150 欧元
主臂第二个 SO-100,已移除齿轮所有六个主电机均已去除齿轮:仅编码器,摩擦更小
电源与物料清单中 7.4 V STS3215 型号匹配参见下方警告
摄像头两个 USB 摄像头,640x480 @ 30 fps一个场景视图,一个在手腕上
主机Python 3.12 或更高版本,ffmpegrequires-python >= 3.12
Hub 账户Hugging Face 写入令牌可选,使用 --dataset.push_to_hub=false
7.4 V,而非 12 V

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

bash
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
lerobot-info 会打印系统摘要,包括它能在 PATH 中找到的 ffmpeg 版本。

附加组件最容易让人困惑。pip install lerobot仅安装核心机器学习依赖项,不包括与机器人通信的组件。Koch 机械臂需要dynamixel而不是feetech。如果您的 shell 从未听说过 lerobot-record,这就是原因。

端口、电机ID和校准

在零件和正常工作的遥操作循环之间,有三个一次性步骤。 使得在您的机械臂上训练的策略可以在其他机械臂上运行,将原始编码器计数映射到共享的关节约定。

  1. 1
    查找每个机械臂的USB端口

    在两个机械臂都插入的情况下运行它,当提示时拔下您正在识别的那个,并记下哪个端口消失了。在Linux上,您可能需要sudo chmod 666 /dev/ttyACM0

    bash
    lerobot-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. 2
    写入电机ID和波特率

    ID是逐个电机写入的,文档对操作方式有严格规定:只连接一个电机到控制器板,不要与其他电机串联。脚本会向后遍历链条,首先提示夹爪并为其分配ID 6,然后是腕部旋转(wrist_roll)ID 5,一直到肩部平移(shoulder_pan)ID 1。请在组装前完成此操作。

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    校准两个机械臂

    将每个关节移动到其范围的中间,按回车键,然后将每个关节扫过其完整范围。id将成为配置文件名。

    bash
    lerobot-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. 4
    在录制任何内容之前进行遥操作

    这是对上述所有步骤的验收测试。如果遥操作出现卡顿、镜像或某个关节不跟随,录制会在50个片段中保留这些问题。

    bash
    lerobot-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
校准文件的存储位置以及ID的重要性

配置文件存储在$HF_LEROBOT_CALIBRATION(默认为~/.cache/huggingface/lerobot/calibration),ID是查找键。为lerobot-record提供一个已校准的ID,它会提示按回车键以重用配置文件,或按c键重新校准。如果提供一个未知ID,则没有文件,它会在会话中途进入校准模式。

摄像头决定策略看到什么

bash
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 命令和所有标志

bash
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
相机字典是一个用 shell 引号引起来的字符串;嵌套的花括号不是 shell 语法。

下面的默认值来自 src/lerobot/configs/dataset.py 的 main 分支,而非教程。其中一些并非人们所预期的。

标志默认值作用
--dataset.repo_id名称;默认附加时间戳
--dataset.single_task每个 episode 存储的任务字符串
--dataset.root$HF_LEROBOT_HOME/repo_id写入路径,默认为 ~/.cache/huggingface/lerobot/
--dataset.fps30控制循环速率和数据集帧率
--dataset.episode_time_s60episode 自动推进前的秒数
--dataset.reset_time_s60场景重置;机械臂移动,不存储任何数据
--dataset.num_episodes50本次会话记录的 episode 数量
--dataset.push_to_hubtrue会话结束时上传;false 则保留在本地
--dataset.streaming_encodingfalse in the dataclass, true in the docs table捕获期间编码;明确设置它
--dataset.encoder_queue_maxsize30每个相机缓冲的帧数,30 fps 时约 1 秒
--dataset.encoder_threadsnull (codec decides)每个编码器的线程数;如果捕获卡顿则降低
--dataset.no_stampfalse保持 repo_id 与输入完全一致
--resumefalse追加到现有数据集;需要 --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 formatGPU层级每次运行成本
SmolVLA30LeRobot v3.0RTX 4090 或任何 24 GB 显卡约 1 到 3 美元
ACT50LeRobot v3.0RTX 4090 或任何 24 GB 显卡约 1 到 3 美元
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GB约 4 到 12 美元
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GB约 4 到 12 美元
Pi0.550LeRobot v3.0A100 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_threadsvcodec=h264,关闭流式传输。

一个注意事项:流式编码指南的表格将默认值列为True,而主分支上的数据类显示为streaming_encoding: bool = False。文档和代码不一致,因此请明确设置它;lerobot在每次以该标志关闭启动时都会记录一条提示,建议进行设置。

在租用GPU之前检查数据集

文档中的验收测试:将视频时长与CLI报告的剧集时长进行比较,并确认行数等于帧率乘以时长。按剧集计算,而不是总计。

python
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中,逐帧回放一个片段,并在摄像机视图旁边显示关节轨迹。交换的摄像机和冻结的帧会在十秒内显示出来。人们通常会跳过这一步。

bash
# 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]"
lerobot-edit-dataset 还支持分割、合并、移除特征、修改任务和重新计算统计数据。慷慨地删除:一个糟糕的片段只损失一个片段;保留它则会损失所有基于它训练的运行。
AY-Robots 数据集目录列出了公共 LeRobot 数据集,包含片段计数和格式
可比较的数据集是如何确定大小和标注的。

v2.1 或 v3.0:录制前决定

v2.1 为每个剧集写入一个 parquet 文件和一个 MP4 文件。v3.0 将多个剧集连接到共享分片中,并从元数据重建边界,因此 info.json 包含路径模板,例如 data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet 而不是剧集编号。上游的理由是文件更少、更大:更快的初始化和在规模化时更小的文件系统压力。

LeRobot v2.1LeRobot v3.0
布局每个剧集一个 parquet 和一个 MP4 文件每个分片多个剧集
剧集元数据JSONL 文件在 meta/episodes/ 下的块状 parquet 文件,通过数据集堆栈
从 Hub 流式传输是,通过 StreamingLeRobotDataset
由 lerobot 0.6.1 写入是,您今天获得的
由 GR00T N1.7 和 N1.5 读取否,必须向下转换
今天录制,明天训练 GR00T

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

bash
# 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
快速处理50个片段。规模化是另一项工作:lerobot 的移植指南,将原始 DROID 转换为 v3.0,预计需要 7 天以上的本地处理时间和大约 400 GB 的存储空间。

通往同一数据集的两种途径

以上所有操作都在您自己的机器上完成:您负责 USB 枚举、ffmpeg 构建、编码器调优和校准文件。这是理解管道、运行不寻常的相机设置或保持数据本地化的正确途径。

此途径的成本

时间:每条机械臂组装一个晚上,一次繁琐的首次校准,以及一次因相机插槽错误而报废的首次会话。

无需自行连接管道即可记录 LeRobot 数据集

AY-Robots 桌面客户端从远程操作会话中以 LeRobot 格式记录片段、摄像头流和关节状态,然后将数据集交给训练器。

获取桌面客户端

从数据集到策略

五十个干净的片段为每次运行提供数据。仅针对您的任务从头开始训练,大约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的转换器,但没有反向转换器。

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started