Strands Robots SDK:用单一智能体打通 Hugging Face Hub 到物理机器人
From the Hugging Face Hub to robot hardware with Strands Agents and LeRobot
AWS(Apache 2.0)开源的 Strands Robots SDK 将 LeRobot 栈封装为 AgentTools,构建统一智能体。默认用 MuJoCo 模拟(无需硬件),mode="real" 切换至真实机器人。可记录演示数据为 LeRobotDataset 并推送 Hugging Face Hub,运行 GR00T 或 LerobotLocal 策略推理,经 Zenoh mesh 广播命令到多台机器人。模拟与硬件代码完全一致,只需改一个关键字参数。示例可在笔记本(Python 3.12+,Linux/macOS)无硬件、无 GPU 运行。
AWS 的 Strands Robots 把 LeRobot 仿真和硬件部署装进同一个 Agent 里,代码几乎不变就能从模拟切到物理机器人,对具身智能开发者是省掉胶水代码的实用工具。
一次对 Strands Robots 中 LeRobot 集成的完整演练——一个智能体循环,从 Hub 数据集到实体机器人,仿真到现实的数据集采用相同的磁盘格式,策略只需改一个字符串即可替换。
你有一台机器人、一个存放在 Hugging Face Hub 上的演示数据文件夹,以及一个你想让它学会的新任务。如今这需要五套彼此独立的工具:一套用来录制新的演示,另一套用来训练,第三套用来在仿真中测试,还有用于在硬件上部署的自定义代码,以及当你拥有不止一台机器人时用来协调的又一套工具。这些部件各自都能独立工作,但它们彼此之间并不通信。
Strands Robots 是来自 AWS 的一个开源 SDK(Apache 2.0),它将机器人抽象、仿真以及 LeRobot 技术栈以 AgentTools 的形式暴露出来,你可以将它们组合进单个 Strands 智能体。这一集成刻意做得很薄:LeRobot 自带的脚本负责硬件录制与校准,而 Strands AgentTools 则介入智能体真正要编排的那些环节。仿真工具以 LeRobot 在硬件上写入的相同格式记录 LeRobotDatasets。GR00T 和 LerobotLocal 在统一接口背后提供策略推理,而 MolmoAct2 检查点则通过 LerobotLocal 这条路径运行。一个对等网格将智能体分发到远程机器人上。数据集格式完全保持 LeRobot 写入时的原样;智能体循环则是把它们粘合起来的胶水。
本文带你走完单个智能体内部的五个步骤:基于 LeRobot AgentTools 构建智能体,在仿真中以 LeRobotDataset 的形式录制演示,在同一台机器人上运行策略,只需更改一个关键字参数即可将同一份智能体代码部署到物理 SO-101 上,并通过 Zenoh 网状网络向整个机器人集群广播命令。最后,你可以从 GitHub 克隆这个可运行的示例应用,并在自己的笔记本电脑上以仿真方式运行它。默认路径无需硬件、无需 GPU、也无需 Hugging Face 凭据。本文的可运行配套代码位于 examples/lerobot/hub_to_hardware.py 和 hub_to_hardware.ipynb。该 notebook 默认仅支持仿真,并使用 Mock 策略。
你将构建什么
Strands Robots SDK 将 LeRobot 技术栈封装为 AgentTools,你可以将它们组合进一个 Strands 智能体中。本文中的示例智能体做四件事:在仿真中录制新的演示,将结果作为 LeRobotDataset 推送到 Hub,针对同一格式在仿真中运行策略,以及只需更改一个关键字参数即可将同一份智能体代码部署到物理机器人上。当你拥有不止一台机器人时,该智能体可以通过内置的对等网状网络协调整个机器人集群。对于硬件录制和校准,LeRobot 自带的 CLI(lerobot-record、lerobot-calibrate)负责前期启动工作;智能体则从那里接手。
图 1。Robot("so100") 默认使用由 MuJoCo 支持的仿真;mode="real" 则返回由 LeRobot 驱动的硬件机器人。两种模式共享同一个 DatasetRecorder 和同一套策略提供方,因此在仿真中采集的数据集和在硬件上采集的数据集使用相同的磁盘上 LeRobotDataset 格式。
两个设计选择让这一切得以实现。首先,Robot("so100") 默认返回一个仿真(无硬件、无风险),而 mode="real" 返回由 LeRobot 驱动的硬件机器人。两种模式下的智能体代码完全相同。其次,用于写入 LeRobotDataset 的 DatasetRecorder 在 仿真路径和 LeRobot 自身的硬件录制之间是共享的,因此在 MuJoCo 中采集的数据集与从物理 SO-101 采集的数据集格式相同。
整个工作流只需五行 Python:
from strands_robots import Robot
from strands import Agent
arm = Robot("so100")
agent = Agent(tools=[arm])
agent("Pick up the red cube")
接下来是这次调用内部实际逐步发生的事情。
前置条件
最小配置(默认仿真路径)
- Python 3.12+,运行于 Linux 或 macOS(MuJoCo 后端支持 Apple Silicon)。
- 一个与 Strands 兼容的模型提供方,用于智能体的推理。可使用带 AWS 凭证的 Amazon Bedrock、Anthropic API、OpenAI,或本地运行的 Ollama。
- 通过 install extras 安装 Strands Robots:
uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"
就是这样。本文中的示例仅凭这三者即可在笔记本电脑上端到端运行。
进阶(硬件部署、真实策略、推送至 Hub)
- 一个具有写入权限的 Hugging Face 账号和 token,用于将数据集推送至 Hub 以及从 Hub 拉取策略检查点。
- 硬件路径方面:一对 SO-101 follower 和 leader,或任何其他 LeRobot 支持的机器人。两个设备都需要在
~/.cache/huggingface/lerobot/calibration/下放置校准文件。 - 本地 GR00T 推理方面:一块显存至少 16 GB 的 NVIDIA GPU,并已安装 Docker。本文使用了 gr00t_inference 工具的 lifecycle="full" 操作,它会在一次调用中拉取镜像、下载检查点并启动容器。
第 1 步 - 设置示例
安装 Strands Robots 并获取示例文件:
uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"
git clone https://github.com/strands-labs/robots.git
cd robots
如果你希望智能体向 Hub 推送数据集或从 Hub 拉取策略,请导出你的 Hugging Face token。对于本文中的默认仿真路径来说,这是可选的;示例使用 Mock 策略即可端到端运行,并将数据集写入你的本地缓存,无需访问 Hub。
export HF_TOKEN=hf_...
可运行的示例位于 examples/lerobot/hub_to_hardware.py(Python 脚本)和 hub_to_hardware.ipynb(notebook),它们与 MuJoCo 和 LIBERO 示例一起放在 strands-labs/robots 仓库中。推荐从 notebook 入手:在 JupyterLab 中打开它,在仿真模式下从上到下运行各个单元格,无需连接任何硬件。
第 2 步 - 录制演示并推送到 Hub
仿真工具 录制 LeRobotDatasets,其格式与 LeRobot 在硬件上写入的格式相同。无需硬件。Simulation 工具的 start_recording 动作通过同一个 DatasetRecorder 类写入:关节状态和动作使用相同的 parquet schema,每个摄像头使用相同的 MP4 布局。智能体提示词几乎完全相同:
from strands import Agent
from strands_robots import Robot
robot = Robot("so100")
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."
)
图 2。MuJoCo 仿真中的录制场景:SO-100 机械臂伸向地面上的一个红色方块,并被捕获为 LeRobotDataset。此默认路径无需硬件、无需 GPU、无需 Hugging Face 凭据。
Mock 策略是有意为之:它生成占位的关节动作,使整个工作流无需训练好的检查点即可端到端运行。机器人执行的是随机运动,而非完成抓取,录制结果在结构上是完整的(有效的关节状态、有效的相机帧、格式规范的 LeRobotDataset episode),但该演示本身并不能作为有用的训练数据。下面的第 3 步会换入 GR00T 或 LerobotLocal 以实现真实的抓取行为。要在这一步中看到实际的方块抓取,请运行 --policy lerobot_local --checkpoint allenai/MolmoAct2-SO100_101(一个 MolmoAct2 检查点,会从其 config.json 自动检测,并通过 LerobotLocal 路径路由);提示词、数据集格式和智能体代码保持不变。
证据就在于接下来发生的事。LeRobot 自带的数据集加载器能够读取仿真录制的数据,无需任何 Strands 专属的代码路径:
from lerobot.datasets.lerobot_dataset import LeRobotDataset
dataset = LeRobotDataset("my_user/cube_picking_sim")
print(dataset.features)
这个 features 字典在结构上与 Hub 上任何 LeRobot 数据集完全一致:相同的列名、相同的 parquet+MP4 布局、相同的加载器路径。用于消费硬件录制数据的训练脚本,无需修改即可消费仿真录制的数据。如果你愿意,从仿真推送的数据集可以与硬件录制数据并排存放在同一个 Hub 仓库中。
来自已录制 LeRobotDataset 的单个 episode,从录制器写出的每相机 MP4 回放,与训练脚本读取的是同一个磁盘上的视频文件。
在硬件上录制
要在物理 SO-101 上而非仿真中录制演示数据,可直接使用 LeRobot 的 record 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 工作流即可。从第 3 步开始,智能体可以互换地接续使用原始检查点或微调后的检查点。关于 SO-101 的完整硬件设置、校准演练和故障排查,请参阅示例文件夹中的 README。
第 3 步 - 在仿真中运行策略
数据集已在 Hub 上就绪,下一步是运行策略。该示例在其默认 sim 模式下使用 Robot() 工厂,然后挂载 gr00t_inference,以便智能体能够管理推理容器:
from strands import Agent
from strands_robots import Robot, gr00t_inference
robot = Robot("so100")
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 下载 checkpoint,并启动推理服务。随后它会在仿真机器人上运行一个run_policy动作,使用policy_provider="groot",并在policy_configdict 中传入 GR00T 服务的主机和端口(该容器可通过端口 5555 访问)。仿真会按照策略的动作块逐步推进,结果渲染可通过Simulation.render.
图 3。使用训练好的策略(一个 GR00T 或 MolmoAct2 checkpoint),智能体驱动 SO-100 在仿真中抓取红色方块,这正是 Mock 策略所代表的行为。
对于偏好进程内推理(无需容器、无需 ZeroMQ(ZMQ))的开发者,可将 gr00t_inference 替换为从 Hub 仓库加载的 LerobotLocalPolicy 实例。该 provider 会将 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 解析的任何内容。Real-Time Chunking 会自动为附带 rtc_config 的流匹配策略(π0、SmolVLA)开启。
NVIDIA 最近发布的 Cosmos 3 也可作为同一接口背后的策略提供方使用,因此无论你指向哪个提供方,智能体代码都保持不变。
注意:LerobotLocalPolicy 使用 trust_remote_code=True 加载 Hugging Face 模型。设置 STRANDS_TRUST_REMOTE_CODE=1 以选择启用,并且只加载来自你信任的组织的检查点。
第 4 步 - 将策略部署到物理硬件
这是与 Step 3 相同的代码,只更改了一个关键字参数。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 的机器人抽象来发送关节指令和读取摄像头数据,而可通过端口 5555 访问的 GR00T 容器负责生成动作块。
在针对你的 SO-101 运行之前,从动臂和主动臂的校准都必须到位。对每台设备运行一次 LeRobot 的校准命令(lerobot-calibrate);校准文件会存放在 ~/.cache/huggingface/lerobot/calibration/ 下,任何涉及硬件的 Strands 代码路径都会从那里读取它们。如果缺少校准,智能体会从 LeRobot 驱动层抛出该错误。
Step 5 - 使用 mesh 协调多个机器人
到目前为止,我们一次只驱动一个机器人。mesh 是 Strands Robots 处理多个机器人的方式。想象一下你桌上的主动臂远程操控另一个房间里的从动臂,或者五台 SO-101 并行执行同一个仓库任务,又或者一个人形机器人与移动底座协同工作。所有这些都是 mesh 模式。mesh 构建在 Zenoh 之上,这是一种开源的点对点协议,你无需管理 IP 地址、编写发现代码或选择 broker;新机器人一启动就会出现在 mesh 上,智能体可以同时与所有机器人通信。
每一个 Robot() 和每一个 Simulation() 都会自动加入一个 Zenoh 对等网格。robot_mesh 工具为智能体提供了一套用于集群操作的词汇,例如发现、结构化命令、广播和紧急停止:
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 为跨网络集群路由这些流量。项目文档中 robot_mesh 工具的操作参考涵盖了完整的词汇:subscribe、watch、inbox 以及结构化点对点命令。
默认情况下,每一个物理执行动作的网格操作在运行前都会暂停,等待人工审批中断:包括全集群广播和 emergency_stop,以及针对单个对等节点的 tell、send 和 stop。你可以通过 STRANDS_MESH_HITL_ACTIONS 环境变量来调整这一集合(将其设为 all、none 或以逗号分隔的子集)。首次运行此示例时,你会在终端中看到 robot_mesh-broadcast-approval 提示;输入 y(或 yes / approve)以授权广播。该审批在 LLM 的工具参数之外以带外方式传递,因此试图将审批标志偷偷塞入命令体的提示词注入攻击无法绕过这道关卡。
该传输层可扩展而无需改动智能体代码。内置的 Zenoh 网格是自动回退方案:在局域网中,Zenoh 多播无需 broker 即可处理对等节点发现;添加 [mesh-iot] 附加组件后,流量会通过 AWS IoT Core(MQTT5 配合 mTLS)路由,适用于云端集群,并通过 BridgeTransport 将局域网和云端汇聚在同一个 API 之后(用 STRANDS_MESH_BACKEND=bridge 来选择它)。
对于生产级设备集群,Device Connect 这一与 Arm 合作开发的设备感知网络层负责处理设备发现、在线状态、结构化 RPC、事件路由和安全性。同一个 robot_mesh 工具在 Device Connect 可用时通过它进行分发,否则回退到内置的 Zenoh mesh,因此本文中的智能体代码在两种情况下均保持不变。有关设置方法和当前可用性,请参阅 Device Connect 文档。
使用示例应用来体验
完整示例位于 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 中打开它,并以仿真模式从上到下运行。
安全注意事项
本设置中展示的代码片段代表了一个将 Strands Robots 与 HuggingFace 配合搭建的“hello world”示例。对于更严肃、可投入生产的使用场景,用户需要了解一些重要的注意事项:
提示词注入
将不受信任的数据提供给智能体可能导致提示词注入,即不可信的上下文被当作 LLM 指令来对待。鉴于这些机器人会在物理空间中执行动作,这是一个需要持续关注的重要风险。为缓解这一行为,开发者应谨慎,只向机器人提供来自可信来源的数据。如果并非所有输入数据都可信任,开发者应限制智能体可用的工具,以防止机器人执行安全关键性动作。
机器人网格认证行为
本博客代码片段中共享的 STRANDS_MESH_LOCAL_DEV=1 设置会在没有认证或访问控制的情况下初始化机器人网格。这意味着同一网络上的任何设备都可以向机器人集群下发指令。这对于可信的开发环境是可以接受的,但不适用于不受信任的网络或生产环境。对于这些使用场景,需要使用 STRANDS_MESH_AUTH_MODE=mtls。
针对集群级操作的运营方审批
robot_mesh 工具中会引发物理动作的操作会影响网络中的对等节点:broadcast 和 emergency_stop 会触达每一个对等节点,而 tell、send 和 stop 则只触达单个目标对等节点。为防止智能体自主发出这些命令(或在提示词注入下发出),这五个操作默认都被置于人类在环中断机制之后。当智能体调用受门控的操作时,Strands 运行时会暂停智能体循环,并要求操作员在 LLM 的工具参数之外进行批准。你可以通过 STRANDS_MESH_HITL_ACTIONS 环境变量调整受门控的集合(all、none,或逗号分隔的子集)。在中断机制之外,还同时运行着逐操作速率限制、命令校验和审计追踪。在智能体循环之外(裸脚本或单元测试),受门控的操作会以失败关闭方式处理。
清理
前面的工作流会启动一个 GR00T 容器、打开硬件上的串口,并写入本地数据集缓存。要将你的环境恢复到干净状态:
- 停止 GR00T 推理容器:
agent.tool.gr00t_inference(action="stop", port=5555),或使用lifecycle="teardown"一并移除该容器。 - 释放串口:如果你运行了硬件路径,请断开 SO-101 follower 和 leader。
- 可选:移除本地数据集缓存:录制的数据集位于
~/.cache/huggingface/lerobot/<repo_id>下。你推送到 Hub 的数据集不受影响。
各部分如何协同
该集成的核心设计选择在于,Strands Robots 不会重新实现 LeRobot 已经提供的功能。硬件抽象、校准以及数据集格式都保留在上游。Strands 新增的是 AgentTool 接口层,使这些能力可以通过自然语言进行组合。
由此产生两个结果。对用户而言,Hub 上的每一个数据集都是智能体可以扩展、微调并直接部署的资产,无需任何转换步骤。对开发者而言,仿真数据和硬件数据共享同一种文件格式,因此为其中一方编写的训练脚本可以原封不动地用于另一方。仿真与真实之间的界限变成了部署细节,而非架构上的分界。
接下来该往哪里走
图 4。Strands Robots 目录涵盖机械臂、人形机器人、四足机器人和灵巧手,全部处于同一个 MuJoCo 仿真环境中,并位于同一个 Robot() 工厂之后。本文中的 SO-100 只是众多受支持本体中的一种。
完整的 Strands Robots 文档深入介绍了机器人目录、仿真、策略提供方、mesh 以及 Device Connect。对于更大规模的工作负载,strands-labs/robots-sim 仓库托管了更重量级的仿真后端,包括 Isaac Sim 和 Newton,以及一个 LIBERO 基准示例。这两个后端都接入本文所示的同一个 Robot 抽象,因此随着规模扩大,智能体代码保持不变。
欢迎在 Apache 2.0 许可下贡献代码。如果你用这套工作流做出了东西,欢迎提交 issue,说明哪些地方好用、哪些地方不好用。当开发者反馈直接落到需要改进的表面上时,SDK 的迭代速度最快。
资源
- Strands Robots(SDK、AgentTools、Robot factory):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
来源:Hugging Face:Blog(RSS) · huggingface.co