从 Hugging Face Hub 到机器人硬件:通过 Strands Agents 和 LeRobot 实现

Hugging Face Blog 工具

摘要

本篇博文介绍如何使用 Strands Robots SDK,通过 LeRobot 将 Hugging Face Hub 数据集与物理机器人硬件集成,实现从数据记录到在真实机器人上部署的单一智能体循环。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/17 11:36

从 Hugging Face Hub 到机器人硬件:使用 Strands Agents 和 LeRobot

来源:https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware 返回文章列表 (https://huggingface.co/blog) Sundar Raghavan 的头像 (https://huggingface.co/rsundaraws) Cagatay Cali 的头像 (https://huggingface.co/cagataydev)

Strands Robots 中 LeRobot 集成的逐步教程——一个智能体循环,从 Hub 数据集到物理机器人,仿真到真实数据集采用相同的磁盘格式,策略只需一个字符串即可切换。

你有一台机器人、一个存放在 Hugging Face Hub (https://huggingface.co/) 上的演示数据文件夹,以及一个新任务希望它学习。过去这需要五个独立的工具:一个用于录制新演示,一个用于训练,一个用于在仿真中测试,定制代码用于硬件部署,以及当你有多个机器人时还需要另一个工具来协调。这些工具各自为政,互不通信。

Strands Robots (https://github.com/strands-labs/robots) 是来自 AWS 的一个开源 SDK(Apache 2.0 许可 (https://www.apache.org/licenses/LICENSE-2.0)),它将机器人抽象、仿真以及 LeRobot (https://github.com/huggingface/lerobot) 栈暴露为 AgentTools,你可以将其组合成一个单一的 Strands 智能体。这种集成设计得非常轻量:LeRobot 自身的脚本处理硬件录制和校准,而 Strands AgentTools 则用于智能体实际编排的部分。仿真工具以 LeRobot 在硬件上写入的相同格式记录 LeRobotDataset。GR00T (https://github.com/NVIDIA/Isaac-GR00T) 和 LerobotLocal (https://strands-labs.github.io/robots/policies/lerobot-local/) 通过统一的接口提供策略推理,MolmoAct2 检查点则通过 LerobotLocal 路径运行。一个对等网格将智能体扩展到远程机器人。数据集格式完全保持 LeRobot 写入时的样子;智能体循环就是胶水。

本文将引导你在一个智能体内完成五个步骤:基于 LeRobot AgentTools 构建智能体,在仿真中录制一个演示作为 LeRobotDataset,在同一机器人上运行策略,通过更改一个关键字参数将相同的智能体代码部署到物理 SO-101 (https://github.com/TheRobotStudio/SO-ARM100),并通过 Zenoh (https://zenoh.io/) 网格向整个机器人集群广播命令。最后,你可以从 GitHub 克隆可运行的示例应用程序,并在笔记本电脑上以仿真模式运行。默认路径不需要硬件、GPU 或 Hugging Face 凭证。

本文的配套可运行代码位于 examples/lerobot/hub_to_hardware.py (https://github.com/strands-labs/robots/blob/main/examples/lerobot/hub_to_hardware.py) 和 hub_to_hardware.ipynb (https://github.com/strands-labs/robots/blob/main/examples/lerobot/hub_to_hardware.ipynb)。笔记本默认仅仿真模式并使用 Mock 策略。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#what-youll-build 你将构建什么

Strands Robots SDK 将 LeRobot 栈暴露为 AgentTools,你可以将其组合成一个 Strands 智能体。本文中的示例智能体完成四件事:在仿真中录制新的演示,将结果推送到 Hub 作为 LeRobotDataset,在仿真中以相同格式运行策略,以及通过更改一个关键字参数将相同的智能体代码部署到物理机器人。当你有多个机器人时,智能体可以通过内置的对等网格协调整个集群。对于硬件录制和校准,LeRobot 自己的 CLI(lerobot-recordlerobot-calibrate)负责准备工作;智能体从那里接手。

arch_hugginface (https://cdn-uploads.huggingface.co/production/uploads/6a1dc0f2b4238bb17ff94794/23tSv83E-Y06YWhpso9AS.png)

图 1. Robot("so100") 默认返回一个基于 MuJoCo 的仿真;mode="real" 返回一个由 LeRobot 驱动的硬件机器人。两种模式共享相同的 DatasetRecorder 和相同的策略提供者,因此在仿真中捕获的数据集和在硬件上捕获的数据集使用相同的磁盘上的 LeRobotDataset 格式。**

两个设计选择使其工作。首先,Robot("so100") (https://strands-labs.github.io/robots/getting-started/robot-factory/) 默认返回仿真(无硬件,无风险),而 mode="real" 返回一个由 LeRobot 驱动的硬件机器人。智能体代码在两种模式下完全相同。其次,写入 LeRobotDataset 的 DatasetRecorder 在 仿真路径 (https://strands-labs.github.io/robots/simulation/overview/) 和 LeRobot 自身的硬件录制之间共享,因此一个在 MuJoCo (https://mujoco.org/) 中捕获的数据集和一个从物理 SO-101 (https://github.com/TheRobotStudio/SO-ARM100) 捕获的数据集采用相同的格式。

五行程 Python 代码的整个工作流:

from strands_robots import Robot
from strands import Agent

arm = Robot("so100")  # mode="sim" (默认 - 安全,无硬件)
agent = Agent(tools=[arm])
agent("Pick up the red cube")

下面详细说明该调用内部实际发生的步骤。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#prerequisites 前提条件

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#minimal-default-simulation-path 最低要求(默认仿真路径)

  • Python 3.12+,Linux 或 macOS(Apple Silicon 支持 MuJoCo 后端)。
  • 用于智能体推理的 Strands 兼容模型提供者。Amazon Bedrock (https://aws.amazon.com/bedrock/) 配合 AWS 凭证、Anthropic API (https://docs.anthropic.com/)、OpenAI 或本地运行的 Ollama (https://ollama.com/)。
  • 已安装 Strands Robots 及其 安装额外组件 (https://strands-labs.github.io/robots/getting-started/installation/):uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"

就是这样。本文中的示例在这三个条件下可以在笔记本电脑上端到端运行。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#advanced-hardware-deployment-real-policies-hub-push 高级要求(硬件部署、真实策略、Hub 推送)

  • 一个 Hugging Face 账户和具有写权限的令牌,用于推送数据集和从 Hub 拉取策略检查点。
  • 对于硬件路径:一对 SO-101 从动臂和主臂,或任何其他 LeRobot 支持的机器人。两个设备都需要在 ~/.cache/huggingface/lerobot/calibration/ 下校准文件。
  • 对于本地 GR00T 推理:一个 NVIDIA GPU,至少 16 GB 显存,并安装 Docker。本文使用 gr00t_inference 工具的 lifecycle="full" 操作,该操作在一次调用中拉取镜像、下载检查点并启动容器。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#step-1—set-up-the-example 第一步 - 设置示例

安装 Strands Robots 并获取示例文件:

uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"
git clone https://github.com/strands-labs/robots.git
cd robots

如果你希望智能体推送数据集或从 Hub 拉取策略,请导出 Hugging Face 令牌。这对于本文的默认仿真路径是可选的;示例使用 Mock 策略端到端运行,并将数据集写入本地缓存,无需 Hub 访问。

export HF_TOKEN=hf_...

可运行的示例位于 examples/lerobot/hub_to_hardware.py(Python 脚本)和 hub_to_hardware.ipynb(笔记本),存放在 strands-labs/robots 仓库中,与 MuJoCo 和 LIBERO 示例一起。笔记本是推荐的起点:在 JupyterLab (https://jupyterlab.readthedocs.io/) 中打开,以仿真模式从上到下运行单元格,无需连接任何硬件。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#step-2—record-demonstrations-and-push-to-the-hub 第二步 - 录制演示并推送到 Hub

仿真工具 记录 LeRobotDatasets (https://strands-labs.github.io/robots/recording/) 的格式与 LeRobot 在硬件上写入的格式相同。无需硬件。Simulation 工具的 start_recording 操作通过相同的 DatasetRecorder 类写入:关节状态和动作的 Parquet 模式相同,每台摄像头的 MP4 布局相同。智能体提示几乎相同:

from strands import Agent
from strands_robots import Robot

robot = Robot("so100")  # mode="sim" 默认
agent = Agent(tools=[robot])

agent(
    "Record a demonstration of 'pick the red cube and place it in the box' "
    "using the Mock policy provider at FPS 30. Write the dataset to "
    "my_user/cube_picking_sim and push to the Hub when done."
)

sim_scene (https://cdn-uploads.huggingface.co/production/uploads/6a1dc0f2b4238bb17ff94794/DBe5futoSUQ9z9s4ECZ79.png)

图 2. MuJoCo 仿真中的录制场景:SO-100 机械臂伸向地面上的红色立方体,捕获到 LeRobotDataset。此默认路径不需要硬件、GPU 或 Hugging Face 凭证。*

Mock 策略是有意为之:它生成占位关节动作,使工作流无需训练好的检查点即可端到端运行。机器人执行随机运动而非完成抓取,录制在结构上是完整的(有效的关节状态、有效的摄像头帧、一个格式良好的 LeRobotDataset 片段),但演示本身不适合作为训练数据。下面的第三步将换成 GR00T 或 LerobotLocal 以实现真实的抓取行为。

要在此步骤中看到实际的抓取立方体,请运行 --policy lerobot_local --checkpoint allenai/MolmoAct2-SO100_101(一个 MolmoAct2 检查点 (https://huggingface.co/allenai/MolmoAct2-SO100_101),从其 config.json 自动检测并通过 LerobotLocal 路径路由);提示、数据集格式和智能体代码保持不变。

证明是接下来的事情。LeRobot 自身的数据集加载器无需特定于 Strands 的代码路径即可读取仿真记录的数据:

from lerobot.datasets.lerobot_dataset import LeRobotDataset

dataset = LeRobotDataset("my_user/cube_picking_sim")
print(dataset.features)
# {'observation.state': Sequence(...),
#  'observation.images.front': VideoFrame(...),
#  'action': Sequence(...),
#  'episode_index': Value(...), 'frame_index': Value(...), ...}

这个特征字典与 Hub 上的任何 LeRobot 数据集形状相同:相同的列名,相同的 parquet+MP4 布局,相同的加载器路径。消费硬件录制数据的训练脚本无需修改即可消费仿真记录的数据。如果愿意,从仿真推送的数据集可以与硬件录制一起存放在同一个 Hub 仓库中。

来自录制的 LeRobotDataset 的单个片段,从录制器写入的每摄像头 MP4 回放,训练脚本读取相同的磁盘视频。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#recording-on-hardware 在硬件上录制

要在物理 SO-101 上录制演示(而非仿真),请直接使用 LeRobot 的录制 CLI。Strands 集成没有将此命令包装为 AgentTool,因为 LeRobot 已经很好地完成了这项工作:

lerobot-calibrate --robot.type=so101_follower --robot.id=my_follower
lerobot-calibrate --robot.type=so101_leader --robot.id=my_leader

lerobot-record \
    --robot.type=so101_follower --robot.id=my_follower \
    --teleop.type=so101_leader --teleop.id=my_leader \
    --dataset.repo_id=my_user/cube_picking \
    --dataset.single_task='Pick up the red cube and place it in the box' \
    --dataset.num_episodes=25 \
    --dataset.push_to_hub=true

此命令落地到 Hub 的数据集采用与仿真录制相同的格式。要在此基础上微调策略,请运行 LeRobot 的训练 CLI(lerobot-train);本文不涉及训练,它遵循标准的 LeRobot 工作流。从第三步开始,智能体可以互换地使用原始检查点或微调后的检查点。

关于完整的 SO-101 硬件设置、校准指南和故障排除,请参阅 示例文件夹中的 README (https://github.com/strands-labs/robots/blob/main/examples/lerobot/README.md)。

https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware#step-3—run-a-policy-in-simulation 第三步 - 在仿真中运行策略

数据集在 Hub 上之后,下一步是运行策略。示例使用 Robot() 工厂的默认仿真模式,然后附加 gr00t_inference,以便智能体管理推理容器:

from strands import Agent
from strands_robots import Robot, gr00t_inference

robot = Robot("so100")  # mode="sim" 默认
agent = Agent(tools=[robot, gr00t_inference])

agent(
    "Start GR00T inference on port 5555 with the cube-picking checkpoint "
    "from my_user/cube-picker. Then ask the robot to pick up the red cube."
)

在底层,智能体运行 gr00t_inference(action="lifecycle", lifecycle="full", ...) 来拉取 GR00T 容器镜像 (https://strands-labs.github.io/robots/policies/groot/)、从 Hub 下载检查点并启动推理服务。然后它在仿真机器人上运行一个 run_policy 操作,参数为 policy_provider="groot",在 policy_config 字典中传递 GR00T 服务的主机和端口(容器在端口 5555 可达)。仿真随着策略的动作块一起步进,结果通过 Simulation.render 提供。

sim_grasp (https://cdn-uploads.huggingface.co/production/uploads/6a1dc0f2b4238bb17ff94794/70ZHVAM2CTkP0_kjNy08U.png)

图 3. 使用训练好的策略(GR00T 或 MolmoAct2 检查点),智能体驱动 SO-100 在仿真中抓取红色立方体,这是 Mock 策略所替代的行为。*

对于更喜欢进程内推理(无容器,无 ZeroMQ (ZMQ))的开发者,可以将 gr00t_inference 替换为一个从 Hub 仓库加载的 LerobotLocalPolicy 实例。该提供者将 lerobot/ 组织下的任何模型 ID 路由到进程内路径:

from strands_robots.policies import create_policy

policy = create_policy("lerobot/act_aloha_sim_transfer_cube_human")

LerobotLocalPolicy 支持 ACT (https://tonyzhaozh.github.io/aloha/)、Diffusion Policy (https://diffusion-policy.cs.columbia.edu/)、SmolVLA (https://huggingface.co/blog/smolvla)、π0 (https://www.pi.website/blog/pi0) 和 π0.5 (https://www.pi.website/blog/pi05),即 LeRobot 自身策略注册表能从 config.json 解析的任何内容。

相似文章