ROS2を使ってルンバを色々いじりました。


この記事は[筑波NSミライラボ Advent Calendar 2023 8日目の記事](https://qiita.com/advent-calendar/2023/tsukuba-ns-mirailabo)です。
# はじめに
みなさんこんにちは。N高等学校3年本田 勝哉です。
現在私はルンバを使ってROS2の使い方を学びながら、Navigation2のconfigを操作してルンバを学校内で走らせています。

![5C93F640-F0BD-4FF6-B0E6-9C2CDB629EC2_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579313/43c98d94-5005-9e93-169f-89df176bfaaa.jpeg)

![49F13C2B-F1BB-48BC-8C9C-363CB2F3B336_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579313/d771c20b-33b6-8c91-a8ed-49596099641a.jpeg)

(ルンバに木材をつけたり三脚を乗せて動かしています。)

今回N/S筑波ミライラボのアドベントカレンダーに参加させていただくということで、情報が古くなってしまっているROSのシステムを使ったルンバの操作方法について解説していきたいと思います。

<strong>今回は特にルンバとラズパイとの接続方法に焦点を置いて解説します。</strong>

# 使用パッケージ・環境
基本的にはラズパイとmacbook air m1(2020)
## 使用環境
raspberrypi 4B (4GB)
* ubuntu22.04 server
  * ros2 humble (base)


Macbook air m1 (8GB)
* ubuntu 22.04 desktop  
  * ros2 humble (desktop)

#### 補足
macbook(2020)M1についてはasahi-ubuntuを使用してDUALBOOTでubuntu化しています。機会があればそちらの記事も書こうと思います。


## 使用パッケージ
#### ルンバのドライバー＋ros2ラッパー
AutonomyLab/create_robot
* https://github.com/AutonomyLab/create_robot.git

AutonomyLab/libcreate
* https://github.com/AutonomyLab/libcreate.git

#### 今回は取り扱わないがNavigationとslamのパッケージ
Navigation2
* ドキュメント
<https://navigation.ros.org/>
 
* ソースコード
 <https://github.com/ros-planning/navigation2>

slam-toolbox
* https://github.com/SteveMacenski/slam_toolbox


### ros2 humbleの導入の仕方（ubuntu)
https://docs.ros.org/en/foxy/index.html
こちらを参考にしてください
基本的には公式サイトのドキュメントを参照するのがおすすめです。
私の環境にラズパイではコマンドプロントのみ版であるbase、ルンバ側ではデスクトップ版を使用しています。

# ルンバのプログラムの導入方法
autonomy/create_robotのreadmeを参照すると以下のことが書いてあります。

:::note
この時にbranchを自分の使用しているROSのバージョンのものにしてください。
私の環境ではhumbleです。
:::
基本的にreadmeで行っている作業は
1. ワークスペースの作成
1. レポジトリからgitコマンドを使ってファイルをsrcディレクトリにダウンロードする。
1. rosdepを使って依存関係にあるパッケージのダウンロード
1. ビルド
1. シリアルピンのパスに権限を付与
1. ルンバと接続
1. プログラムの起動

のとおりとなっています。
ReadMeでの4番、ここでの５番の説明になるとルンバの接続方法の話になります。

### ルンバとラズパイとの接続方法
基本的にルンバとラズパイとの繋げ方は
1. usb-serial変換を使用した接続方法
1. raspberrypiのGPIOピンを利用した繋げ方があります。

ここでは解説が少ないGPIOでの繋げ方を解説します。
手順としては
1. GPIOでシリアル接続を有効化する設定を別PCで書き換えて行う。
2. 繋げるGPIOピンにアクセスする権限をログインユーザーに付与する。
3. configファイルにルンバと接続する際に使用するシリアル（GPIOピン）のパスを指定するように書き換える。

基本的にデフォルトで割り振られているシリアルピンはシリアルコンソール用に割り当てられてしまっているので他のシリアルピンに変更する必要があります。
複数のUARTを有効化するには以下のサイトを参考に設定しました。
https://tshell.hatenablog.com/entry/2021/03/04/205346

* 起動デバイスのUSBメモリを別PCから操作
起動ディスクのusbメモリを別pcに挿して次のファイルに設定の書き換えを行います。

1. /boot/firmware/syscfg.txt
2. /boot/firmware/usercfg.txt

1ではuartの有効化
2ではその起動を行うというイメージです。

私の環境では
/boot/firmware/syscfg.txtには
```
enable_uart=2
```
/boot/firmware/usercfg.txtには
```
dtoverlay=uart2
```
起動したら実際に有効ができているか確認しましょう。
有効化したものがこちらでコンソールに表示されていれば有効化できています。
```
kaya@propro:~$ dmesg | grep ttyAMA
[    1.662514] fe201000.serial: ttyAMA0 at MMIO 0xfe201000 (irq = 14, base_baud = 0) is a PL011 rev2
[    1.662963] fe201400.serial: ttyAMA1 at MMIO 0xfe201400 (irq = 14, base_baud = 0) is a PL011 rev2
[    1.663212] fe201600.serial: ttyAMA2 at MMIO 0xfe201600 (irq = 14, base_baud = 0) is a PL011 rev2
[    1.663448] fe201800.serial: ttyAMA3 at MMIO 0xfe201800 (irq = 14, base_baud = 0) is a PL011 rev2
[    1.663675] fe201a00.serial: ttyAMA4 at MMIO 0xfe201a00 (irq = 14, base_baud = 0) is a PL011 rev2
```

有効にするシリアルピンがGPIOピンの中のどれであるか（＝ピンアサイン）はraspberrypi財団のホームページに記載されています。
https://www.raspberrypi.com/documentation/computers/raspberry-pi.html
以下にシリアルアサインの対応表を載せます。

<table>
  <caption>シリアルアサイン</caption>
  <thead>
    <tr>
      <th>UART</th> <th>Tx</th> <th>Rx</th>
    </tr>
  </thead>
  <tr>
    <td>/dev/ttyS0</td> <td>8</td> <td>10</td>
  </tr>
  <tr>
    <td>/dev/ttyAMA0</td> <td>8</td> <td>10</td>
</tr>
  <tr>
    <td>/dev/ttyAMA1 </td> <td>27</td> <td>28</td>
  </tr>
  <tr>
    <td>/dev/ttyAMA2</td> <td>7</td> <td>29</td>
  </tr>
  <tr>
    <td>/dev/ttyAMA3</td> <td>24</td> <td>21</td>
  </tr>
  <tr>
    <td>/dev/ttyAMA4</td> <td>32</td> <td>33</td>
  </tr>
  
</table>

こちらが終わったら今度はルンバと接続する際に使用するlaunchファイルのconfigファイルを書き換えます。
デフォルトでは/create_bringup/config/default.yamlです
ここではあなたが有効化したUARTでルンバと接続するものを指定してください。
私の環境ではこちらをこのように書き換えました。

```diff 
- dev: "/dev/ttyUSB0"
+ dev: "/dev/ttyAMA1"
```



シリアルピンの設定が終わったら次はルンバとラズパイを物理的に繋げます。
ルンバのROIの仕様書から引用した画像です。こちらを参考にルンバと繋げてください。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579313/177ca43f-a412-c95e-a53c-bfe19fc60ce3.png)
https://edu.irobot.com/learning-library/create-2-oi-spec

