ABEJA Tech Blog

中の人の興味のある情報を発信していきます

【初心者が】ロボットアーム SO-101組み立てレポート ※ 2025/06/16更新【手順更新しました】

はじめに

こんにちは。
株式会社ABEJAのシステム開発部でエンジニアをしている中島です。
以前にロボットアームSO-101の組み立てについて記述した記事を公開いたしました。

tech-blog.abeja.asia

しかし季節の移り変わりというのは速いもので、
最近のLeRobot様の更新で手順が少し変わっているとのことなのでまとめ直します。

変更部分は主にパーツの購入箇所、各スクリプトとなります。
組み立ての概要は以前の記事と同様の部分もございますが、
本記事のみを読む方に向けて以前と同じ記述でも省略せず記述いたします。

先にまとめ

  • モーターのファームウェアは更新すること!
  • 組み立て後に結線するのは非常に面倒なので、モーターの結線は先にしてから組み立てる方が良いです。
  • 以前の手順と比較してスクリプトの配置箇所/実行時の引数等が変わっているので、以前の手順を記憶している方は注意してください。
  • この記事でやることは下記です
    • 公式ドキュメントに則ったSO-101の組み立て
      • テレオペレーションまで
  • この記事でやらないこと
    • 組み立て後の模倣学習
    • カメラの設定

全体

基本的には公式の下記手順で問題なく組み上がると思います。

  1. ジョイントの組み立て
    • 各モーターの片側だけに結線してモーター同士は結線しない状態で組み立てる
  2. ポート検索
  3. モーター初期化
    • ID6から順々にモーターを結線して初期化
  4. キャリブレーション
  5. テレオペレーション

しかし、ジョイントの組み立て後に結線するのは面倒です。
特にID:5のモーター等は組み立て後に結線をすると狭い空間で作業を行わなければいけないため、
初心者の自分には少し苦しい部分がありました。

そのため、ここでは下記のように手順を一部変えて紹介します。

  1. ポート検索
  2. モーター初期化
    • ID6から順々にモーターを結線して初期化
  3. ジョイントの組み立て
    • モーター同士を結線した状態で組み立てる
  4. キャリブレーション
  5. テレオペレーション

事前準備

パーツの入手

パーツの入手を行います。
モーターキットとプリントパーツは別々での販売のため、それぞれのページから購入します。
組み立て済みのものもありますが、
今回は組み立てから行うため、モーターキットとプリントパーツをそれぞれ入手します。

私の場合はモーターキットとプリントパーツをそれぞれSeeed Studio様で購入しました。 最近では国内でロボスタディオン様がオンラインショップを開設したので、 プリントパーツにつきましては関税等の煩わしさを避けたい方にはそちらをお勧めします。

パーツを個別で入手される猛者の方はこちらのページを参照して、
それぞれのパーツを購入してください。
モーター類は秋月電子通商様のオンラインまたは秋葉原店2階で購入することが可能なので、日本の方で組み立てを待ちきれない方はこちらがおすすめです。

uvのインストール

LeRobotのスクリプトを実行する際にはuvでパッケージ管理をするのが楽です。
特にこだわりがなければuvをインストールします。
こちらの手順に従ってインストールします。

# Linux or MacOS
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

その他あると便利なもの

  • USB Type-AのUSBハブ
    • リーダーアームとフォロワーアームでUSB Type-Aを2つ使用するので、ポート数が少ないPCを使用している方はあった方が良いです。
    • ある程度の長さのケーブルであれば、アームとPCの位置を柔軟に配置可能なので便利です。
  • マイナスドライバー
    • モーターバスのネジ端子を止める際に使用します。 私の場合、2.5mmのマイナスドライバーを使用しました。
    • モーターを結線する際の押し込みにも利用可能です。
  • クランプ

組み立て手順

下記では実際の組み立て手順を解説した上で動作した様子を記述します。
基本的には公式を踏襲します。
要所要所で図を載せることで、組み立てのイメージをより掴むことができるよういたします。

LeRobotのインストール

  1. ソースコードをCloneします。

     git clone https://github.com/huggingface/lerobot.git
     cd lerobot
    
  2. uvを使用してパッケージをインストールします。

     uv sync --all-extras
    

モーターの設定

  • 各モーターにリーダーLまたはフォロワーFと、1から6までのIDを記入しておくと、後で混乱を防ぐことができます。
  • リーダーアームのモーターIDと減速比は下記です。

    リーダーアーム軸 モーターID 減速比 型番
    ベース/ショルダーヨー 1 1 / 191 Feetech STS3215-C044
    ショルダーピッチ 2 1 / 345 Feetech STS3215-C001
    エルボー 3 1 / 191 Feetech STS3215-C044
    リストロール 4 1 / 147 Feetech STS3215-C046
    リストピッチ 5 1 / 147 Feetech STS3215-C046
    グリッパー 6 1 / 147 Feetech STS3215-C046

    ※ Feetech STS3215-C001/C018/C047以外はモーターに減速比が記載されているので、箱から出してしまった場合はそちらで確認してください。

  • フォロワーアームは1/345の減速比を持つ6つのSTS3215モーターを使用します。
    Pro kitの場合はFeetech STS3215-C018/C047, そうでない場合はFeetech STS3215-C001を使用します。
    フォロワーアームはリーダーアームとは異なり、すべてのモーターの減速比が同じため、モーターIDは適宜割り振ってください。

