ゼロから始める “SO-Arm 100”：作り方と動かし方のすべて

自作したロボットアームの製作過程を詳しく紹介します。日本語の記事が少なかったので、同じように挑戦したい人の参考になればと思います！

## そもそもSO-Arm 100って何？

Standard Open Arm 100（SO-Arm 100）は、LeRobotという団体が誰もが手軽にAIロボットを活用できるように開発した模倣学習用の[ロボットアーム](https://github.com/TheRobotStudio/SO-ARM100)です。

日本ではまだキットが市販されていないので、今回は必要な部品を集めて一から作っていきます。

## ロボットアームの種類について

このプロジェクトには2種類のアームがあります。
- **Leader arm**：人が操作するためのコントローラー的なアーム
- **Follower arm**：実際に物を掴んだり動かしたりするアーム
:::note warn
今回は**Follower arm**だけを作ります。
:::

## 必要な部品 （2025年4月30日現在）

- **サーボモーター（STS3215）** × 6個
  - 秋月電子にて購入：6個で約18,000円

https://akizukidenshi.com/catalog/g/g116312/

- **ACアダプター（5V 4A）** × 1個
  - 秋月電子にて購入：約1,500円

https://akizukidenshi.com/catalog/g/g106238/

- **モーター制御基板** × 1個
  - AliExpressにて購入：約1,500円
  ※日本のサイトでは売られていなかったのでアリエクで注文しました

https://ja.aliexpress.com/item/1005006054189812.html

### その他
- USB-Cケーブル × 1本
- Cクランプ × 2個（100均で調達）
- 精密用プラスドライバー

### 費用の合計
- モーターと電源：約20,000円
- 制御基板：約1,500円
- **合計：約22,000円**

:::note
Leader armも作る場合は、同じ部品をもう1セット購入してください。
:::

### オプション
日本のサイトで購入できるサーボモーター (STS3215)

- switch science 

https://www.switch-science.com/products/7489?srsltid=AfmBOoqABnJ7Qf_WBTOwMgV4Z8SgyXloFq720ZWcg709RF1jp4V70yje

- marutsu

https://www.marutsu.co.jp/pc/i/2349133/?srsltid=AfmBOoo7w-v3Vjc2vH0SV72EoKYAArLorjkJUYTegfi8aEtu0IGZdruD

カメラの紹介: 32×32 mm UVC Module

- グリッパーカメラ(その1)
1080P、視野角130° (公式で紹介されているもの)

https://www.amazon.co.jp/gp/aw/d/B0CNCSFQC1?psc=1&ref=ppx_pop_mob_b_asin_title

- グリッパーカメラ(その2)
720P、視野角120°

https://www.amazon.co.jp/dp/B0CLRJZG8D?_encoding=UTF8&psc=1&social_share=cm_sw_r_cp_ud_dp_7JZ06RNGRN81RJHHHTJS&previewDoh=1

## 3Dプリンターでパーツを印刷

今回はBambulab A1 miniという3Dプリンターを使ってパーツを印刷しました。

GitHubのリポジトリの中の[stl_files_for_3dprinting](https://github.com/TheRobotStudio/SO-ARM100/tree/main/stl_files_for_3dprinting)にSTLファイルが入っています。

Follower arm用のstlファイルをPCアプリで開いてからエクスポートし、SDカードに移して印刷します。([詳しい使い方](https://zenn.dev/karaage0703/articles/5d6fa4585dc5c5))

### 印刷時間と設定
- Bambulab A1 mini用のファイルは2つに分かれています
- 印刷速度は50%に設定
- **印刷時間**：part_1で約6時間、part_2で約7時間

## 環境構築 （M2 Macの場合）

### 1. Minicondaをインストール

```bash
# ---- Miniconda (Apple Silicon) ----
mkdir -p ~/miniconda3
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
source ~/miniconda3/bin/activate
conda init --all
```

### 2. LeRobot用の仮想環境を作成

```bash
conda create -y -n lerobot python=3.10
conda activate lerobot
```

### 3. LeRobot をgit clone

```bash
git clone https://github.com/huggingface/lerobot.git ~/lerobot
```

### 4. Feetechモーター用の依存パッケージをインストール

```bash
cd ~/lerobot
pip install -e ".[feetech]"
```

### 5. データ記録ツールをインストール

```bash
conda install -y -c conda-forge ffmpeg
pip uninstall -y opencv-python
conda install -y -c conda-forge "opencv>=4.10.0"
```

## モーターのセットアップ

モーター制御基板をPCと電源、モーター1個に接続します。

USBポート名の確認：
```bash
python lerobot/scripts/find_motors_bus_port.py
```
指示に従ってケーブルを外し、Enterを押すとUSBの名前が表示されます。その表示された名前（例：`/dev/tty.usbmodem58FA0432123`）をコピーしておきます。

設定ファイルを編集：
```bash
lerobot/lerobot/common/robot_devices/robots/configs.py
```
上記のファイルを開いて、`follower_arms`の`port=`の部分を先ほどコピーしたUSBポート名に変更します。

各モーターにIDを設定（ID 1 の例）：
```bash
python lerobot/scripts/configure_motor.py \
  --port /dev/tty.usbmodem＜自分のポート名＞ \
  --brand feetech \
  --model sts3215 \
  --baudrate 1000000 \
  --ID 1
```

実行すると、以下のような出力が出ます：
```bash
Connected on port /dev/tty.usbmodem58FA0432123
Scanning all baudrates and motor indices
100%|███████████████████████| 9/9 [00:00<00:00, 16.45it/s]
Motor index found at: 1
Setting its index to desired index 1
Present Position [2049]
Offset [0]
```

2台目以降は --ID 2 から --ID 6 と変えて6回実行してください。
行末の \ は**最後の行には付けない**こと。

## 組み立て

組み立てにはおよそ3時間かかります。

### 組み立て時のポイント
- **モーターは先に配線してから**組み込むとスムーズです
- 印刷したパーツがきつくてはまりにくい場合、多少割れても問題ありません
- YouTubeで動画を見ながら組み立てるとわかりやすいです
- 組み立てを楽にする補助パーツ「マウントヘルパー」も公開されています

https://github.com/TheRobotStudio/SO-ARM100/tree/main/Optional/Mount_Helper

### おすすめの参考動画
- [大まかな組み立て方の紹介（公式）](https://www.youtube.com/watch?v=FioA2oeFZ5I)
- [詳細な解説付きの組み立て（Phospho.ai)](https://www.youtube.com/watch?v=PG_EJAeNRfM)
- [ベース部分の組み立て方](https://www.youtube.com/watch?v=temou_Nr5s8)

## キャリブレーションと実際の操作

Follower arm単体でキャリブレーションを行う場合はエラーが発生するため、
`lerobot/lerobot/common/robot_devices/robots/configs.py`の430行あたりにある`leader_arms`の部分をコメントアウトしておきます。

以下のスクリプトでキャリブレーションを実行します。
```bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --robot.cameras='{}' \
  --control.type=calibrate \
  --control.arms='["main_follower"]'
```

以上でキャリブレーションは完了です！

### Phosphobotを使って動かす
LeaderアームなしでFollowerアームを動かすには、Phospho_botというツールを使うのがおすすめです。

インストール：
```bash
brew tap phospho-app/phosphobot
brew install phosphobot
```

実行：
```bash
phosphobot run
```

Phosphobot dashboardを開いて、**必ずキャリブレーション**を行ってください。
（自分はキャリブレーション行わずに操作した結果、グリップのパーツが割れました...）

キャリブレーション後、dashboardの "keyboard control" から "start robot" を押すと、キーボードでロボットアームを操作できるようになります。

## 最後に

初めてのロボットアーム作りは大変でしたが、ぜひ皆さんも挑戦してみてください！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570353/44004cb2-5880-493f-95fb-f70ca1dd90f6.jpeg" width=50%>

## 追記： グリッパーカメラの取り付け方

物を掴む部分を撮影するカメラの取り付けを行います。

### カメラモジュールの取り付け
取り付け方法は2通りあります。
1. グリッパーを取り外し、新たに3Dプリントしたカメラアダプター付きグリッパーを取り付ける方法
2. プラグインカメラアダプターを外付けする方法

自分は 1 で作業しましたが、分解の手間がない 2 の方が手軽なので今回は後者を紹介します。

### 必要なもの
- **カメラ**：先ほど紹介した32×32 mm UVC Module
- **M2ネジ（８本）**：feetechサーボに付属している最小のネジ
- **[プラグインカメラアダプターのパーツ](https://github.com/TheRobotStudio/SO-ARM100/blob/main/Optional/Wrist_Cam_Plug_Mount_32x32_UVC_Module/stl/SO-ARM100_Plug_camera.stl)**：3Dプリンターで印刷してください

:::note
プラグインカメラアダプターを印刷する際、**充填密度を40%** に設定し印刷してください。強度が上がり、割れにくくなります。
:::

### カメラ取り付け準備  
- プラグインカメラアダプターを3Dプリントし、グリッパーの穴に合わせてM2ネジで固定(4本)

### カメラの取り付け  
- カメラアダプターの穴に合わせ、M2ネジで固定(4本)

### ソフト設定＆フォーカス調整  
- 解像度は 640×480、30fpsに設定
- 映像を確認しながらレンズを回し、手動でピントを合わせる

https://github.com/TheRobotStudio/SO-ARM100/tree/main/Optional/Wrist_Cam_Plug_Mount_32x32_UVC_Module

## 参考リンク
https://github.com/TheRobotStudio/SO-ARM100

https://github.com/huggingface/lerobot/blob/main/examples/10_use_so100.md

https://www.anaconda.com/docs/getting-started/miniconda/install#quickstart-install-instructions

https://wiki.seeedstudio.com/lerobot_so100m/

https://docs.phospho.ai/learn/build-so100

https://qiita.com/hEnka/items/eb32983492b8e0c88153

https://qiita.com/hEnka/items/912055d7f0dd66289818