ルンバのTXをRxピンである28pinにルンバのRxをTxピンの27ピンに繋げました。
R:Tx→27pin
R:Rx→28pin

:::note info
ルンバの信号線とラズパイの信号線の電圧の高さは5Vと3.3Vでレベル変換をしたほうが良いですが、実用上はそのまま繋げて大丈夫です。（主はそのまま繋げて使っていますが今のところ壊れておりません。）
:::

そうしたら準備完了です。あとはreadmeに従って、プログラムを実行すればルンバが操作できると思います。


:::note info
プログラムを終了しないまま
(create_2.launch)
を終了させないままプログラムを終了させると
ルンバ側の電源がずっとついたままになってしまいます。
必ずプログラムを終了させてから電源を切りましょう
:::

ルンバがターミナルから電源容量を取得するときに
最初に100%と表示されても電源がほとんどない時があるので気をつけてください。



## ラジコン操作
teleop_twist_keyboardと
turtlebot3_teleop telepo_twist_keyboardの二種類を紹介します。
これらの違いは
* 最大速度
* キー
* 加速の緩やかさ（急さ）
です。


### turtlebot3_teleop

* 最大速度が少し遅い
* キーを離しても継続的にcmd_velを発信し続けてくれる
* 段階的に速度や回転速度の調節ができる
→操作しやすい