電源の接続

  • モーターバスに電源を接続します。電圧は使用するモーターによって異なります
    • STS3215 7.4Vモーター → 5V電源
    • STS3215 12Vモーター → 12V電源
  • Pro kitの場合、フォロワーアームは5V電源ではなく12V電源を使用します。
    Pro kitかどうかに関わらず、リーダーアームは常に5V電源を使用します。
    迷ったらリーダーアームに5V電源を接続して、フォロワーアームには残りの電源を接続してください。
  • 電源コードは下記のようにネジ端子で固定してください。

  • 電源を接続すると、下記のようにLEDが点灯します。

次に、USB経由でモーターバスをコンピュータに接続します。 USBは電源を供給しないため、電源とUSBの両方を接続する必要があります。

各モーターバスに関連付けられたUSBポートを見つける

  1. リーダーアーム用のモーターバスのみを接続した状態で実行してください。

     uv run python lerobot/find_port.py
    
  2. 下記の出力が出たらモーターバスの接続を取り外してEnterを押下してください。

     Finding all available ports for the MotorBus.
     ['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
     Remove the USB cable from your MotorsBus and press Enter when done.
    

    うまくいった場合は下記のようにポートの特定ができます

     The port of this MotorsBus is /dev/tty.usbmodem575E0031751
     Reconnect the usb cable.
    

    上記の場合 /dev/tty.usbmodem575E0031751がリーダーアームのポートです。

  3. フォロワーアームも同様にポートを確認してください。

設定ファイルの更新

以前の手順でポート確認の後に設定ファイルの変更が必要でした。 新しい手順では設定ファイルがなくなっていることに注意してください。

モーターIDの設定

  1. リーダーアームのモーターバスをポートに接続します。
  2. リーダーアームのモーターバスとモーターID6を割り振ったモーターを接続します。
  3. 下記のスクリプトを実行します。

     uv run python -m lerobot.setup_motors \
       --teleop.type=so101_leader \
       --teleop.port={先ほどメモしたリーダーアームのポート}
    

    ※ Windows のコマンドプロンプトで実行するときは改行をしないようにしてください。(以降の説明では省略します)

  4. 下記の出力が出たらEnterを押下してください。

     Connect the controller board  to the 'gripper' motor only and press enter
    

    設定時に動画のように音が鳴る場合があるので驚かないよう注意してください。 youtu.be うまくいった場合は下記のようにモーターID6の設定を完了します。

     'gripper' motor id set to 6.
    
  5. 下記の出力が出たら、リーダーアームのモーターID6を結線したモーターバスを取り外してください。

     Connect the controller board  to the 'wrist_roll' motor only and press enter
    
  6. リーダーアームのモーターバスとモーターID5を割り振ったモーターを接続してEnterを押下してください。
  7. 上記の手順を繰り返してモーターID1まで設定してください。

フォロワーアームも同様ですが、 3の手順で使用するスクリプトの引数が下記のように変わることに注意してください。

uv run python -m lerobot.setup_motors \
  --robot.type=so101_follower \
  --robot.port={先ほどメモしたフォロワーアームのポート}

ジョイントの組み立て

公式の動画を参考にジョイントを組み立てます。

組み立てる際にはモーターID1からモーターID6まで順に結線しながら組み立ててください!
組み立てた後で結線するのは非常に面倒です!

各ジョイント組み立て後の画像を下記に示します。

  1. ジョイント1

  2. ジョイント2

  3. ジョイント3

  4. ジョイント4 画像なし

  5. ジョイント5

  6. リーダー

  7. フォロワーアームも同様に組み立てます。

ファームウェアの更新(Windows PCのみで可能)

(Seeed Studioで2025/05/30以前にモーターキットを入手した場合は特に)モーターのファームウェアを更新してください!
ファームウェアを更新しない場合、キャリブレーションでエラーが出続けるなどの現象が発生しました!

Seeed StudioのWikiに則ってモーターのファームウェアを更新します。

  1. Feetechの公式サイトでソフトウェアを入手してください。
  2. 両方のアームをWindows PCに接続した状態でソフトウェアを起動してください。
  3. 下記の値を設定し「Open」を押下します。

    1. Com: リーダーアームのポート
    2. BaudR: 1000000

  4. 「Search」を押下して接続したモーターを表示することを確認してください。
    表示しない場合はケーブルの結線を確認してください。

  5. モーターすべてを確認したら「Stop」を押下してください。

  6. 画面上部「Upgrade」を押下してください。
  7. ID1のモーターを選択した状態で「Online」を押下してください。
  8. 図のようにアップグレード内容を表示したら画面下部「Upgrade」を押下してファームウェアをアップグレードしてください。

  9. すべてのモーターのファームウェアをアップグレードしてください。

  10. 同様の手順でフォロワーアームのモーターについてファームウェアをアップグレードしてください。

キャリブレーション

次に、SO-101のキャリブレーションを行います。

これにより、リーダーアームとフォロワーアームが同じ物理的位置にあるときに同じ位置値を持つことが保証されます。

フォロワーアーム/リーダーアームの手動キャリブレーション

旧手順とは違い、4つのポジションを取る形ではなくなっています

フォロワーアームとリーダーアームを所定の位置にセットした後に、可動域の最大と最小まで動かす必要があります。

作業場所を整理することをお勧めします。

※ 正確な状態を表記するため、下記では公式の画像を転載しています。

  1. リーダーアームが接続されていることを確認し、下記のスクリプトを実行します。

     uv run python -m lerobot.calibrate \
         --teleop.type=so101_leader \
         --teleop.port={先ほどメモしたリーダーアームのポート} \
         --teleop.id={リーダーアームに対して一意のIDを設定してください。my_leader_arm、等}
    
  2. 下記メッセージを表示したらミドルポジションにリーダーアームを合わせてEnterを押下します。

     Running calibration of my_awesome_leader_arm SO101Leader
     Move my_awesome_leader_arm SO101Leader to the middle of its range of motion and press ENTER....
    

    ミドルポジションは下記のようにID3のモーターあたりで90度に曲げ、前方に伸ばす感じです。

  3. 下記メッセージを表示したらリーダーアームの各モーターを可動域いっぱい動かしましょう。 各モーターを動かすとPOSの値が動いて、各モーターの最大(MAX), 最小(MIN)の可動域を表示します。

     -------------------------------------------
     NAME            |    MIN |    POS |    MAX
     shoulder_pan    |   2038 |   2045 |   2047
     shoulder_lift   |   1210 |   1220 |   2047
     elbow_flex      |   2047 |   2831 |   2831
     wrist_flex      |   2047 |   2048 |   2048
     wrist_roll      |   2045 |   2046 |   2048
     gripper         |   2043 |   2043 |   2048
    

    ※ 全モーターを動かすと、どのモーターを動かしたかわからなくなるので、ID6のグリッパーから始め、ID1の根元のモーターを動作させることをおススメします。

    実際のキャリブレーションのイメージはこちらの動画を参照してください。

  4. 各モーターの可動域すべて動作させたらEnterを押下します。 うまくいった場合は、キャリブレーションデータをユーザーのキャッシュ(Linuxなら~/.cache/huggingface/lerobot/calibration/teleoperators/so101_leader/{ID}.json)に書き出します。

  5. フォロワーアームでも同様の操作を行います。 スクリプトが下記のように変わりますが、操作自体は同様です。

     uv run python -m lerobot.calibrate \
         --robot.type=so101_follower \
         --robot.port={先ほどメモしたフォロワーアームのポート} \
         --robot.id={フォロワーアームに対して一意のIDを設定してください。my_follower_arm、等}
    

    うまくいった場合は、キャリブレーションデータをユーザーのキャッシュ(Linuxなら~/.cache/huggingface/lerobot/calibration/robots/so101_follower/{ID}.json)に書き出します。

ロボットの制御

おめでとうございます 🎉

ここまできたらロボットの制御が可能です!

テレオペレーション

下記のスクリプトを実行してテレオペレーションをします。

uv run python -m lerobot.teleoperate \
    --robot.type=so101_follower \
    --robot.port={先ほどメモしたフォロワーアームのポート} \
    --robot.id={先ほどキャリブレーションしたフォロワーアームのID} \
    --teleop.type=so101_leader \
    --teleop.port={先ほどメモしたリーダーアームのポート} \
    --teleop.id={先ほどキャリブレーションしたリーダーアームのID}

スクリプト実行後にリーダーアームで行った操作をリアルタイムでフォロワーアームに同期します。

参考までに下記動作時の動画を載せておきます。

youtu.be

12Vの場合アルミ缶を握り潰す程度の力があります。

youtu.be

おわりに

この記事ではLeRobotのSO-101の組み立てを行ったレポートをお届けいたしました。
いくつかつまずく点もありましたが、私のような初学者でも無事組み立て動作を確認することができました。
この記事を読むことで、ロボットに興味を持つ方の少しでも参考となりましたら幸いです。

それではまた!

We Are Hiring!

ABEJAは、テクノロジーの社会実装に取り組んでいます。
技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください! (新卒の方やインターンシップのエントリーもお待ちしております!)

careers.abejainc.com