เปลี่ยนหุ่นยนต์จาก Hugging Face Hub สู่ฮาร์ดแวร์จริง ด้วย Strands Agents และ LeRobot
เคยไหม? คุณมีหุ่นยนต์ตัวหนึ่ง มีชุดข้อมูลสาธิตอยู่ใน Hugging Face Hub และมีงานใหม่ที่อยากให้มันเรียนรู้ แต่การจะทำให้สำเร็จได้ กลับต้องใช้เครื่องมือถึง 5 ตัวแยกกัน ตั้งแต่บันทึกการสาธิตใหม่, การฝึกฝน, การทดสอบในสภาพจำลอง, โค้ดที่ต้องเขียนเองเพื่อนำไปใช้กับฮาร์ดแวร์, ไปจนถึงเครื่องมือสำหรับจัดการเมื่อมีหุ่นยนต์มากกว่าหนึ่งตัว ชิ้นส่วนเหล่านี้ทำงานแยกกันได้ดี แต่ไม่เคยสื่อสารกันได้เลย
วันนี้ เรามีโซลูชันที่จะทำให้กระบวนการทั้งหมดนี้ง่ายขึ้น ด้วย Strands Robots ซึ่งเป็น Open Source SDK จาก AWS (Apache 2.0) ที่จะช่วยเปิดการใช้งาน Abstractions ของหุ่นยนต์, ระบบจำลองสถานการณ์ (Simulation) และ LeRobot stack ให้กลายเป็น AgentTools ที่คุณสามารถนำมาประกอบกันเป็น Strands agent เพียงตัวเดียว การทำงานร่วมกันนี้มีความยืดหยุ่นสูง โดยสคริปต์ของ LeRobot จะจัดการการบันทึกและการปรับเทียบฮาร์ดแวร์ ส่วน Strands AgentTools จะเข้ามาจัดการในส่วนที่ Agent ต้องควบคุม การจำลองสถานการณ์จะบันทึก LeRobotDatasets ในรูปแบบเดียวกับที่ LeRobot เขียนบนฮาร์ดแวร์ GR00T และ LerobotLocal จะให้บริการการอนุมาน (policy inference) ผ่านอินเทอร์เฟซที่เหมือนกัน และ MolmoAct2 checkpoints ก็จะทำงานผ่าน LerobotLocal ได้เช่นกัน นอกจากนี้ยังมี Peer mesh ที่ช่วยกระจาย Agent ไปยังหุ่นยนต์ระยะไกลได้ รูปแบบ Dataset จะยังคงเหมือนเดิมที่ LeRobot เขียนไว้ ส่วน Agent loop คือตัวเชื่อมประสานทุกอย่าง
บทความนี้จะพาคุณไปสำรวจ 5 ขั้นตอนภายใน Agent เดียวกัน: การสร้าง Agent ด้วย LeRobot AgentTools, การบันทึกการสาธิตเป็น LeRobotDataset ในสภาพจำลอง, การรัน Policy บนหุ่นยนต์ตัวเดียวกัน, การนำ Agent Code เดียวกันไปใช้กับ SO-101 จริง โดยเปลี่ยนเพียง Argument เล็กน้อย, และการกระจายคำสั่งไปยังกลุ่มหุ่นยนต์ (Fleet) ผ่าน Zenoh mesh เมื่อทำตามขั้นตอนทั้งหมด คุณจะสามารถ Clone ตัวอย่างแอปพลิเคชันที่ทำงานได้จริงจาก GitHub และรันบนแล็ปท็อปของคุณในสภาพจำลองได้ โดยไม่ต้องใช้ฮาร์ดแวร์, GPU, หรือแม้แต่ Hugging Face credentials สำหรับการทำงานแบบพื้นฐาน คู่มือที่ใช้งานได้จริงสำหรับบทความนี้อยู่ที่ examples/lerobot/hubtohardware.py และ hubtohardware.ipynb โดย Notebook จะเป็นการจำลองสถานการณ์เท่านั้น และใช้ Mock-policy เป็นค่าเริ่มต้น
Strands Robots: การรวมพลังของ LeRobot และ Hugging Face Hub
Strands Robots SDK จะเปิดการใช้งาน LeRobot stack ให้กลายเป็น AgentTools ที่คุณสามารถนำมาประกอบเข้าเป็น Strands agent เดียวกัน ตัวอย่าง Agent ในบทความนี้จะทำงาน 4 อย่างหลักๆ คือ:
- บันทึกการสาธิตใหม่ในสภาพจำลอง
- ส่งผลลัพธ์ไปยัง Hub ในรูปแบบ LeRobotDataset
- รัน Policy ในสภาพจำลองกับ Dataset รูปแบบเดียวกัน
- นำ Agent Code เดียวกันไปใช้กับหุ่นยนต์จริง โดยเปลี่ยน Argument เล็กน้อย
เมื่อคุณมีหุ่นยนต์มากกว่าหนึ่งตัว Agent นี้สามารถประสานงานกลุ่มหุ่นยนต์ทั้งหมดผ่าน Peer mesh ที่มีมาให้ สำหรับการบันทึกและการปรับเทียบฮาร์ดแวร์ CLI ของ LeRobot (เช่น lerobot-record, lerobot-calibrate) จะจัดการในส่วนการเริ่มต้นใช้งาน และ Agent จะเข้ามาทำงานต่อจากนั้น

