Strands Robots 与 LeRobot 集成:从 Hugging Face Hub 数据集到实体机器人部署

Strands Robots 与 LeRobot 集成:从 Hugging Face Hub 数据集到实体机器人部署

TL;DR

Hugging Face 宣布了 Strands Robots SDK 与 LeRobot 的集成,使用户能够记录机器人演示、将数据推送到 Hub、在仿真中运行策略,并只通过更改一个参数即可将相同代码部署到实体 SO-101 机器人,同时通过基于 Zenoh 的网格协同多个机器人。

Overview

Strands Robots 是来自 AWS 的开源 SDK(Apache 2.0),它将机器人抽象、仿真以及 LeRobot 堆栈以 AgentTools 的形式暴露,组合成单一的 Strands 代理。该集成刻意保持轻量:LeRobot 自身的脚本负责硬件录制和校准,Strands AgentTools 提供代理编排的部件。仿真工具以与 LeRobot 在硬件上写入相同的格式记录 LeRobotDatasets。GR00T 和 LerobotLocal 在统一接口后端提供策略推理,MolmoAct2 检查点通过 LerobotLocal 路径运行。对等网格将代理扩展到远程机器人。数据集格式保持完全与 LeRobot 写入时一致;代理循环则是两者之间的粘合剂。

Prerequisites

Minimal (default simulation path)

  • Linux 或 macOS 上的 Python 3.12+(Apple Silicon 支持 MuJoCo 后端)。
  • 与 Strands 兼容的模型提供商,用于代理推理(带 AWS 凭证的 Amazon Bedrock、Anthropic API、OpenAI,或本地运行的 Ollama)。
  • 已安装 Strands Robots 并带有额外依赖:uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"

Advanced (hardware deployment, real policies, Hub push)

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

Recording Demonstrations

仿真工具以与 LeRobot 在硬件上相同的格式记录 LeRobotDatasets。无需硬件。Simulation 工具的 start_recording 动作通过同一 DatasetRecorder 类写入:关节状态和动作使用相同的 parquet schema,摄像头使用相同的 MP4 布局。代理提示几乎相同:

from strands import Agent
from strands_robots import Robot

robot = Robot("so100\))  # mode="sim" by default
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." )

Mock 策略生成占位关节动作,使工作流在没有训练检查点的情况下端到端运行。机器人会进行随机运动而非完成抓取,记录在结构上是完整的(有效的关节状态、有效的摄像头帧、格式正确的 LeRobotDataset 章节),但演示本身并不适合作为训练数据。若想在此步骤看到真实的抓取示例,可使用 --policy lerobot_local --checkpoint allenai/MolmoAct2-SO100_101(MolmoAct2 检查点,自动从其 config.json 检测并通过 LerobotLocal 路径路由);提示、数据集格式以及代理代码保持不变。 LeRobot 自带的数据集加载器可以直接读取仿真录制的数据,无需任何 Strands‑specific 代码路径:

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(...), ...}

该 features 字典在形状上与 Hub 上的任何 LeRobot 数据集完全相同:列名相同、parquet+MP4 布局相同、加载路径相同。消费硬件录制数据的训练脚本同样可以直接消费仿真录制的数据,无需修改。如果需要,来自仿真的数据集可以与硬件录制的数据并存于同一 Hub 仓库。

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-training);训练本身超出本文范围,遵循标准 LeRobot 工作流。从第 3 步起,代理可以自由切换使用原始或微调后的检查点。

Running a Policy in Simulation

有了 Hub 上的数据集,下一步是运行策略。示例使用默认仿真模式的 Robot() 工厂,然后附加 gr00t_inference,让代理能够管理推理容器:

from strands import Agent
from strands_robots import Robot, gr00t_inference

