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 的 checkpoint 透過 LerobotLocal 路徑執行。點對點網狀結構將代理擴散至遠端機器人。資料集格式完全保持 LeRobot 的寫入方式;代理迴圈則是兩者的黏合劑。
Prerequisites
Minimal(預設模擬路徑)
- Linux 或 macOS(支援 Apple Silicon 的 MuJoCo 後端)上的 Python 3.12+。
- 兼容 Strands 的模型供應商,用於代理推理(Amazon Bedrock 搭配 AWS 憑證、Anthropic API、OpenAI,或本地執行的 Ollama)。
- 以安裝額外套件的方式安裝 Strands Robots:
uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"
Advanced(硬體部署、真實策略、Hub 推送)
- 具備寫入權限的 Hugging Face 帳號與 token,用於推送資料集與從 Hub 下載策略 checkpoint。
- 硬體路徑:一組 SO‑101 follower 與 leader,或任何其他 LeRobot 支援的機器人。兩台裝置皆需在
~/.cache/huggingface/lerobot/calibration/下放置校準檔案。 - 本地 GR00T 推論:至少 16 GB 顯示記憶體的 NVIDIA GPU,且已安裝 Docker。本文使用
gr00t_inference工具的lifecycle="full"動作,會一次性拉取映像、下載 checkpoint 並啟動容器。
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 policy 產生佔位的關節動作,使工作流程在沒有訓練好的 checkpoint 時仍能端到端執行。機器人會以隨機動作移動,而非完成抓取,錄製的結構完整(有效的關節狀態、有效的相機影格、格式正確的 LeRobotDataset 片段),但示範本身不適合作為訓練資料。若想在此步驟看到真實的抓取動作,可執行 --policy lerobot_local --checkpoint allenai/MolmoAct2-SO100_101(MolmoAct2 checkpoint,會自動從其 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(...), ...}
此 features 字典在形狀上與 Hub 上任何 LeRobot 資料集相同:欄位名稱、parquet+MP4 版面、載入路徑皆一致。消耗硬體錄製資料的訓練腳本可直接使用模擬錄製的資料,無需任何修改。若需要,從模擬推送的資料集可與硬體錄製的資料集共存於同一個 Hub 倉庫。
Recording on hardware
若要在實體 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 的 training CLI(lerobot-training);訓練本身不在本文範圍內,遵循標準的 LeRobot 工作流程。從第 3 步開始,代理可自由切換使用原始或微調後的 checkpoint。
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 下載 checkpoint,並啟動推論服務。之後會對模擬機器人執行 run_policy 動作,policy_provider="groot",並在 policy_config 中傳入 GR00T 服務的主機與埠號(容器在 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)的 flow‑matching 策略,會自動啟用即時分塊(Real‑Time Chunking)。
NVIDIA 最近發布的 Cosmos 3 也可作為同一介面的策略供應者,代理程式碼保持不變。
注意:
LerobotLocalPolicy會以trust_remote_code=True載入 Hugging Face 模型。若要啟用,請設定環境變數STRANDS_TRUST_REMOTE_CODE=1,且僅載入可信組織的 checkpoint。
Deploying the Policy to Physical Hardware
此步驟與第 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 的機器人抽象來發送關節指令與讀取相機,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、寫 discovery 程式或選擇 broker;新機器人在啟動的瞬間即會出現在 Mesh 中,代理即可同時與所有機器人通訊。
每個 Robot() 與 Simulation() 會自動加入 Zenoh 點對點 Mesh。robot_mesh 工具為代理提供艦隊操作的詞彙,包括 discovery、結構化指令、廣播與緊急停止:
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") 列舉本機與已發現的 peers,接著使用 robot_mesh(action="broadcast", ...) 向所有 peers 發送結構化指令並設定逾時。若在 STRANDS_MESH_BACKEND 中加入 [mesh-iot] 額外套件,流量會透過 AWS IoT Core 進行跨網路艦隊的傳輸。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 為自動備援:在 LAN 中,Zenoh 多播負責點對點發現且不需 broker;加入 [mesh-iot] 後,流量會走 AWS IoT Core(MQTT5 + mTLS)以支援雲端艦隊,並透過 BridgeTransport 同時支援 LAN 與雲端(使用 STRANDS_MESH_BACKEND=bridge 選擇)。
對於正式的艦隊,Device Connect(與 Arm 合作開發的裝置感知網路層)負責 discovery、presence、結構化 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 policy 完全端到端執行,無需 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 與 HuggingFace 的「Hello World」示例。對於更嚴肅、可投入生產的使用情境,使用者需留意以下重要考量:
Prompt Injection
將未受信任的資料餵入代理可能導致提示注入(prompt injection),即不可信的上下文被當作 LLM 指令執行。鑑於這些機器人在實體空間中的驅動行為,此風險尤為重要。為降低此類行為,開發者應僅讓機器人接收來自可信來源的資料。若無法保證所有輸入皆可信,則應限制代理可使用的工具,以防止機器人執行安全關鍵的動作。
Robot Mesh Auth Behavior
本文程式碼中使用的 STRANDS_MESH_LOCAL_DEV=1 會在未啟用驗證或存取控制的情況下初始化機器人 Mesh。這表示同一網路上的任何裝置皆可向艦隊發送指令。此設定適用於受信任的開發環境,但不適合不受信任的網路或正式環境。對於這類情境,必須設定 STRANDS_MESH_AUTH_MODE=mtls。
Operator Approval for Fleet‑Wide Actions
robot_mesh 工具的實體驅動動作會影響網路上的 peers:broadcast 與 emergency_stop 會觸及所有 peers,tell、send、stop 則只針對單一目標。為防止代理自行發出這類指令(或在提示注入情況下),預設所有五種動作皆受「人類在迴路」中斷保護。當代理呼叫受保護的動作時,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 factory):github.com/strands-labs/robots,Apache 2.0
- Strands Robots docs(完整文件):strands-labs.github.io/robots/
- Strands Robots Sim(範例、模擬後端):github.com/strands-labs/robots-sim
- The example: examples/lerobot/hub_to_hardware.py and hub_to_hardware.ipynb
- How to Build Physical AI Agents: Natural Language for Real‑World Robotics:Live Stream and Blog
- Diving Deep on Physical AI | S1E4 | Automate with NVIDIA NeMo Agent Toolkit and Bedrock AgentCore:Live Stream
- LeRobot:github.com/huggingface/lerobot - datasets, policies, hardware drivers
- 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 的 Research Engineer,專注於 Agentic AI 與機器人領域。他設計了將 AI 代理與實體機器人連結的介面,讓開發者能以自然語言控制機器人系統,並使代理與機器人開發對所有技能層級的建構者都友善可及。
Sundar Raghavan 是 AWS Agentic AI Foundations 團隊的資深解決方案架構師,負責 Amazon Bedrock AgentCore 的開發者體驗,掌管 SDK 與 CLI,並推動框架與生態系統整合策略。目前他正將此焦點延伸至實體 AI,與 Strands Robots 合作,將相同的代理開發者體驗帶入機器人領域。