本文將深入介紹 Strands Robots 如何整合 LeRobot,實現單一代理(agent)迴圈,讓機器人從 Hub 上的資料集,透過模擬到實體的資料格式一致性,以及可輕鬆切換的策略,最終部署到實體機器人。

假設你擁有一台機器人,Hugging Face Hub 上有一份示範資料夾,並且想讓機器人學習一項新任務。目前,這通常需要五種獨立的工具:一個用於錄製新示範、一個用於訓練、一個用於模擬測試、客製化程式碼用於硬體部署,以及另一個用於協調多台機器人。這些工具各自獨立運作,彼此之間缺乏溝通。

Strands Robots 是 AWS 推出的一個開源 SDK(Apache 2.0 授權),它將機器人抽象、模擬以及 LeRobot 堆疊作為 AgentTools 暴露出來,讓你可以將它們組合成單一的 Strands 代理。這種整合刻意保持輕薄:LeRobot 自己的腳本負責硬體錄製和校準,而 Strands AgentTools 則負責代理實際協調的部分。

模擬工具以與 LeRobot 在硬體上寫入相同的格式錄製 LeRobotDatasets。GR00T 和 LerobotLocal 透過通用介面提供策略推論服務,而 MolmoAct2 的檢查點則透過 LerobotLocal 路徑運行。點對點網格(peer mesh)將代理擴展到遠端機器人。資料集格式保持與 LeRobot 寫入時完全一致;代理迴圈是整個系統的黏合劑。

本文將引導你透過單一代理完成五個步驟:基於 LeRobot AgentTools 建構代理、在模擬中將示範錄製為 LeRobotDataset、在同一台機器人上運行策略、僅需更改一個關鍵字參數即可將相同的代理程式碼部署到實體 SO-101 機器人,以及透過 Zenoh 網格向整個機器人隊伍廣播指令。

最後,你可以從 GitHub 克隆可運行的範例應用程式,並在筆記型電腦上進行模擬運行。預設路徑不需要硬體、GPU 或 Hugging Face 憑證。本文的可執行配套程式碼位於 examples/lerobot/hub_to_hardware.py 和 hub_to_hardware.ipynb。筆記本預設僅支援模擬和 Mock 策略。

Strands Robots SDK 將 LeRobot 堆疊公開為 AgentTools,你可以將它們組合成一個 Strands 代理。本文中的範例代理執行四項任務:在模擬中錄製新示範、將結果作為 LeRobotDataset 推送到 Hub、在模擬中針對相同格式運行策略,以及僅需更改一個關鍵字參數即可將相同的代理程式碼部署到實體機器人。

當你擁有多台機器人時,代理可以透過內建的點對點網格協調整個隊伍。對於硬體錄製和校準,LeRobot 自己的 CLI 工具(lerobot-record, lerobot-calibrate)負責初始化;代理則從那裡接手。

兩項設計選擇使這一切成為可能。首先,Robot("so100") 預設返回一個模擬環境(無需硬體,沒有風險),而 mode="real" 則返回一個由 LeRobot 驅動的實體機器人。代理程式碼在這兩種模式下是相同的。其次,用於寫入 LeRobotDataset 的 DatasetRecorder 在模擬路徑和 LeRobot 自己的硬體錄製之間共享,因此在 MuJoCo 中捕獲的資料集與從實體 SO-101 捕獲的資料集格式相同。

整個工作流程只需五行 Python 程式碼:

```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")

```

接下來將逐步解釋這個呼叫內部實際發生的情況。

Python 3.12+,運行於 Linux 或 macOS(MuJoCo 後端支援 Apple Silicon)。一個與 Strands 相容的模型供應商,用於代理的推理。例如,帶有 AWS 憑證的 Amazon Bedrock、Anthropic API、OpenAI 或本地運行的 Ollama。

安裝 Strands Robots 並包含額外套件:`uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"`。就這些了。本文中的範例只需這三項即可在筆記型電腦上端到端運行。

