ABEJA Tech Blog

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

【初心者でも】ロボットアーム SO-101組み立てレポート ※ 旧手順【ロボット作りたい】

2025/06/16: 情報を更新しました!
新しい手順は下記をご覧いただけると幸いです!

tech-blog.abeja.asia

本記事の手順は古いので、旧手順を何かで参照したい場合にお使いください!

本記事の手順が古いことを判った上で参照したい方は進んでください!


はじめに

こんにちは。
株式会社ABEJAのシステム開発部でエンジニアをしている中島です。
最近ではAIの発展はもちろんのこと、現実世界に作用するロボット分野も発展がめざましいように感じます。
個人でも簡単に触れることができる環境が整ってきているので、これからロボットに興味を持つ方も多いのではないでしょうか?

私自身、ロボットに関しましては初学者ですが、この記事ではHugging Face(LeRobot)のSO-101の組み立てを行ったレポートを届けることができればと思っております。
基本的には公式ドキュメントを踏襲しますが、 自分がつまずいた点を含めて説明することで他のどなたかの一助となれば幸いです。

先にまとめ

  • 基本的に公式の手順そのままで苦労なく組み立て可能です。
  • モーターのファームウェアは更新すること!
  • 組み立て後に結線するのは非常に面倒なので、モーターの結線は先にしてから組み立てる方が良いです。
  • この記事でやることは下記です
    • 公式ドキュメントに則ったSO-101の組み立て
      • テレオペレーションまで
  • この記事でやらないこと
    • 組み立て後の模倣学習
    • カメラの設定

事前準備

パーツの入手

パーツの入手を行います。
完成品もありますが現在ではまだ発売されていない状況のため、組み立てキットが入手しやすいです。
モーターキット / プリントパーツ別々での販売なので、それぞれのページから購入します。

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"

組み立て手順

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

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以外はモーターに減速比が記載されているので、箱から出してしまった場合はそちらで確認してください。

  • フォロワーアームは1/345の減速比を持つ6つのSTS3215モーターを使用します。
    Pro kitの場合はFeetech STS3215-C018, そうでない場合は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/scripts/find_motors_bus_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. フォロワーアームも同様にポートを確認してください。

設定ファイルの更新

  1. SO101RobotConfigportのデフォルト値を更新します。 下記の様に設定ファイルを更新してください。

      @RobotConfig.register_subclass("so101")
      @dataclass
      class So101RobotConfig(ManipulatorRobotConfig):
          calibration_dir: str = ".cache/calibration/so101"
          # `max_relative_target` limits the magnitude of the relative positional target vector for safety purposes.
          # Set this to a positive scalar to have the same value for all motors, or a list that is the same length as
          # the number of motors in your follower arms.
          max_relative_target: int | None = None
    
          leader_arms: dict[str, MotorsBusConfig] = field(
              default_factory=lambda: {
                  "main": FeetechMotorsBusConfig(
      -               port="/dev/tty.usbmodem58760431091",
      +               port="{リーダーポートを入力}",
                      motors={
                          # name: (index, model)
                          "shoulder_pan": [1, "sts3215"],
                          "shoulder_lift": [2, "sts3215"],
                          "elbow_flex": [3, "sts3215"],
                          "wrist_flex": [4, "sts3215"],
                          "wrist_roll": [5, "sts3215"],
                          "gripper": [6, "sts3215"],
                      },
                  ),
              }
          )
    
          follower_arms: dict[str, MotorsBusConfig] = field(
              default_factory=lambda: {
                  "main": FeetechMotorsBusConfig(
      -                port="/dev/tty.usbmodem585A0076891",
      +                port="{フォロワーポートを入力}",
                      motors={
                          # name: (index, model)
                          "shoulder_pan": [1, "sts3215"],
                          "shoulder_lift": [2, "sts3215"],
                          "elbow_flex": [3, "sts3215"],
                          "wrist_flex": [4, "sts3215"],
                          "wrist_roll": [5, "sts3215"],
                          "gripper": [6, "sts3215"],
                      },
                  ),
              }
          )
    

モーターIDの設定

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

     uv run python lerobot/scripts/configure_motor.py \
       --port {モーターバスのポート} \
       --brand feetech \
       --model sts3215 \
       --baudrate 1000000 \
       --ID 1
    

    設定時に動画の様に音が鳴るので驚かないよう注意してください。 youtu.be

  4. ID 6まで、すべてのモーターでこのプロセスを繰り返します。

  5. フォロワーアームも同様にモーターIDを設定します。

ジョイントの組み立て

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

組み立てる際にはモーター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のキャリブレーションを行います。

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

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

フォロワーアーム/リーダーアームを所定の位置に順番に移動する必要があります。

回転位置はロボットの右側なので、作業場所を整理することをお勧めします。

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

  1. 両方のアームが接続されていることを確認し、下記のスクリプトを実行して手動キャリブレーションを開始します。

     uv run python lerobot/scripts/control_robot.py \
       --robot.type=so101 \
       --robot.cameras='{}' \
       --control.type=calibrate
    
  2. 下記メッセージを表示したらフォロワーアームを下記画像の状態にしてEnterを押下します。

     Running calibration of so101 main follower...
     Please move the robot to the new middle position for calibration, then press Enter...
    

  3. 下記メッセージを表示したらフォロワーアームを下記画像の状態にしてEnterを押下します。

     Move arm to zero position
     See: https://raw.githubusercontent.com/huggingface/lerobot/main/media/so101/follower_zero.webp
     Press Enter to continue...
    

  4. 下記メッセージを表示したらフォロワーアームを下記画像の状態にしてEnterを押下します。

     Move arm to rotated target position
     See: https://raw.githubusercontent.com/huggingface/lerobot/main/media/so101/follower_rotated.webp
     Press Enter to continue...
    

  5. 下記メッセージを表示したらフォロワーアームを下記画像の状態にしてEnterを押下します。

     Move arm to rest position
     See: https://raw.githubusercontent.com/huggingface/lerobot/main/media/so101/follower_rest.webp
     Press Enter to continue...
    

  6. リーダーアームで同様の操作を行います。

ロボットの制御

おめでとうございます 🎉

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

テレオペレーション

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

uv run python lerobot/scripts/control_robot.py \
  --robot.type=so101 \
  --robot.cameras='{}' \
  --control.type=teleoperate

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

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

youtu.be

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

youtu.be

おわりに

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

私個人といたしましては、今後はカメラを搭載し、ROSベースでの制御や模倣学習等を行っていきます!

それではまた!

We Are Hiring!

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

careers.abejainc.com