ソフトウェアのセットアップ
LeRobot のインストール、SO-101 ロボットの構成、サーボのキャリブレーション、リーダーとフォロワーのテレオペのセットアップ、Python API、およびトラブルシューティング。 Python の新規インストールからアームの実行までのすべて。
セクションにジャンプします:
ルロボットのインストール
SO-101 に必要なソフトウェア パッケージは LeRobot のみです。 サーボ通信、キャリブレーション、テロップ、データ記録を処理します。
仮想環境を作成する
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 ロボット構成が組み込まれています。 フォロワー アーム (2 アーム テレオペを使用している場合はリーダー アーム) の 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
2 アーム (リーダー - フォロワー) 構成
# ~/.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 バス アームとは異なり、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 は、各関節を 3 つのポーズに配置するように求めます。
- ホームポジション: アームを完全に伸ばし、エンドエフェクターを前方に向けた状態
- ゼロトルク位置: 重力下で自然に垂れ下がった腕
- 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
アームを手動で動かします(コンプライアンスモード)。 関節の位置は自宅ではゼロ近くにあり、各関節を動かすにつれて滑らかに増減するはずです。
再キャリブレーションのヒント: ジョイントを分解したり、サーボを交換したり、ジョイントの位置がずれていることに気づいたときは、必ずキャリブレーションを再実行してください。 キャリブレーション ファイルはアームのシリアル番号ごとに保存され、自動的にリロードされます。
リーダーとフォロワーの遠隔操作
SO-101 は、リーダーとフォロワーの遠隔操作用に設計されています。1 つのアーム (リーダー) が手の動きを捕捉し、2 番目のアーム (フォロワー) がそれをリアルタイムで反映します。 これにより、最高品質のトレーニング デモンストレーションが生成されます。
リーダーとフォロワーのテロップを開始する
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
シングルアーム キーボード テロップ (セカンド アームなし)
腕が 1 つしかない場合は、キーボード制御モードを使用します。
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 クイックスタート
CLI スクリプトを使用せずに、LeRobot ロボット API を介して SO-101 を直接制御できます。
基本的な関節制御
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 の問題.