一個具有寫入權限的 Hugging Face 帳戶和權杖,用於將資料集推送到 Hub 並從 Hub 拉取策略檢查點。對於硬體路徑:一對 SO-101 追隨者(follower)和領導者(leader),或任何其他 LeRobot 支援的機器人。

這兩種設備都需要在 ~/.cache/huggingface/lerobot/calibration/ 下有校準檔案。對於本地 GR00T 推論:一個配備至少 16 GB 視訊記憶體的 NVIDIA GPU,並安裝 Docker。本文使用 gr00t_inference 工具的 `lifecycle="full"` 動作,該動作會一次性拉取映像檔、下載檢查點並啟動容器。

安裝 Strands Robots 並取得範例檔案:

```bash

uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"

git clone https://github.com/strands-labs/robots.git

cd robots

```

如果你希望代理將資料集推送到 Hub 或從 Hub 拉取策略,請匯出你的 Hugging Face 權杖。對於本文中的預設模擬路徑,這是可選的;範例將使用 Mock 策略端到端運行,並將資料集寫入你的本地快取,無需 Hub 存取權限。

`export HF_TOKEN=hf_...`

可運行的範例位於 `strands-labs/robots` 儲存庫中的 `examples/lerobot/hub_to_hardware.py`(Python 腳本)和 `hub_to_hardware.ipynb`(筆記本),與 MuJoCo 和 LIBERO 範例並列。建議從筆記本開始:在 JupyterLab 中打開它,並在未連接任何硬體的情況下,以模擬模式從上到下運行儲存格。

模擬工具以與 LeRobot 在硬體上寫入相同的格式錄製 LeRobotDatasets,無需硬體。模擬工具的 `start_recording` 動作透過相同的 DatasetRecorder 類別寫入:關節狀態和動作使用相同的 parquet 結構,每個攝影機的 MP4 配置也相同。代理提示詞幾乎完全一樣:

```python

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."

)

```

Mock 策略是刻意設計的:它生成佔位符關節動作,以便工作流程無需訓練過的檢查點即可端到端運行。機器人會進行隨機運動,而不是完成抓取動作,錄製的內容在結構上是完整的(有效的關節狀態、有效的攝影機畫面、格式良好的 LeRobotDataset 劇集),但示範本身不適合用作訓練資料。

下面的步驟 3 將替換為 GR00T 或 LerobotLocal 以實現真正的抓取行為。若要在此步驟中看到實際的方塊抓取,請運行 `--policy lerobot_local --checkpoint allenai/MolmoAct2-SO100_101`(一個 MolmoAct2 檢查點,會從其 config.json 自動檢測並透過 LerobotLocal 路徑路由);提示詞、資料集格式和代理程式碼保持不變。

接下來發生的事情就是證明。LeRobot 自己的資料集載入器無需 Strands 特定的程式碼路徑即可讀取模擬錄製的資料:

```python

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 的資料集可以與硬體錄製資料並存於同一個 Hub 儲存庫中。

若要在實體 SO-101 而非模擬中錄製示範,請直接使用 LeRobot 的錄製 CLI。Strands 整合沒有將該命令包裝成 AgentTool,因為 LeRobot 已經能很好地完成這項工作:

```bash

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。

資料集上傳到 Hub 後,下一步是運行策略。範例使用 Robot() 工廠的預設模擬模式,然後附加 gr00t_inference,以便代理可以管理推論容器:

```python

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 容器映像檔、從 Hub 下載檢查點並啟動推論服務。然後,它在模擬機器人上執行 `run_policy` 動作,並將 `policy_provider="groot"` 以及 GR00T 服務的主機和埠(容器可在埠 5555 訪問)傳遞給 `policy_config` 字典。

模擬會根據策略的動作塊逐步進行,並且可以透過 Simulation.render 取得結果的渲染畫面。

對於偏好程序內推論(無需容器,無需 ZeroMQ (ZMQ))的開發者,可以將 gr00t_inference 替換為從 Hub 儲存庫載入的 LerobotLocalPolicy 實例。該供應商會將 `lerobot/` 組織下的任何模型 ID 路由到程序內路徑:

```python

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 也透過相同的介面作為策略供應商提供,因此代理程式碼保持不變。