การออกแบบที่ทำให้ทุกอย่างราบรื่น:
- Robot("so100") จะคืนค่าเป็น Simulation เป็นค่าเริ่มต้น (ไม่มีฮาร์ดแวร์, ปลอดภัย) และเมื่อใช้
mode="real"จะคืนค่าเป็นหุ่นยนต์ที่ขับเคลื่อนด้วยฮาร์ดแวร์ผ่าน LeRobot โค้ด Agent จะเหมือนกันทั้งสองโหมด - DatasetRecorder ที่ใช้เขียน LeRobotDataset จะถูกใช้ร่วมกันทั้งในเส้นทาง Simulation และการบันทึกฮาร์ดแวร์ของ LeRobot ดังนั้น Dataset ที่บันทึกจาก MuJoCo และ Dataset ที่บันทึกจาก SO-101 จริง จะอยู่ในรูปแบบเดียวกัน
ขั้นตอนทั้งหมดสามารถสรุปได้ด้วยโค้ด Python เพียงไม่กี่บรรทัด:
# ตัวอย่างโค้ดสั้นๆ (จากต้นฉบับ)
# ... (โค้ดเต็มจะอยู่ใน GitHub repository)ขั้นตอนที่ 1: การตั้งค่าตัวอย่าง
เพื่อให้ทุกอย่างพร้อมใช้งาน คุณจะต้อง:
- ติดตั้ง Python: Python 3.12+ บน Linux หรือ macOS (รองรับ Apple Silicon สำหรับ MuJoCo backend)
- Model Provider: เตรียม Model Provider ที่เข้ากันได้กับ Strands เช่น Amazon Bedrock พร้อม AWS credentials, Anthropic API, OpenAI, หรือ Ollama ที่รันบนเครื่องของคุณ
- ติดตั้ง Strands Robots: ใช้คำสั่ง
pip install "strands-robots[sim-mujoco,lerobot,mesh]" - (ถ้าต้องการ) Hugging Face Account: บัญชีและ Token ที่มีสิทธิ์เขียน เพื่ออัปโหลด Dataset และดึง Policy Checkpoints จาก Hub (ขั้นตอนนี้เป็นทางเลือกสำหรับเส้นทาง Simulation แบบพื้นฐาน)
- (สำหรับเส้นทางฮาร์ดแวร์) หุ่นยนต์: SO-101 pair (leader/follower) หรือหุ่นยนต์อื่นที่รองรับ LeRobot พร้อมไฟล์ Calibration ใต้
~/.cache/huggingface/lerobot/calibration/ - (สำหรับ GR00T Local Inference) GPU: NVIDIA GPU ที่มี VRAM อย่างน้อย 16 GB และติดตั้ง Docker
การติดตั้งและดาวน์โหลดโค้ด
- ติดตั้ง Strands Robots และดาวน์โหลดไฟล์ตัวอย่าง:
# คำสั่งติดตั้ง (ตัวอย่าง)
pip install "strands-robots[sim-mujoco,lerobot,mesh]"- หากต้องการอัปโหลด Dataset หรือดึง Policy จาก Hub ให้ตั้งค่า Hugging Face token:
export HUGGING_FACE_HUB_TOKEN="YOUR_HF_TOKEN"- โค้ดตัวอย่างที่ใช้งานได้จริงอยู่ที่
examples/lerobot/hubtohardware.py(สคริปต์ Python) และhubtohardware.ipynb(Jupyter Notebook) ใน repositorystrands-labs/robotsแนะนำให้เริ่มจาก Notebook เปิดใน JupyterLab แล้วรัน Cell ทีละขั้นตอนในโหมด Simulation โดยไม่ต้องต่อฮาร์ดแวร์
ขั้นตอนที่ 2: บันทึกการสาธิตและอัปโหลดไปยัง Hub
เครื่องมือจำลองสถานการณ์จะบันทึก LeRobotDatasets ในรูปแบบเดียวกับที่ LeRobot เขียนบนฮาร์ดแวร์ โดยไม่ต้องใช้ฮาร์ดแวร์จริง การใช้ start_recording ของเครื่องมือจำลอง จะเขียนผ่าน DatasetRecorder คลาสเดียวกัน ทำให้ได้ Schema ของ Joint states และ Actions รวมถึง Layout ของ MP4 ต่อกล้องที่เหมือนกัน
การบันทึกด้วย Mock Policy (สำหรับทดสอบ Workflow)
ในตัวอย่างนี้ เราจะใช้ Mock policy ซึ่งจะสร้าง Action ปลอมๆ ขึ้นมา เพื่อให้ Workflow ทำงานได้ตั้งแต่ต้นจนจบโดยไม่ต้องใช้ Trained checkpoint หุ่นยนต์จะเคลื่อนไหวแบบสุ่มแทนที่จะทำการจับวัตถุ แต่การบันทึกจะสมบูรณ์ (มี Joint states, Camera frames, และ LeRobotDataset ที่ถูกต้อง)

