הגדרת תוכנה
התקנת LeRobot, תצורת רובוט SO-101, כיול סרוו, הגדרת teleop leader-follower, Python API ופתרון בעיות. הכל מהתקנה חדשה של Python ועד לזרוע רצה.
קפוץ לקטע:
התקנת LeRobot
LeRobot היא חבילת התוכנה היחידה שאתה צריך עבור SO-101. הוא מטפל בתקשורת סרוו, כיול, טלאופ והקלטת נתונים.
צור סביבה וירטואלית
python -m venv ~/.venvs/so101
source ~/.venvs/so101/bin/activate # Windows: .venvs\so101\Scripts\activate
התקן את LeRobot
pip install lerobot
בדוק את ההתקנה
python -c "import lerobot; print(lerobot.__version__)"
התקן ממקור (אופציונלי - לתכונות העדכניות ביותר)
git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e ".[so101]"
תצורת רובוט SO-101
LeRobot כולל תצורת רובוט מובנית SO-101. אתה מציין את יציאת ה-USB עבור זרוע העוקבת (וזרוע מוביל אם אתה משתמש בשתי זרועות).
מצא את יציאת ה-USB שלך
# Linux / macOS
ls /dev/ttyUSB* # typical: /dev/ttyUSB0, /dev/ttyUSB1
ls /dev/tty.usbserial* # macOS alternative
# Windows — check Device Manager → Ports → COMx
תצורת SO-101 YAML
LeRobot משתמש בתצורה מוטבעת בשורת הפקודה או בקובץ YAML. עבור התקנה עם זרוע אחת:
# ~/.lerobot/robots/so101_follower.yaml
robot_type: so101
port: /dev/ttyUSB0 # update to your port
cameras:
wrist_cam:
type: opencv
index_or_path: 0
fps: 30
width: 640
height: 480
תצורת שתי זרועות (מנהיג-עוקב).
# ~/.lerobot/robots/so101_bimanual.yaml
robot_type: so101
port: /dev/ttyUSB1 # follower arm
leader_arms:
main:
type: so101
port: /dev/ttyUSB0 # leader arm
cameras:
top_cam:
type: opencv
index_or_path: 0
fps: 30
width: 640
height: 480
בדיקת חיבור
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=none # just connects and reads state
אתה אמור לראות קריאות מיקום משותפות מודפסות. אם אתה מקבל שגיאת יציאה, בדוק פתרון בעיות.
כיול סרוו
בניגוד לזרועות CAN-bus המשתמשות במקודדים מוחלטים, הסרוו של Feetech STS3215 זקוקים לכיול כדי להגדיר את מיקומי האפס שלהם. LeRobot מטפל בזה באופן אוטומטי.
הפעל כיול
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=calibrate
התסריט ינחה אותך להזיז את הזרוע לתנוחות ספציפיות (בית, דק, מקסימום עבור כל מפרק) וללחוץ על Enter בכל עמדה. זה שומר נתוני כיול ל ~/.cache/huggingface/lerobot/calibration/so101/.
עמדות כיול
LeRobot יבקש ממך למקם כל מפרק בשלוש תנוחות:
- עמדת בית: זרוע מושטת לגמרי, גורם קצה מצביע קדימה
- מצב מומנט אפס: זרוע תלויה באופן טבעי תחת כוח הכבידה
- התייחסות של 90 מעלות: כל מפרק בנקודת האמצע שלו
ודא כיול
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=teleoperate # move arm by hand to verify joint readout
הזז את הזרוע באופן ידני (מצב תאימות). עמדות המפרק אמורות לקרוא כמעט אפס בבית ולהגדיל/להקטין בצורה חלקה ככל שאתה מזיז כל מפרק.
טיפ לכיול מחדש: הפעל שוב כיול בכל פעם שאתה מפרק מפרק, מחליף סרוו או מגלה שמצבי המפרק נסחפים. קבצי כיול מאוחסנים במספר סידורי לכל זרוע ונטענים מחדש באופן אוטומטי.
Teleoperation מנהיג-עוקב
ה-SO-101 מיועד להפעלה מרחוק של מנהיג-עוקב: זרוע אחת (מנהיג) לוכדת את תנועות היד שלך, והזרוע השנייה (עוקבת) משקפת אותן בזמן אמת. זה מייצר הדגמות אימונים באיכות הגבוהה ביותר.
התחל טלאופ מנהיג-עוקב
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB1 \
--robot.leader_arms.main.type=so101 \
--robot.leader_arms.main.port=/dev/ttyUSB0 \
--control.type=teleoperate
טלאופ מקלדת עם זרוע אחת (ללא זרוע שנייה)
אם יש לך רק זרוע אחת, השתמש במצב שליטה במקלדת:
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=teleoperate \
--control.teleop_keys=true
מצב תאימות / פיצוי כבידה
הכנס את זרוע המוביל למצב מומנט נמוך כדי שתוכל להזיז אותה בחופשיות עם היד שלך:
python -c "
from lerobot.common.robot_devices.robots.so101 import SO101Robot
robot = SO101Robot(port='/dev/ttyUSB0')
robot.connect()
robot.set_compliance_mode(True) # arm moves freely under hand guidance
"
התחלה מהירה של Python API
אתה יכול לשלוט ב-SO-101 ישירות דרך ה-API הרובוט של LeRobot ללא סקריפטים של CLI.
שליטה משותפת בסיסית
from lerobot.common.robot_devices.robots.so101 import SO101Robot
import torch
robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()
# Read current joint positions (6 DOF)
obs = robot.capture_observation()
print("Joint positions:", obs["observation.state"])
# Send joint position command (in degrees, normalized to [-1, 1] range)
action = torch.zeros(6) # all joints to zero position
robot.send_action(action)
robot.disconnect()
פיצוי כבידה (מצב הניתן לאחור)
from lerobot.common.robot_devices.robots.so101 import SO101Robot
robot = SO101Robot(port="/dev/ttyUSB0")
robot.connect()
# Enable backdrive — arm can be moved freely by hand
robot.set_compliance_mode(True)
import time
for _ in range(100):
obs = robot.capture_observation()
print(obs["observation.state"]) # prints live joint positions as you move arm
time.sleep(0.02)
robot.disconnect()
קריאת מצב סרוו
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
bus = FeetechMotorsBus(port="/dev/ttyUSB0",
motors={"joint1": (1, "sts3215"),
"joint2": (2, "sts3215"),
"joint3": (3, "sts3215"),
"joint4": (4, "sts3215"),
"joint5": (5, "sts3215"),
"gripper": (6, "sts3215")})
bus.connect()
positions = bus.read("Present_Position", ["joint1", "joint2", "joint3"])
print("Positions:", positions)
bus.disconnect()
3 הבעיות הנפוצות ביותר
FileNotFoundError: /dev/ttyUSB0
בקר ה-USB לא מזוהה. בדרך כלל דרייבר חסר או שהכבל מנותק.
לִקְבּוֹעַ:
# Check if the device is listed
ls /dev/ttyUSB* # Linux
ls /dev/tty.usbserial* # macOS
# Linux: add yourself to the dialout group (requires logout)
sudo usermod -aG dialout $USER
# Windows: install CP2102 or CH340 USB driver,
# then check Device Manager for COM port number
סרוו מחוברים פיזית אבל LeRobot לא יכול לקרוא את עמדותיהם. בדרך כלל בעיית חשמל או קצב שגיאה שגוי.
לִקְבּוֹעַ:
# 1. Verify 5V power supply is connected and LED on servo board is on
# 2. Check all servo daisy-chain cables are fully seated
# 3. Try scanning for servos directly:
python -c "
from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus
bus = FeetechMotorsBus('/dev/ttyUSB0', motors={})
bus.connect()
ids = bus.find_motor_ids()
print('Found motor IDs:', ids)
bus.disconnect()
"
LeRobot חוסך כיול לכל מספר סידורי של זרוע. אם הוא לא יכול למצוא את קובץ הכיול, הוא יזהיר וישתמש בערכי מקודד גולמיים.
לִקְבּוֹעַ:
# Check calibration file location
ls ~/.cache/huggingface/lerobot/calibration/so101/
# Re-run calibration if the file is missing
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--control.type=calibrate
# Pass explicit calibration path if needed
python -m lerobot.scripts.control_robot \
--robot.type=so101 \
--robot.port=/dev/ttyUSB0 \
--robot.calibration_dir=/path/to/calibration \
--control.type=teleoperate
עדיין תקוע? שאל על פורום SO-101 או לבדוק את בעיות של LeRobot GitHub.