robot = Robot("so100\))  # mode="sim" by default
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 容器镜像、从 Hub 下载检查点并启动推理服务。随后在仿真机器人上执行 run_policy 动作,policy_provider="groot",并在 policy_config 中传入容器的主机和端口(容器在 5555 端口可达)。仿真会按照策略的动作块前进,渲染结果可通过 Simulation.render 查看。 如果开发者更倾向于进程内推理(无需容器、ZeroMQ),可将 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、Diffusion Policy、SmolVLA、π0、π0.5 等,所有可由 LeRobot 的策略注册表通过 config.json 解析的模型。具备 rtc_config 的流匹配策略(如 π0、SmolVLA)会自动开启实时分块(Real‑Time Chunking)。 NVIDIA 最近发布的 Cosmos 3 也可作为同一接口的策略提供者,保持代理代码不变。

注意:LerobotLocalPolicy 加载 Hugging Face 模型时需要 trust_remote_code=True。请设置环境变量 STRANDS_TRUST_REMOTE_CODE=1 以显式同意,并仅从可信组织加载检查点。

Deploying the Policy to Physical Hardware

这段代码与第 3 步相同,只是将一个关键字参数改为 mode="real"Robot 工厂此时返回由 LeRobot make_robot_from_config 驱动的实体机器人:

robot = Robot(
    "so100",
    mode="real",
    port=" /dev/ttyACM0",
    data_config="so100_dualcam",
    cameras={
        "front": {"type": "opencv", "index_or_path": " /dev/video0", "fps": 30},
        "wrist": {"type": "opencv", "index_or_path": " /dev/video2", "fps": 30},
    },
)
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." )

同样的代理提示现在会在实体机械臂上执行。硬件路径使用 LeRobot 的机器人抽象进行关节指令和摄像头读取,GR00T 容器(5555 端口)生成动作块。 在运行之前,需要为 follower 与 leader 完成校准。对每台设备执行一次 lerobot-calibrate,校准文件会落在 ~/.cache/huggingface/lerobot/calibration/,Strands 代码在触碰硬件时会从该位置读取。如果缺少校准,代理会抛出 LeRobot 驱动层的错误信息。

Coordinating Multiple Robots with the Mesh

到目前为止我们一次只驱动一台机器人。Mesh 是 Strands Robots 处理多机器人场景的方式。想象一下:桌面上的领袖机械臂遥控另一间房间的跟随臂,或是五台 SO‑101 同时执行仓库任务,或是人形机器人与移动底座协同。这些都是 Mesh 模式。Mesh 基于 Zenoh——一个开源的点对点协议,你无需管理 IP、编写发现代码或挑选 broker;新机器人一上线即加入 Mesh,代理即可一次性与全部机器人通信。 每个 Robot() 与每个 Simulation() 都会自动加入 Zenoh 对等 Mesh。robot_mesh 工具为代理提供 fleet 操作的词汇表,包括发现、结构化指令、广播以及紧急停止:

agent = Agent(tools=[robot_mesh])

agent(
    "List every robot and simulation on the mesh. "
    "Then send 'go to home pose' to each one in parallel." )

代理会调用 robot_mesh(action="peers") 枚举本地和已发现的对等体,然后使用 robot_mesh(action="broadcast", ...) 将结构化指令发送给所有对等体并设定超时。通过添加 [mesh-iot] 额外依赖,可将流量路由至 AWS IoT Core,实现跨网络 fleet。 项目文档中 robot_mesh 工具的动作参考列出了完整词汇表:subscribe、watch、inbox、以及结构化的点对点指令。 默认情况下,所有会实际驱动机器人的 Mesh 动作在执行前都会触发一次人工批准中断:fleet‑wide broadcast、emergency_stop,以及单点的 tell、send、stop。你可以通过环境变量 STRANDS_MESH_HITL_ACTIONS(设为 all、none 或逗号分隔的子集)来调节此集合。首次运行示例时,终端会出现 robot_mesh-broadcast-approval 提示,输入 y(或 yes / approve)即可授权广播。该批准是通过 LLM 工具参数之外的带外通道传递的,因而任何尝试在指令体中注入批准标志的 prompt‑injection 攻击都无法绕过此门。 传输层的扩展不需要改动代理代码。内置的 Zenoh Mesh 是自动回退方案:在局域网内,Zenoh 多播完成点对点发现,无需 broker;添加 [mesh-iot] 后,流量通过 AWS IoT Core(MQTT5 + mTLS)进入云端 fleet,BridgeTransport 将局域网与云端统一为同一 API(使用 STRANDS_MESH_BACKEND=bridge 进行选择)。 对于生产 fleet,Device Connect(与 Arm 合作开发的设备感知网络层)负责发现、在线状态、结构化 RPC、事件路由以及安全保障。当可用时,robot_mesh 工具会通过 Device Connect 分发指令,否则回退到内置 Zenoh Mesh,本文的代理代码保持不变。

Try It Using the Sample Application

完整示例位于 GitHub strands-labs/robots 仓库的 examples/lerobot/ 目录。它将全部五个步骤封装为单一 CLI 脚本 (hub_to_hardware.py) 与 notebook (hub_to_hardware.ipynb)。默认 CLI 在仿真中端到端运行 Mock 策略,无需 GPU、Docker 或 Hugging Face 凭证。

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

export STRANDS_MESH_LOCAL_DEV=1

python examples/lerobot/hub_to_hardware.py

记录的数据集会落在 ~/.cache/huggingface/lerobot/local/strands-cube-pick/。若想推送到 Hugging Face Hub,只需在导出具有写权限的 HF_TOKEN 后,传入 --hf-user <your-user> 参数。若在第 3 步想要真实抓取行为,可使用 --policy groot --checkpoint <hf_repo>(需要 Docker + NVIDIA GPU)或 --policy lerobot_local --checkpoint <hf_repo>(需要 GPU 并设置 STRANDS_TRUST_REMOTE_CODE=1)。 Notebook (examples/lerobot/hub_to_hardware.ipynb) 逐单元演示相同工作流,并在每一步之间提供文字说明。打开 JupyterLab 并自上而下运行即可在仿真模式完成全部流程。

Security Considerations

本文展示的代码片段是搭建 Strands Robots 与 Hugging Face 的 “Hello World” 示例。对于更严肃、生产级的使用场景,需要注意以下重要事项:

Prompt Injection

向代理提供不可信数据可能导致 Prompt Injection,即不可信的上下文被当作 LLM 指令执行。鉴于这些机器人会在物理空间中动作,这是一项必须关注的风险。为降低此风险,开发者应仅向机器人喂入可信来源的数据;若无法保证全部输入可信,应限制代理可使用的工具,以防机器人执行安全关键的动作。

Robot Mesh Auth Behavior

本文代码片段中使用的 STRANDS_MESH_LOCAL_DEV=1 设置会在没有身份验证或访问控制的情况下初始化机器人 Mesh。这意味着同一网络中的任何设备都可以向机器人 fleet 发送指令。该设置适用于受信任的开发环境,但不适用于不受信任的网络或生产环境。此类场景下必须使用 STRANDS_MESH_AUTH_MODE=mtls

Operator Approval for Fleet‑Wide Actions

robot_mesh 工具的实际驱动动作会影响网络上的所有对等体:broadcast 与 emergency_stop 会触达每个节点,tell、send、stop 则针对单个目标节点。为防止代理在未经人工确认的情况下自行发出这些指令(或在 Prompt Injection 情况下),默认情况下这五类动作均被设置为需要人工‑in‑the‑loop 中断。代理调用受限动作时,Strands 运行时会暂停代理循环,并在 LLM 工具参数之外的带外通道请求操作员批准。可通过环境变量 STRANDS_MESH_HITL_ACTIONS(all、none 或逗号分隔的子集)调整受限集合。每个动作还配备速率限制、指令校验和审计日志。若在非代理循环(如裸脚本或单元测试)中调用受限动作,则默认直接失败。

How This Fits Together

该集成的核心设计选择是:Strands Robots 不会重新实现 LeRobot 已经提供的功能。硬件抽象、校准以及数据集格式全部保持上游不变。Strands 只在自然语言层面提供 AgentTool 接口,使其可组合。 这带来两方面的影响。对用户而言,Hub 上的每个数据集都是代理可以直接扩展、微调并部署的资产,无需任何转换步骤。对开发者而言,仿真数据与硬件数据共享同一文件格式,编写的训练脚本可以无差别地消费两者。仿真与真实之间的界限仅是部署细节,而非架构分割。

Where to Go From Here

完整的 Strands Robots 文档详细阐述了机器人目录、仿真、策略提供者、Mesh 与 Device Connect 等内容。对于更大规模的工作负载,strands-labs/robots-sim 仓库提供了包括 Isaac Sim 与 Newton 在内的更重的仿真后端,以及一个 LIBERO 基准示例。两种后端都遵循本文展示的同一 Robot 抽象,因而在扩展时代理代码保持不变。 欢迎在 Apache 2.0 许可证下贡献代码。如果你使用了此工作流,请提交 Issue 说明哪些地方有效、哪些地方需要改进。SDK 的迭代速度最快时,就是开发者的反馈直接落在需要改进的表面上时。

Resources

  • Strands Robots(SDK、AgentTools、Robot 工厂):github.com/strands-labs/robots,Apache 2.0
  • Strands Robots 文档(完整文档):strands-labs.github.io/robots/
  • Strands Robots Sim(示例、仿真后端):github.com/strands-labs/robots-sim
  • 示例代码:examples/lerobot/hub_to_hardware.py 与 hub_to_hardware.ipynb
  • 如何构建实体 AI 代理:面向真实世界机器人的自然语言:直播与博客
  • 深入实体 AI | S1E4 | 使用 NVIDIA NeMo Agent Toolkit 与 Bedrock AgentCore 自动化:直播
  • LeRobot:github.com/huggingface/lerobot - 数据集、策略、硬件驱动
  • Strands Agents SDK:github.com/strands-agents/harness-sdk
  • SmolVLA:SmolVLA
  • Pi0:Pi0
  • NVIDIA Isaac‑GR00T N1.7:GR00T N1.7
  • NVIDIA Cosmos3 Nano:Cosmos 3 Nano

Authors

Cagatay Cali 是 AWS 的研究工程师,专注于 Agentic AI 与机器人技术。他设计了将 AI 代理连接到实体机器人的接口,使开发者能够通过自然语言控制机器人系统,并让各类技术水平的构建者都能使用代理与机器人技术。

Sundar Raghavan 是 AWS Agentic AI Foundations 团队的高级解决方案架构师,负责 Amazon Bedrock AgentCore 的开发者体验,主导 SDK 与 CLI 的建设,并推动框架与生态系统的集成策略。他的工作聚焦于帮助开发者在 AWS 上构建、部署与扩展生产级 AI 代理。目前他正将这些经验延伸至实体 AI,协作开发 Strands Robots,以将相同的代理开发体验带入机器人领域。

Sources