[LeRobot]#2 "SO-100"の環境構築+組み立て編

※このチュートリアルはSO-100に特化したものとなります．

# 環境

| 項目 | 環境 |
| --- | --- |
| CPU | Intel Core Ultra5 125H |
| RAM | 16GB |
| OS | Ubuntu22.04 |
| ROS 2 | Humble |

# Leader_armとFollower_arm

LeRobotを使っていくうえで必須の概念にLeader_armとFollower_armがあります．
Leader_armは，人間から操作を受けるアームで，トリガーがついています．
Follower_armは，直接物体のマニピュレーションをするアームで，グリッパがついています．

# FeetechのGUIでモータを動かしてみる

サーボの動作確認をします．動作確認には必須ではにですがSDKはダウンロードしたほうがいいです．
[公式サイト](https://www.feetechrc.com/software.html)からSDKをダウンロードします．私のはFD1.9.8.3でした．

PC ー USB-AtoCケーブル ー ドライブボード(waveshare) ー 付属ケーブル ー STS3215
の順に接続します．
waveshareの基板やサーボには同じコネクタがありますがどちらにさしてもいいです．基板のスクリューターミナル(緑)に安定化電源等で適切な電圧をかけます．(サーボによって7.4Vmaxと12Vmaxがある)
ダウンロードしたソフトのexeファイルを起動します．

COMを1000000にして，openを押した後searchを押します．すると接続されたサーボがリストアップされます．torqueを入れてバーを左右に振るとモータが動きます．

[この動画](https://www.youtube.com/watch?v=fy6Jqq_QaGo
)にSDKの使い方が説明されています．後からやるので動画のようにIDを振る必要はありません．


# 環境構築

Minicondaをインストール

```
mkdir -p ~/miniconda3
wget <https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh> -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
~/miniconda3/bin/conda init bash
```

一度ターミナルを消すか，以下のコマンドを走らせる

```
source ~/.bashrc
```

LeRobot用の仮想環境を作る

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

LeRobotをgit cloneする

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

feetechを動かすための依存パッケージをインストールする

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

データをレコーディングするためのツールをインストールする

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

環境構築が終わりました，お疲れ様です．

# サーボの設定をする

この動画がこれ以降のチュートリアルをそのまま解説してくれています．これ以降はこの動画をセットでみると組み立て方法がわかりやすいです．

<iframe width="560" height="315" src="[https://www.youtube.com/embed/FioA2oeFZ5I?si=kFCg7PmqMSfZ4Q6P](https://www.youtube.com/embed/FioA2oeFZ5I?si=kFCg7PmqMSfZ4Q6P)" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

サーボと基板がつながったものを2つ用意する．片方をLeader_arm(操作する側)，もう片方をFollower_arm(操作される側)として，両方をPCに接続する．

ターミナルでこのコマンドを実行．

```
python lerobot/scripts/find_motors_bus_port.py
```

実行し，片方のUSBを抜いてEnterを押すと抜いたほうのUSBの名前が表示される．この名前をlerobot/configs/robot/so100.yamlの中に次のように書き込む．これを両方の基板に対して行う．この際に付箋やマスキングテープてどちらがどのアーム用なのか名前を書いておくといいでしょう．

```
leader_arms:
  main:
    _target_: lerobot.common.robot_devices.motors.feetech.FeetechMotorsBus
    port: /dev/ttyここ修正
    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:
  main:
    _target_: lerobot.common.robot_devices.motors.feetech.FeetechMotorsBus
    port: /dev/ttyここ修正
    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"]
```

注意したいのは，usbの名前が差し込んだ順に認識される場合があることです．例えば，/dev/tty/ACM0をLeader_arm，/dev/tty/ACM1をFollower_armとしていた場合，follower_armを先に差し込めば正常に認識されるが，順序を逆で接続した場合，Leader_armとFollower_armが逆に認識されうまく動きません．書き込んだ番号とUSBの接続順を理解しておきましょう．

つながらない場合は権限を変えていないかもしれません．USBが/dev/ttyACM0とttyACM1の場合はこのように許可を出します．

```
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
```

# Follower_arm用のサーボのIDを設定する

電源を投入したfollower_arm用の基板と，サーボを6つ用意して，サーボ1つだけを配線した後，USBに接続してこれを打ち込みます．

```
python lerobot/scripts/configure_motor.py \\
  --port /dev/tty.usbmodem58760432961 \\
  --brand feetech \\
  --model sts3215 \\
  --baudrate 1000000 \\
  --ID 1
```

これで，このサーボは2048の位置で止まり，IDが1として割り振られます．そのあと，サーボホーンを図のように穴が対角になるように取り付け，ねじ止めします．サーボが組み立て時に回転してしまうと原点が狂うので，サーボホーンにマジックペンでしるしを書いておきましょう．

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/ff416434-0854-d061-97ce-aa46544b7bd1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/ff416434-0854-d061-97ce-aa46544b7bd1.png)

