ROS2でRoombaを動かす情報がほとんどないので、本記事は近藤豊さんの以下の書籍、並びにYudai Sadakuniの記事とgithubを参考にした。近藤さんの書籍ではROS2 Crystalを対象としていたためか、ROS2 Dashingでは記事のとおり作業を行ってもできなかった。Sadakuniさんの記事はDashingに対応しているのでそのまま実行できた。ROS2は情報が少ないので先人の偉業に感謝。
参考資料
- ROS2ではじめよう次世代ロボットプログラミング、近藤豊著
- ROS2でルンバを動かすまで、Yudai Sadakuni
- ROS 2.0 driver for iRobot Create 1 and 2
- ROS2 Documentation, ROS Index, Open Robotics
環 境
- Raspberry Pi4 タイプB 4GB
- Ubuntu18.04
- ROS2 Dashing Diademata
- Roomba 600シリーズ
- 本記事では3万円弱で購入できる606で実行した。本記事で使用するCreate_autonomyパッケージは800シリーズまで対応しているので、そのシリーズまで大丈夫だと思うが未検証。なお、900シリーズ以上はRoombaからシリアルポートがなくなり、Create_autonomyパッケージも対応していないので使えない。
- Roomba通信ケーブル
- Pi4とRoombaを接続するケーブル。以下を参考に自作するか、ここから購入する。本記事では2011年に購入したルンバ研究開発キットに付属していた通信ケーブルを使っている。
- モバイルバッテリ
- 10000mAhだとPi4の負荷により変わるが数時間は持つ。今、Pi4でこのブログを書いているが電流は0.8Aほど。
- SONY DualShock4 (DS4)コントローラ
インストール
- 準備
- colconビルドシステムのインストール
- $ sudo apt install python3-colcon-common-extensions
- ワークスペースの生成。ROS2ではcatkinからcolconにビルドシステムが変わっている。
- $
cd
- $
mkdir -p ros2/src
- $
- libcreate
- インストール
- Create_autnomyはlibcreateを使うのでまずこれをインストールする。
- $
cd ~/ros2/src
- $
git clone https://github.com/AutonomyLab/libcreate
- $
- colconでビルドするためにワークスペースのルート(この場合ros2)へ以下のコマンドで移動する。なお、ros2の前の「~」(チルダ)はホームディレクトリの意味。
- $
cd ~/ros2
- $
- Create_autnomyはlibcreateを使うのでまずこれをインストールする。
- ビルド
- $
colcon build
- $
- インストール
- create_autonomy
-
- インストール
- $
cd ~/ros2/src
- $
git clone https://github.com/Sadaku1993/create_autonomy.git
- $
- ビルド
- $
cd ~/ros2
- $
colcon build
- colconのビルドが成功したら、出力 (実行可能ファイルやライブラリ)はinstallディレクトリに保存される。それを使うためにはpathに追加する必要があり、以下のシェルスクリプトを実行しなければならない。sourceコマンドは引数のファイルを読み込んで現在のシェル環境で実行する。sourceコマンドの代わりに”. “(ピリオド )でも良い。参考文献の公式ドキュメントでは”.”を使っているのがあまりお目にかからないのでここではsourceに変更した。
- $
source install/setup.bash
- $
- $
- インストール
-
設 定
- udev
- Linuxはデバイスをファイルとして扱い、Pi4とRoombaを通信するときは/dev/ttyUSB0。USB-Serial変換ICでttyUSBではなくttyACMの場合もあるり、ttyUSBの後の番号は他の接続機器により0ではない場合もある。一般ユーザはデバイスファイルを扱えないのでパーミッションを変更する必要があるがUSBを接続する度に変更するのは面倒なのでudevを設定する。
- まず、Pi4とroombaを通信ケーブルで接続する。
- 次に、以下のコマンドでデバイスを確認する。本記事で使用しているUSB-Serial変換用ICはFuture Technology Devices Internatinal社のFT232だとわかる。Future Technologyの左の数字0403はベンダーID、6001はプロダクトIDなのでメモしておく。
- $ lsusb
-
- /etc/udev/rules.d/77-roomba.rulesというファイルをつくり、以下を保存する。ここで、ベンダーIDは上でメモったベンダーID、プロダクトIDも同様な数字を入れる。この例では、ベンダーIDは0403、プロダクトIDは6001になる。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="ベンダーID", ATTRS{idProduct}=="プロダクトID", GROUP="dialout", MODE="0666"
- Room通信ケーブルを抜き差しするとudevの設定が反映される。確認はls -l デバイスファイル名でパーミッション設定を確認する。この例だと、上がケーブルを抜き差しする前で、下が後。すべてのユーザに対してrw(読み書き)可能となっていることがわかる。
- /etc/udev/rules.d/77-roomba.rulesというファイルをつくり、以下を保存する。ここで、ベンダーIDは上でメモったベンダーID、プロダクトIDも同様な数字を入れる。この例では、ベンダーIDは0403、プロダクトIDは6001になる。
Roombaを動かそう!
- Roombaを動かすために次のlaunchファイルを起動する。
- $ ros2 launch roomba_600_driver roomba_600_driver.launch.py
- 以下のエラーがでるが気にしないで次に進む。作者が今後修正の予定
- [ca_driver-1] [ERROR] [ca_driver]: [CREATE] Unknown mode detected
- 前進
- ROSではトピック/cmd_velに速度指令値を設定して、配信(pub)するだけでロボットは動く。ここで、geometry_msgs/Twistは速度指令値の型、'{linear: {x: 0.2}, angular: {z: 0.0}}’が指令値で、linearは並進速度(x軸方向に0.2m/s)、angularは角速度(z軸まわりに0 rad/s)、オプション-rは配信する周期[Hz]デフォルトは1Hzなので動きがガタつくのでここでは100Hz、10ms周期にしている。
- $
ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2}, angular: {z: 0.0}}' -r 100
- $
- 以下のコマンドで調べることができる。
- $
ros2 topic pub -h
- $
- ROSではトピック/cmd_velに速度指令値を設定して、配信(pub)するだけでロボットは動く。ここで、geometry_msgs/Twistは速度指令値の型、'{linear: {x: 0.2}, angular: {z: 0.0}}’が指令値で、linearは並進速度(x軸方向に0.2m/s)、angularは角速度(z軸まわりに0 rad/s)、オプション-rは配信する周期[Hz]デフォルトは1Hzなので動きがガタつくのでここでは100Hz、10ms周期にしている。
- teleoopで動かそう
- いちいちコマンドを打っていてはRoombaをうまく制御できないので、キーボードを使って動かしてみる。
- teleop_toolsをgithubからクローンする。
- $ git clone https://github.com/ros-teleop/teleop_tools.git -b dashing-devel
- ソースコードの改変
- Create_Autonomyとトピック名が違いそのままでは動かないので、ここではソースコードを改変する。速度もRoombaに合わせて遅くする。
- /ros2/src/teleop_tools/key_teleop/key_teleop/key_teleop.pyの257〜260行目を以下のように変える。トピック名の’key_vel’を’cmd_vel’、周期や速度を変更している。
self._pub_cmd = self.create_publisher(Twist, 'cmd_vel')
self._hz = self.declare_parameter('hz', 100).value
self._forward_rate = self.declare_parameter('forward_rate', 0.1).value
self._backward_rate = self.declare_parameter('backward_rate', 0.1).value
self._rotation_rate = self.declare_parameter('rotation_rate', 0.25).value
- ビルド
- $ cd ~/ros2
- $ colcon build
- $ source install/setup.bash
- 実行
- 次のコマンドを実行する
- $
ros2 run key_teleop key_teleop
- キーボードの矢印キーで操作できる。止めるときは’q’キーを押す。
- $
- 次のコマンドを実行する
Bluetoothの設定
- Pi4のUbuntu18.04の場合はそのままではBluetoothが使えないので必要なパッケージをインストールする。なお、Futaka TatsuyaさんのQiitaを参考にした。
- パッケージのインストール
- $ sudo apt install pi-bluetooth bluetooth bluez
- $ sudo systemctl enable bluetooth
- $ sudo reboot
- 再起動後に以下のコマンドを実行してコントローラが認識されていれば成功。
- $ sudo bluetoothctl
SONY DualShock4 (DS4)コントローラの設定( Bluetooth)
- 以下のサイトを参照した。
- ds4drvドライバのインストール。ds4drvはLinuxのSONY DualShock 4 用ドライバ。
- python2のパッケージ管理システムpipをインストールする。
- sudo apt install python-pip
- DS4のドライバをインストールする。
- sudo pip install ds4drv
- python2のパッケージ管理システムpipをインストールする。
- DS4とPi4のペアリング
- DS4をPi4の近くに置く。
- ds4drvの起動
- $ sudo ds4drv
- 以下のように表示される。
[info][controller 1] Created devices /dev/input/js0 (joystick) /dev/input/event8 (evdev)
[info][bluetooth] Scanning for devices
- ペアリング
- DS4左上のSHAREボタンとDSボタンを同時に5秒程度長押しする。LEDが白く点滅したらボタンから手を話す。
- LEDが青くなりds4drvを起動した端末で以下のように表示されたら成功。
DS4コントローラでRoombaを動かそう!
-
- これで準備ができたので始めからDS4コントローラを使いロボットを動かすまでの一連の手順を説明する。
- Pi4をディスプレイなしで起動するので自動ログインの設定にする。
- 以下の内容の/etc/lightdm/lightdm.conf.d/1-autologin.confを作成してシャットダウンする。ユーザ名に自動ログインしたいユーザ名を入れる。
- [SeatDefaults]
autologin-user=ユーザ名
autologin-user-timeout=0
- [SeatDefaults]
- 以下の内容の/etc/lightdm/lightdm.conf.d/1-autologin.confを作成してシャットダウンする。ユーザ名に自動ログインしたいユーザ名を入れる。
- Pi4とRoombaを通信ケーブルで接続する。
- Roombaの電源を入れる。
- Pi4とモバイルバッテリを接続する。Pi4が起動する。
- ノートパソコンを起動して端末を3つ開き、各端末からPi4にssh接続する。上から順番に実行する。
- 1番目の端末
- 以下のコマンドを実行する。
- $ sudo ds4drv
- DS4コントローラのShareとPSキーを長押しペアリングする。
- 以下のコマンドを実行する。
- 2番目の端末
- Roombaの制御パッケージを起動する。
- $ ros2 launch roomba_600_driver roomba_600_driver.launch.py
- Roombaの制御パッケージを起動する。
- 3番目の端末
- 遠隔操作パッケージを起動する。
- $ ros2 launch roomba_600_driver teleop.launch.py
- 1番目の端末
- DS4コントローラの左側のジョイステックを動かすとルンバが動作する。今回は長かったですね。お疲れ様!
終わり
コメント