ROS2でルンバを動かすまで

ROS2でルンバを動かすパッケージを作成したので、議事録的にまとめました。

# 環境
・PC : Rasberry Pi3 Model B
・OS : Ubuntu 18.04
・ROS2 : dashing
・Roomba : Roomba606

![82244F1B-C756-4C2F-BF53-C7277F811BE8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239786/6b8d5781-81ba-0108-f901-8b8d63033b5e.jpeg)

おそらくRoomba606以外でも動きますが、動作確認は実施していませんのでご了承ください。

# ハードウェアの選定
下記の記事・資料をもとに必要な部品構成を選定しました。

・[ROSを使ってルンバが操作できるまで feat. Raspberry Pi3とPS4コントローラーとUSBカメラ](https://qiita.com/taka_horibe/items/d0f9206697a677570563)
・[ROS2ではじめよう 次世代ロボットプログラミング](https://gihyo.jp/book/2019/978-4-297-10742-0)

|部品|名称|役割|
|---|---|---|
|Roomba|[Roomba606](https://www.amazon.co.jp/gp/product/B07Q51S4GC/ref=ppx_yo_dt_b_asin_title_o01_s02?ie=UTF8&psc=1)|今回動かしたいRoomba本体|
|制御用PC|[Raspberry Pi3 Model B](https://www.amazon.co.jp/gp/product/B07FQ9678G/ref=ppx_yo_dt_b_asin_title_o01_s01?ie=UTF8&psc=1)|ルンバ制御するためのPC|
|モニタ用PC|Desktop PC|Raspberry Piのプログラムを起動/Roombaの状態を可視化する|
|Joy Stick|[PS4コントローラ](https://www.playstation.com/ja-jp/explore/accessories/gaming-controllers/dualshock-4/)|Roombaに制御指示(速度・角速度)を送る|
|通信ケーブル 1|[USB to DIN](https://www.amazon.co.jp/gp/product/B06XDPMY4Z/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)|Roomba-制御用PC 通信ケーブル|
|通信ケーブル 2※|[USB to Micro USB](https://www.amazon.co.jp/gp/product/B0711PVX6Z/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)|制御用PC-PS4コントローラ 通信ケーブル|
|バッテリー|[モバイルバッテリー](https://www.amazon.co.jp/gp/product/B01FDMBOEU/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)|Raspberry Pi用バッテリー|
|電源ケーブル|[USB to Micro USB](https://www.amazon.co.jp/gp/product/B0711PVX6Z/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)|Raspberry Pi-バッテリー 電源ケーブル|

今回のハードウェア構成は下記になります。
モニタ用PCはUbuntu18.04/ROS2(dashsing)/sshがセットアップされているものであればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239786/64a65145-c4f9-937e-0da5-8506fa9437e6.png)

Raspberry Piを使わない場合、制御用PCとモニタ用PCはThinkPadなどのノートPCにて代替可能です。

※通信ケーブル2について
PCとPS4コントローラ間をBuletoothにて通信可能なds4drvというパッケージがあるので、PC側のBluetooth機能を有効にできる場合、通信ケーブル２は不要です。Raspberry Pi側の問題なのか、Bluetoothを有効にできなかったため、PS4との通信を有線にて行うために購入しました。上記の環境で問題なくRaspberry PiとPS4間をds4drvにて通信可能な方がいましたら解決方法を教えていただけると幸いです。

# Raspberry Piのセットアップ

## SDカード書き込み
ROS2にてルンバを制御するため、Ubuntu18.04 serverを入れます。
下記事を参照。操作はUbuntu18.04が入ったPC上で行います。
[Raspberry Pi3へのUbuntu18.04 serverの導入]
(https://qiita.com/Jumpei-Arima/items/790236ac66bcc9ec434e)

## ROS2(Dashing)のインストール
[公式ホームページ](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Development-Setup/)に従ってインストールすれば問題なくできると思います。

## ROS2作業ディレクトリを作成
ROS2用の作業ディレクトリを作成します。
今後、作業ディレクトリ名をros2として説明をしていきます。

```terminal
$ mkdir -p ~/ros2/src && cd ~/ros2
$ colcon build
$ . install/setup.bash
```

## ルンバ制御用ノードのインストール
ルンバ制御用ノードを制御用PC(RaspberryPi)にインストールします。
ルンバの制御用ドライバとして代表的なのに
・[libcreate](https://github.com/AutonomyLab/libcreate)
・[PyRoombaAdapter](https://github.com/AtsushiSakai/PyRoombaAdapter)
があります。

create_autonomyはlibcrateをラッパーしてROS1にて使用可能なパッケージとなっているため、今回はこちらをROS2にて利用できるように書き換えたパッケージを使用します。
([youtalkさん](https://github.com/youtalk/create_autonomy)がすでにgit hub上にros2対応のcreate_autonomyをアップしていますが、使い方を間違えている？or動かないため、こちらで書き換えたものを使用していきます。）

## libcreateのインストール
ros2の作業ディレクトリにlibcreateをインストールしてください。

```terminal
$ cd ~/ros2/src/
$ git clone https://github.com/AutonomyLab/libcreate
$ cd ~/ros2
$ colcon build
```

## create_autonomyのインストール
create_autonomyのbranchがdashing-develになっているか確認
してからコンパイルを実施してください

```terminal
$ cd ~/ros2/src
$ git clone https://github.com/Sadaku1993/create_autonomy
$ cd ~/ros2
$ colcon build
$ . install/setup.bash
```

# ルンバをコマンドから動かす
ルンバがコマンドからの指示受け取り、動作するか確認します。

## USBのアクセス権を取得
・USB-DINシリアル変換ケーブルをルンバとRaspberry Piに繋ぐ
・USBのアクセス権を付与

```terminal
$ sudo chmod a+rw /dev/ttyUSB0
```
アクセス権を毎回付与するのは面倒なので、udevで設定してしまった方が楽です。
　(参考：[USBシリアルデバイスの権限設定](http://mondayboy.hatenablog.com/entry/2015/05/05/182610))

## create_autonomyの起動
create_autonomyを起動します。
モードに関するエラーが出ますが、動作には問題ありません。今後修正します。

```terminal
$ ros2 launch roomba_600_driver roomba_600_driver.launch.py
```

## 直進コマンドをルンバに送る
下記コマンドにてルンバに直進する指示を送ります。
正しく通信ができている場合、ルンバが動き出すので周辺環境に気をつけて起動してください。

```terminal
$ ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2}, angular: {z: 0.0}}' -r 100
```

ルンバが真っ直ぐ動き始めたでしょうか？
あとはPS4コントローラから動かせれば完璧です。

# PS4コントローラからルンバを動かす

PS4コントローラの指示をルンバに伝え、ユーザの思うがままにルンバを動かせるようにします。


## PS4コントローラの認識
Raspberry PiにPS4コントローラを接続し、コントローラが認識されているか確認します。
基本コントローラは/dev/input/js0として認識されます。
下記コマンドにて/js0が表示されていればOKです。
（環境によっては異なる可能性があります）

```terminal
$ ls /dev/input
by-id    event0  event10  event12  event14  event16  event18  event2   event21  event3  event5  event7  event9  mice    mouse1
by-path  event1  event11  event13  event15  event17  event19  event20  event22  event4  event6  event8  js0     mouse0
```

## Joyパッケージにてコントローラの信号が出力されているか確認
PS4コントローラの信号をros2のメッセージとして出力できているか確認します。

1つ目のターミナルにてjoy nodeを起動

```terminal
$ ros2 run joy joy_node
```

2つ目のターミナルにて、コントローラの信号が出力されているかを確認

```terminal
$ ros2 topic echo /joy
```

sensor_msgs/msg/Twist型でコントローラの信号が出力されていることがわかります。
出力が確認できたら上記２つのターミナルは閉じてください。

## PS4コントローラにてルンバを動かす
joy nodeはコントローラの出力をsensor_msgs/msg/Joy型にて出力します。create_autonomyはgeometry_msgs/msg/Twist型にて速度と角速度受け取る仕様です。

sensor_msgs/msg/Joy⇨geometry_msgs/msg/Twistに変換するプログラムを起動します。
 (※joy nodeも一緒に立ち上がります)

```terminal
$ ros2 launch rommba_600_driver  teleop.launch.py
```

# 実際に動かす
1. Raspberry Piをしてsshで繋ぐ 

2. PS4コントローラを繋ぐ

3. ルンバの電源を入れる

4. USB-DINシリアル通信ケーブルを繋いで、アクセス権を取得する

```
$ sudo chmod a+rw /dev/ttyUSB0
```



5．ルンバの電源を入れてから、ルンバ制御パッケージを起動

```
$ ros2 launch roomba_600_driver roomba_600_driver.launch.py
```

６.twist変換ノードを起動

```
$ ros2 launch roomba_600_driver teleop.launch.py
```

# まとめ
ROS2にてRoombaを動かすことができるようになりました。
これまでROS1を使っている人でROS2への移行に移り始めないといけないと思っている人にも
ちょうど良いレベルの題材となっているので参考にしていただけたら幸いです。

# 参考資料
先駆者に感謝いたします。

・[ROSを使ってルンバが操作できるまで feat. Raspberry Pi3とPS4コントローラーとUSBカメラ](https://qiita.com/taka_horibe/items/d0f9206697a677570563)
・[ROS2ではじめよう 次世代ロボットプログラミング](https://gihyo.jp/book/2019/978-4-297-10742-0)