หากต้องการเห็นการจับวัตถุจริงในขั้นตอนนี้ ให้ลองรันด้วย --policy lerobotlocal --checkpoint allenai/MolmoAct2-SO100101 (MolmoAct2 checkpoint ที่จะถูกตรวจจับอัตโนมัติจาก config.json และส่งผ่าน LerobotLocal path) Prompt, รูปแบบ Dataset, และโค้ด Agent จะยังคงเดิม
การอ่านข้อมูลที่บันทึกได้
LeRobot's dataset loader สามารถอ่านข้อมูลที่บันทึกจาก Simulation ได้โดยตรง โดยไม่ต้องใช้โค้ดเฉพาะของ Strands
# ตัวอย่างการอ่านข้อมูล (จากต้นฉบับ)
# ...Feature dict ที่ได้จะมีโครงสร้างเหมือนกับ LeRobot dataset ใดๆ บน Hub: ชื่อคอลัมน์เหมือนกัน, Layout แบบ parquet+MP4 เหมือนกัน, และใช้ Loader path เดียวกัน สคริปต์สำหรับฝึกฝนที่ใช้ข้อมูลจากการบันทึกฮาร์ดแวร์ ก็จะสามารถใช้ข้อมูลจากการบันทึก Simulation ได้โดยไม่ต้องแก้ไข Dataset ที่อัปโหลดจาก Simulation จะอยู่ร่วมกับข้อมูลจากการบันทึกฮาร์ดแวร์ใน Repository เดียวกันบน Hub
การบันทึกบนฮาร์ดแวร์จริง
หากต้องการบันทึกการสาธิตบน SO-101 จริง แทนที่จะเป็นการจำลอง ให้ใช้ LeRobot's record CLI โดยตรง Strands ไม่ได้ครอบคลุมคำสั่งนี้เป็น AgentTool เพราะ LeRobot ทำงานได้ดีอยู่แล้ว:
# คำสั่งบันทึกบนฮาร์ดแวร์ (จากต้นฉบับ)
# lerobot-record --robot-type SO-101 --output-dir ./my-datasetDataset ที่ได้จากคำสั่งนี้จะมีรูปแบบเดียวกับการบันทึกใน Simulation หากต้องการ Fine-tune Policy ด้วย Dataset นี้ ให้ใช้ LeRobot's training CLI (lerobot-train) ซึ่งการฝึกฝนอยู่นอกเหนือขอบเขตของบทความนี้ และเป็นไปตาม Workflow มาตรฐานของ LeRobot ตั้งแต่ขั้นตอนที่ 3 เป็นต้นไป Agent จะสามารถใช้ Checkpoint เดิมหรือ Checkpoint ที่ Fine-tune แล้วสลับกันได้ สำหรับการตั้งค่าฮาร์ดแวร์ SO-101 ฉบับเต็ม, คำแนะนำการ Calibration, และการแก้ไขปัญหา โปรดดูที่ README ในโฟลเดอร์ตัวอย่าง
ขั้นตอนที่ 3: รัน Policy ในสภาพจำลอง
เมื่อมี Dataset อยู่บน Hub แล้ว ขั้นตอนต่อไปคือการรัน Policy ตัวอย่างจะใช้ Robot() factory ในโหมดจำลองเริ่มต้น แล้วเชื่อมต่อ gr00t_inference เพื่อให้ Agent จัดการ Container ได้
# ตัวอย่างการรัน Policy (จากต้นฉบับ)
# ...เบื้องหลัง Agent จะรัน gr00tinference(action="lifecycle", lifecycle="full", ...) เพื่อดึง Image ของ GR00T, ดาวน์โหลด Checkpoint จาก Hub, และเริ่ม Service สำหรับการอนุมาน จากนั้นจะรัน runpolicy action บนหุ่นยนต์จำลอง โดยใช้ policyprovider="groot" และส่ง Host และ Port ของ GR00T service ไปใน policyconfig dict (Container สามารถเข้าถึงได้ที่ Port 5555) Simulation จะทำงานตาม Action chunks ของ Policy และผลลัพธ์สามารถดูได้จากการ Render ผ่าน Simulation.render

