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 以上(MuJoCo バックエンドは Apple Silicon をサポート)。
- エージェントの推論に使用できる Strands 互換のモデルプロバイダー(AWS 資格情報付き Amazon Bedrock、Anthropic API、OpenAI、またはローカルで動作する Ollama)。
- Strands Robots を次の extras 付きでインストール:
uv pip install "strands-robots[sim-mujoco,lerobot,mesh]"
Advanced (hardware deployment, real policies, Hub push)
- データセットのプッシュやポリシーのチェックポイント取得に必要な書き込み権限を持つ Hugging Face アカウントとトークン。
- ハードウェアパス用に、SO‑101 のフォロワーとリーダーのペア、または他の LeRobot 対応ロボット。両デバイスは
~/.cache/huggingface/lerobot/calibration/配下にキャリブレーションファイルが必要です。 - ローカル GR00T 推論用に、最低 16 GB のビデオメモリを持つ NVIDIA GPU と Docker がインストールされた環境。この記事では
gr00t_inferenceツールのlifecycle="full"アクションを使用し、イメージ取得、チェックポイントダウンロード、コンテナ起動を一括で行います。
Recording Demonstrations
シミュレーションツールは LeRobot がハードウェアで書き出すのと同じ形式で LeRobotDatasets を記録します。ハードウェアは不要です。シミュレーションツールの start_recording アクションは同じ DatasetRecorder クラスを通して書き込みます:関節状態とアクションの Parquet スキーマ、カメラごとの 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 固有のコードパスなしでシミュレーションで記録されたデータを読み取ります:
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 のトレーニング 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 に 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 を持つ場合は Real‑Time Chunking が自動で有効になります。
同じインターフェースで NVIDIA の最新 Cosmos 3 も利用可能です。したがって、どのプロバイダーを指すかに関わらずエージェントコードは変わりません。
注意
LerobotLocalPolicyはtrust_remote_code=Trueで Hugging Face モデルをロードします。利用するには環境変数STRANDS_TRUST_REMOTE_CODE=1を設定し、信頼できる組織のチェックポイントのみをロードしてください。
Deploying the Policy to Physical Hardware
ステップ 3 と同じコードですが、Robot の引数を一つ変更します。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-calibrate を一度実行すると、キャリブレーションファイルが ~/.cache/huggingface/lerobot/calibration/ に保存され、Strands のハードウェアコードはそこから読み取ります。キャリブレーションが欠如していると、エージェントは LeRobot ドライバ層からエラーを報告します。
Coordinating Multiple Robots with the Mesh
ここまでで 1 台のロボットを操作してきましたが、メッシュは複数ロボットを扱う仕組みです。デスク上のリーダーアームが別室のフォロワーアームを遠隔操作したり、5 台の SO‑101 が同じ倉庫タスクを並行して走らせたり、ヒューマノイドがモバイルベースと協調したりするシナリオが想定できます。メッシュは Zenoh というオープンソースの P2P プロトコル上に構築され、IP アドレス管理やディスカバリコード、ブローカー設定は不要です。新しいロボットは起動した瞬間にメッシュに参加し、エージェントは同時にすべてと通信できます。
すべての 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、構造化 P2P コマンドなど全語彙が網羅されています。
デフォルトでは、実機に影響を与えるすべてのメッシュアクションは実行前にヒューマン・イン・ザ・ループ(HITL)による承認が求められます:フリート全体のブロードキャスト、緊急停止、単一ピアへの tell、send、stop が対象です。承認対象は環境変数 STRANDS_MESH_HITL_ACTIONS で all、none、またはカンマ区切りのサブセットに調整できます。初回実行時にはターミナルに robot_mesh-broadcast-approval プロンプトが表示され、y(または yes / approve)でブロードキャストを許可します。承認は LLM のツール引数とは別のバンド外で処理されるため、プロンプトインジェクションで承認フラグを埋め込んでもバイパスできません。
トラフィックはエージェントコードを変更せずにスケールします。組み込みの Zenoh メッシュは自動フォールバックとして機能し、LAN 上では Zenoh マルチキャストがブローカー不要のピアディスカバリを提供します。[mesh-iot] エクストラを付けると、AWS IoT Core(mTLS を伴う MQTT5)を介したクラウドフリートへとルーティングされ、STRANDS_MESH_BACKEND=bridge で BridgeTransport が LAN とクラウドを単一 API に統合します。
本番フリート向けには、Arm と共同開発したデバイス認識ネットワーク層 Device Connect がディスカバリ、プレゼンス、構造化 RPC、イベントルーティング、安全性を提供します。robot_mesh ツールは Device Connect が利用可能な場合はそれを経由し、利用できない場合は組み込み Zenoh メッシュにフォールバックするため、エージェントコードはどちらの場合でも変更不要です。
Try It Using the Sample Application
完全なサンプルは GitHub の strands-labs/robots リポジトリの examples/lerobot/ フォルダにあります。5 つのステップを 1 つの CLI スクリプト(hub_to_hardware.py)とノートブック(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/ に保存されます。ローカルに残す代わりに 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 必要)を渡します。
ノートブック(examples/lerobot/hub_to_hardware.ipynb)は同じワークフローをセルごとに解説し、各ステップ間にナレーションが入ります。JupyterLab で開き、シミュレーションモードで上から順に実行してください。
Security Considerations
このセットアップで示したコードスニペットは、Strands Robots と HuggingFace を組み合わせた「Hello World」的な例です。実運用や本番環境で使用する際には、以下の重要な点に留意してください。
Prompt Injection
エージェントに信頼できないデータを与えると、プロンプトインジェクションが発生し、LLM の指示として扱われる危険があります。ロボットは物理空間で動作するため、このリスクは特に重要です。開発者はロボットに供給するデータを信頼できるソースのみに限定し、すべての入力が信頼できない場合は、エージェントが安全性に関わるアクションを実行できないようツールの使用範囲を制限すべきです。
Robot Mesh Auth Behavior
コードスニペットで使用した STRANDS_MESH_LOCAL_DEV=1 設定は、認証やアクセス制御なしでロボットメッシュを初期化します。つまり同一ネットワーク上の任意のデバイスがフリートにコマンドを送信できる状態です。信頼できる開発環境では問題ありませんが、信頼できないネットワークや本番環境では使用できません。その場合は STRANDS_MESH_AUTH_MODE=mtls を設定してください。
Operator Approval for Fleet‑Wide Actions
robot_mesh ツールの実機に影響を与えるアクション(ブロードキャスト、緊急停止、tell、send、stop)は、デフォルトでヒューマン・イン・ザ・ループの割り込みにより承認が必要です。エージェントがこれらのアクションを呼び出すと、Strands ランタイムはエージェントループを一時停止し、LLM のツール引数とは別にオペレーターに承認を求めます。承認対象は環境変数 STRANDS_MESH_HITL_ACTIONS で all、none、またはカンマ区切りのサブセットに調整できます。各アクションのレートリミット、コマンド検証、監査ログは割り込みと共に動作します。エージェントループ外(単体スクリプトやユニットテスト)では、これらのゲート付きアクションはデフォルトで失敗します。
How This Fits Together
統合の中心的な設計選択は、Strands Robots が LeRobot が既に提供している機能を再実装しないことです。ハードウェア抽象化、キャリブレーション、データセット形式は上流に残り、Strands は自然言語からそれらを組み合わせ可能にする AgentTool の表面だけを提供します。
この結果、2 つの重要な影響があります。ユーザーにとっては、Hub 上のすべてのデータセットがエージェントが拡張、ファインチューニング、デプロイできる資産となり、変換ステップは不要です。開発者にとっては、シミュレーションデータとハードウェアデータが同一ファイル形式を共有するため、どちらか一方用に書かれたトレーニングスクリプトがもう一方でもそのまま動作します。シミュレーションと実機の境界は「デプロイの詳細」に過ぎず、アーキテクチャ上の分断ではなくなります。
Where to Go From Here
Strands Robots の公式ドキュメントには、ロボットカタログ、シミュレーション、ポリシープロバイダー、メッシュ、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 (full documentation): strands-labs.github.io/robots/
- Strands Robots Sim (examples, simulation backends): 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 のリサーチエンジニアで、エージェント AI とロボティクスに注力しています。AI エージェントを自然言語で物理ロボットに接続するインターフェースを設計し、開発者がスキルレベルに関わらずロボットシステムを制御できるようにしています。
Sundar Raghavan は AWS のシニア ソリューション アーキテクトで、Agentic AI Foundations チームに所属しています。Amazon Bedrock AgentCore の開発体験をリードし、SDK と CLI の所有、フレームワークとエコシステム統合戦略を担当しています。現在は物理 AI に注力し、Strands Robots と協働して同様のエージェント開発体験をロボティクスに拡張しています。