最近、フィジカルAIという言葉をよく聞くようになり、ロボットに詳しい人に、初心者は何から始めたらいいかと聞いたら、LeRobot SO-101がオススメといわれ、よく分からないけど、とりあえず買ってみた。
本記事では、基本的に公式記載のとおりのことを書いてるが、私が悩んだところはChatGPTに聞いたりして補記してる。
購入
ここで購入
https://akizukidenshi.com/catalog/g/g131169/
来た!
私の環境
- MacBook Pro 2021 (M1 Pro)
- macOS Sonoma
セッティング
このサイトを見ながらやってみた。
バージョン
- Python 3.10 以上
- PyTorch 2.2 以上
バージョンの確認方法
python3 -V
python3 -c "import torch; print(torch.__version__)"
環境セットアップ
conda を使って Python の仮想環境(virtual environment)をセットアップ
conda create -y -n lerobot python=3.10
conda activate lerobot
ffmpeg をインストール
conda install ffmpeg -c conda-forge
LeRobot をインストール
git clone https://github.com/huggingface/lerobot.git
cd lerobot
ライブラリを編集可能モードでインストール
pip install -e .
サーボモータFeetech 用の追加パッケージ(SDK)を入れる。
pip install -e ".[feetech]"
組み立て
リーダーアームとフォロワーアーム
リーダーアームとフォロワーアーム、2つのロボットアームを組み立てる。
リーダーアームで人間の操作を学習し、フォロワーアームで動きを模倣させることができる。
最初、そういうことも知らず、1つは予備なのかと思ってた。
リーダーアームとフォロワーアームは先端部分に相違があって、以下のような拳銃のグリップみたいなものがある方がリーダーアーム。
組み立て開始
こちらのリンク先を見ながら組み立てた。
https://huggingface.co/docs/lerobot/so101
こちらの説明動画ではケーブルをつけずに組み立てしてるが、あとで大変なのでケーブルをつけて組み立てた方がいい。(私は大変だった)
フォロワーアームには、ギア比 1/345 の STS3215 モーターを 6個使用。
リーダーアームでは、自重を支えられ、かつ大きな力を必要とせずに手で動かせるように、3種類の異なるギア比のモーターを使用する。
どの関節にどのモーターを使うかは、下の表とおり。
| Leader-Arm Axis | Motor | Gear Ratio |
|---|---|---|
| Base / Shoulder Pan | 1 | 1 / 191 |
| Shoulder Lift | 2 | 1 / 345 |
| Elbow Flex | 3 | 1 / 191 |
| Wrist Flex | 4 | 1 / 147 |
| Wrist Roll | 5 | 1 / 147 |
| Gripper | 6 | 1 / 147 |
できた!
最初、リーダーアームもフォロワーアームもまったく同じものかと思って、リーダーアームとフォロワーアームに使うモーターを逆にしてしまって、途中で気づき最初からやり直すのが面倒だったため、先端だけ色が違う乳牛みたいなロボットアームになったww
モーターの設定
1. 各アームに対応する USB ポートを特定する
付属のモーターバスを出す。
※モーターバスとは、PC(USB)とサーボ(TTL 3ピン)の橋渡しをする装置のこと
モーターバスは2つある。両方同じもので、1つをリーダーアーム用、もう1つをフォロワーアーム用とする。
まずは、リーダーアーム用のモーターバスに付属のアダプターを接続し、付属のUSB でコンピュータに接続する。
その後、次のスクリプトを実行
lerobot-find-port
こんな表示が出る。
Finding all available ports for the MotorsBus.
Ports before disconnecting:
['/dev/tty', '/dev/ttyp0', .............
........, '/dev/tty.usbmodem5AB90691591']
Remove the USB cable from your MotorsBus and press Enter when done.
Remove the USB cable という指示が表示されたら USBを取り外し、エンターを押す。
すると、
The port of this MotorsBus is '/dev/tty.usbmodem5AB90691591'
つまり、ポートは
/dev/tty.usbmodem5AB90691591
となる。
このコマンドはUSBを差した時と抜いた時の差分からポートを判断している。
このポート番号は控えておく。
同様に、フォロワーアーム用のモーターバスをPCに接続し、ポート番号を調べる。
The port of this MotorsBus is '/dev/tty.usbmodem5AB90689241'
2. モーターの ID とボーレート(通信速度)の設定
各モーターは、バス上で一意に識別される ID(識別番号) を持っている。
新品のモーターは通常、デフォルトで ID = 1 に設定されている。
しかし、モーター同士やコントローラが正しく通信するためには、すべてのモーターに重複しない “別々の ID” を設定する必要がある。
さらに、バス上でデータを送受信する速度は ボーレート(baudrate) によって決まる。
コントローラとモーターが互いに通信できるようにするには、全モーターとコントローラを同じボーレートに設定する必要がある。
これらの設定を行うために、まずコントローラを使って各モーターを1つずつ個別に接続し、ID とボーレートを設定する。
これらの設定値は、モーター内部の 不揮発性メモリに保存されるため、一度設定すれば再度行う必要はない。
コンピュータとモーターバスを接続。
その後、先ほどの手順で取得したポートを使って、以下のコマンドを実行する。
lerobot-setup-motors \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5AB90689241 # <- paste here the port found at previous step
次の指示が表示される。
Connect the controller board to the 'gripper' motor only and press enter.
指示どおり、グリッパーモーターを接続。
その際、接続されているのがそのモーター1つだけであること、
また、モーター同士がまだ連結されていないこと を確認。
Enter を押すと、スクリプトがそのモーターの ID とボーレート(通信速度)を自動的に設定する。
'gripper' motor id set to 6
続けて指示通りにする。
Connect the controller board to the 'wrist_roll' motor only and press enter.
これらを全モーターで繰り返す。
'wrist_roll' motor id set to 5
Connect the controller board to the 'wrist_flex' motor only and press enter.
'wrist_flex' motor id set to 4
Connect the controller board to the 'elbow_flex' motor only and press enter.
'elbow_flex' motor id set to 3
Connect the controller board to the 'shoulder_lift' motor only and press enter.
'shoulder_lift' motor id set to 2
Connect the controller board to the 'shoulder_pan' motor only and press enter.
'shoulder_pan' motor id set to 1
リーダーアームについては、以下のコマンドで、手順はフォロワーアームと同じ。
lerobot-setup-motors \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5AB90691591
ここまで来たら、モーターの電源を確保するために、各モーターをケーブルで連結する。 これはロボットやってる人にとっては当たり前のことかもしれないのかチュートリアルに全然触れられてなくて、初心者の私は最後まで悩んだ。
モーターバスの固定
(2025.11.23追加)
キャリブレーション
次に、ロボットのキャリブレーションを行う。
これは リーダーアームとフォロワーアームが、同じ物理的な位置にあるときに、同じ位置データ(ポジション値)を持つようにするため。
まずは、フォロワーアームから
以下のコマンドを実行
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5AB90689241 \ #先ほど調べたポート
--robot.id=my_awesome_follower_arm #好きな名前をつけれる
こんなメッセージが出る。
Press ENTER to use provided calibration file associated with the id my_awesome_follower_arm,
or type 'c' and press ENTER to run calibration:
c を押すと新しくキャリブレーションに進む。
そして、このメッセージが出たら
Move my_awesome_follower_arm SO101Follower to the middle of its range of motion and press ENTER....
ロボットアームをこの状態にしてエンター
この画面が出たら各モーターを稼働範囲いっぱいに動かしてエンター
Recording positions. Press ENTER to stop...
-------------------------------------------
-------------------------------------------
NAME | MIN | POS | MAX
shoulder_pan | 2047 | 2047 | 2047
shoulder_lift | 2047 | 2047 | 2047
elbow_flex | 2047 | 2047 | 2047
wrist_flex | 2047 | 2047 | 2047
wrist_roll | 2047 | 2047 | 2047
gripper | 2047 | 2047 | 2047
リーダーアームも同様に設定する。
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5AB90691591 \ #先ほど調べたポート
--teleop.id=my_awesome_leader_arm #好きな名前をつけれる
これで学習する準備が整った。
ロボットの遠隔操作
とりあえず、遠隔操作をやってみる。
ここをみてやった。
https://huggingface.co/docs/lerobot/il_robots
以下のコマンドでリーダーアームの動きに合わせて、フォロワーアームが動く。
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5AB90689241 \ #先ほど調べたポート
--robot.id=my_awesome_follower_arm \ #先ほど設定した名前
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5AB90691591 \ #先ほど調べたポート
--teleop.id=my_awesome_leader_arm #先ほど設定した名前
動いた!!
感動!!
ロボット知識ゼロだけど、フィジカルAIの勉強のため、LeRobotのロボットアーム「SO-101」を組み立てて動かしてみた。組み立てるだけだから簡単かと思いきや土日2日もかかってしまって、今日はとりあえず遠隔操作まで。
— たつや (@tatsuya1970) November 16, 2025
今後は模倣学習に挑戦してみます。#SO101 #LeRobot pic.twitter.com/WtLkGJvG5c
先端の動きがうまくいってないのは、キャリブレーションがうまくできてないからかな?
(2025.11.23追記)
Xの動画で先端の動きがおかしいのは、リーダーアームのモーターのIDの設定をgriperモーターとwrist_rollモーターの設定が逆にしていたため。
モーターのIDを再設定したら直った。
その2へ続く。