การใช้ LerobotLocalPolicy (สำหรับ In-process inference)
สำหรับนักพัฒนาที่ต้องการ In-process inference (ไม่ต้องใช้ Container, ไม่ต้องใช้ ZeroMQ (ZMQ)) ให้เปลี่ยน gr00t_inference เป็น LerobotLocalPolicy instance ที่โหลดจาก Hub repository Provider จะส่ง Model ID ใดๆ ภายใต้ lerobot/ organization ไปยัง In-process path โดยอัตโนมัติ:
LerobotLocalPolicy รองรับ ACT, Diffusion Policy, SmolVLA, π0, และ π0.5 รวมถึงโมเดลอื่นๆ ที่ LeRobot's policy registry สามารถจัดการได้จาก config.json Real-Time Chunking จะเปิดใช้งานอัตโนมัติสำหรับ Flow-matching policies ที่มี rtc_config (เช่น π0, SmolVLA)
NVIDIA Cosmos 3 ที่เพิ่งเปิดตัว ก็สามารถใช้งานเป็น Policy provider ผ่านอินเทอร์เฟซเดียวกันนี้ได้ ทำให้โค้ด Agent ไม่ต้องเปลี่ยนแปลง ไม่ว่าจะเลือกใช้ Provider ใด
ข้อควรทราบ: LerobotLocalPolicy จะโหลด Hugging Face models ด้วย trustremotecode=True หากต้องการเปิดใช้งาน ให้ตั้งค่า STRANDSTRUSTREMOTE_CODE=1 และโหลด Checkpoints จาก Organization ที่คุณไว้ใจเท่านั้น
ขั้นตอนที่ 4: นำ Policy ไปใช้กับฮาร์ดแวร์จริง
ขั้นตอนนี้ใช้โค้ดเดียวกันกับขั้นตอนที่ 3 โดยเปลี่ยนเพียง Keyword argument เดียว คือการตั้งค่า mode="real" ใน Robot() factory ซึ่งจะคืนค่าเป็นห
ขอบคุณ แหล่งข้อมูล
https://huggingface.co/blog/amazon/strands-lerobot-hub-to-hardware