### teleop_twist_keyboard
* キーを押してる間だけcmd_velが送信される
* 単一キーしか反応しない
* 最大速度の制御が可能
* turtlebot3_teleopより速い速度が出る
* cmd_velの速度が0→0.5(m/s)のように急加速、急減速
* キーを押した後少し止まってから走る
→操作に少しクセがある。

筆者はturtlebot3_teleopの方が操作しやすかったです。
筆者はあまりコードを書きたくないのでこちらを使っているのですが、ROS2の勉強をしたいのだったら、自分でteleopの部分を作って使いやすくするのもありだと思います。

導入方法は
```
sudo apt install ros-humble-turtlebot3_teleop
export TURTLEBOT3_MODEL=waffle
ros2 run turtlebot3_teleop teleop_keyboard
```
または
```
ros2 run teleop_twist_keyboard teleop_twist_keyboard
```
こちらで画面上に表示される操作方法で操作が可能となります。


## 掃除モーター制御
- 基本的にルンバの掃除ユニットには３つのモータがあります。
 ホコリをかき込むサイドブラシモーター
 それを２本の巨大ブラシで中に入れるメインブラシモーター
 掃除機みたいに吸い込むモーター←私の環境では動かなかった

 私の環境では吸い込むモーターの動作ができませんでした。
ただプログラム上では信号は送れていたのでハードウェアの問題だと思います。
 
## 追記
macOSでconda環境でNavigation2及びslamtoolboxの動作また、gazebo11との連携ができました。conda環境でのROS2の導入については以下の記事で紹介しています。




## 参考書籍＋サイト
https://tshell.hatenablog.com/entry/2021/03/04/205346
https://tshell.hatenablog.com/entry/2021/03/14/211708
foxy版ですが参考になりました。

* https://kanpapa.com/today/2022/08/roomba-ros2-led-song.html
LED制御とかサウンド制御がやりたい方はこちらが参考になるかもです。

* https://karaage.hatenadiary.jp/entry/2017/05/12/073000?source=post_page-----d2571eb852c8--------------------------------
偉大な先駆者唐揚げさんです。

* https://zenn.dev/array/books/5efdb438cf8be3
ar-rayさんの本です。こちらの本ではrviz2の使い方やros2関しての情報がわかりやすくまとまっております。

* https://amzn.asia/d/0PVQ7iK
こちらの本を買って参考にさせていただきました。NavigationやSLAMの仕組みや簡単な実装やアルゴリズムについての解説もあるので参考にしてみてはいかがでしょうか。

* <https://www.fabrica-com.co.jp/techblog/technology/3292/>
ros版ではありますが、接続の時に参考になりました。

* https://zenn.dev/tasada038/articles/0a69eb6c6b444f
turtlebot3のシミュレーション環境の構築が載っています。

* https://qiita.com/koichi_baseball/items/b15783ced5df8d5e56a6
Ros2に関して知りたいものがあったらこちらをみると色々なサイトが見つかります。すごく便利です。

皆さんもよりルンバライフを！