そしてIDを2~6まで変えて同様に繰り返します．どのサーボが何番かわかるようにマステでIDを書いておきましょう．

# Leader_arm用サーボのIDを設定する

基本的にはFollower_armと同じですが歯車を取る必要があります．

Leader_armは人間の動作を直接受け取るアームですが，sts3115はバックドライブ性能が高くないので操作しづらいです．そのため，サーボのエンコーダ(角度センサのこと)のみ使用します．(ここをただのエンコーダにすることでさらに低価格にすることができますね)

先ほどのコマンドで同様にIDを書き込み原点を出します．サーボホーンを取り付ける前に，
１．画像の黄色で示したねじを外す
２．カバーを取る
３．画像の緑色の歯車を抜き取る
この際，出力軸を回転させないよう注意してください．回転させてしまった場合は歯車をつけてから再度コマンドを走らせることで原点を出せます．

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/e8a6640f-621b-29c2-297d-b38a0be0e6cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/e8a6640f-621b-29c2-297d-b38a0be0e6cc.png)

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/75b8f22a-44f6-3f72-0fdc-a1c088645013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/75b8f22a-44f6-3f72-0fdc-a1c088645013.png)

軸を回さないように慎重にカバーを取り付けねじ止めします．その後，先ほどと同様に対角にサーボホーンがつくようにします．少々大変ですが，同様にID2~6も同じようにします．Follower_arm用のサーボとは混ぜないようにしましょう．

# 組み立て

動画のCADに従って組み立てをしましょう．動画がわかりやすいので割愛し，注意が必要な場面のみ画像を載せました．

https://www.youtube.com/watch?v=FioA2oeFZ5I

最初はFollower_armからの組み立てをお勧めします．Leader_armは歯車がないためゆるゆるで組み立てしずらいです．

全体として注意すべき点は，サーボの原点がずれないようにマジックペンでつけたしるしを見ながら組み立てることです．ですが間違って組み立ててもSDKで原点を修正できるので過度に心配する必要はありません．

原点を合わせる位置についてですが，この画像通りに合わせればいいです．
Follower_arm

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/4e553293-42f0-6353-5a32-b3694570a31d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/4e553293-42f0-6353-5a32-b3694570a31d.png)

Leader_arm

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/a119ea13-06ea-649c-3372-c2946628791a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/a119ea13-06ea-649c-3372-c2946628791a.png)

### 土台

ID 1のサーボにはあらかじめケーブルを接続しておきましょう．あとからでは抜き差しができません．マーカーで塗ってある部品をはめ込む際には，サーボの左から出すケーブルをあらかじめ通してからはめ込みましょう．後からだと通せません．はめあいはかなり固いので力ずくで押し込みます．ベースにくの字になった隙間がありますがそこに先ほど通したケーブルをはめます．

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/edfac37f-b199-47b4-b9dc-04d821c55c2d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/edfac37f-b199-47b4-b9dc-04d821c55c2d.png)

### 第1軸の取り付け

マーカーで塗った部品の一番下の面に軸には歯がついていないサーボホーンをつけます．軸が2048(デフォルト)の位置になるときに第一軸がまっすぐになるように取り付けます．

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/c396b6d5-5b4b-863d-3cdb-ad7b735175b6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/c396b6d5-5b4b-863d-3cdb-ad7b735175b6.png)

ここまでの組み立てには専用の動画が用意されています．この動画も併せて視聴してください．
[https://www.youtube.com/watch?v=temou_Nr5s8&t=1s](https://www.youtube.com/watch?v=temou_Nr5s8&t=1s)

### 第2軸のサーボの取り付け

IDが2のサーボにはあらかじめ新しいケーブル1つと，IDが1のサーボからくるケーブルを差し込んでおいてください．
マーカーで塗ったパーツを挿入する前に，ケーブルをパーツに通しておいてください．

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/8482d1be-5559-3994-46fc-f514e9c61c7c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/8482d1be-5559-3994-46fc-f514e9c61c7c.png)

### 第4軸のサーボの取り付け

マーカーで塗ったパーツを挿入する前に，ケーブルをパーツに通しておいてください．

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/3eab271c-7519-02ad-6d67-626104f9a48a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926225/3eab271c-7519-02ad-6d67-626104f9a48a.png)

以上が注意すべき点です．組み立てお疲れさまでした．

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

# 参考

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

https://www.youtube.com/watch?v=FioA2oeFZ5I