ルンバをRaspberry Piを使ってROSでコントロールできるように改造してみた(半田付け無しでOK)

ルンバを買ったので早速改造してみることにしました

 ずっと欲しかったルンバを購入しました。

注:動作確認したのはルンバ622でしたが、すでに品切れのため、同じ600シリーズで安価な606を代わりに紹介しています

 目的はもちろんお掃除してもらうことなのですが、やはりルンバを買ったら色々いじりたくなってしまいますね。というわけで、サクッとRaspberry Piでルンバをコントロールしてみることにしました。

 方針は以下です。

  • Raspberry PiとROS(Robot Operating System)を使う
  • 普通に掃除機としても使うので、基本的に元に戻せない改造はしない

 ROSに関しては以下記事を参照下さい。

 同じようにルンバを改造している記事は、ネットに色々あるので参考にしたものを本記事の最後で参考リンクとしてリンク貼っています。一応この記事は、わかりやすく簡単にルンバを改造する方法を紹介しているつもりなので、ある程度PCやLinuxがわかる人ならルンバを改造できるようになると思います。

 ただし、念のため最初に書いておきますが、この記事の内容はメーカの想定している使い方ではないので、完全無保証となります。ルンバが壊れても文句を言わない覚悟がある方のみチャレンジすることをおすすめします。

この記事の内容でできたこと(改造したルンバ)

 以下のようにRaspberry Piでルンバを制御できるようになりました。パソコンはRaspberry Piにsshでログインしているだけで、基本的にRaspberry Piだけでルンバを制御しています。

 改造は、半田付けも不要で、2時間程度で簡単にルンバがハックできました(なんと抵抗2本だけで繋ぐことも可能です)。とりあえず繋がった、という感じですね。これをベースに今後も色々ためしていきたいなと思います。

 ここからは、どうやってルンバを改造するかという内容の説明になります。興味ない方にとっては宇宙語が続きますので、興味ある方のみ続きをご覧下さい。

ルンバをRaspberry Piを使ってROSでコントロールする方法

必要なもの

 Raspberry Pi 3

 microSDカード。最低8GB程度

 マイクロUSB接続

 USB-シリアル変換(5V/3.3V切り替え機能付き)

 レベル変換して、直接Raspberry Piのピンヘッダに繋ぐ方法もあり、その場合はUSB-シリアル変換は不要です。初心者はUSB-シリアル買っておいた方がよいです。上級者の方は、この記事の後半読んで必要なものを調達下さい。

 ジャンパワイヤ(オスーオス)

 モバイルバッテリ(使用したものが品切れだったので、同等以上のスペックのものにリンクしています)

 写真にはRaspberry Piの純正カメラモジュールが付いていますが、本記事では使用しません(今後使用予定)。

必要なもの(電源をルンバから供給する場合)

 モバイルバッテリは、ルンバに載せるのには大きいですし、ルンバとモバイルバッテリ両方のバッテリの残りを気にするのはいやですよね。そんなときは、ルンバから電源供給するのが良いです。参考までにその際に必要なものを記載します。ただし、ここは半田付けは必要となりますのでそれでも問題ない方向けです。

Pololu ステップダウン電圧レギュレータ(5[V]/9[A]) D24V90F5  D/Dコンバータ(電圧変換)

 ジャンパワイヤ(オスーメス)

 ジャンパワイヤ(メスーメス)

 半田ごてのセット

 ニッパ

ルンバとRaspberry Piの接続

ルンバオープンインターフェース(Roomba Open Interface)

 ルンバとRaspberry Piの接続は、ルンバオープンインターフェースと呼ばれるシリアルインターフェースを使用します。仕様も公開されています。

Roomba Open Interface Spec

 Roomba 500となっていますが、色々調べたところルンバの500/600/700/800シリーズには全部コネクタが付いていて、仕様も基本共通のようです。残念ながら、WiFiが標準搭載となったルンバ900には付いていないようです。900シリーズでもWiFi経由でハックは可能なようですが、現状ROSには対応してないようなので本記事の内容は500/600/700/800シリーズを想定しています。

 ルンバのシリアルインターフェースとRaspberry Piをつなぐ方法は、以下2つあります

  • シリアル-USB変換アダプタでRaspberry PiのUSBポートに接続
  • レベル変換して直接Raspberry Piのシリアルインターフェース(UART)に接続

 シリアル-USB変換は、少しお金がかかる代わりに、設定が簡単(ほぼ不要)でRaspberry Pi以外のPC等でもそのまま使用可能というメリットがあります。シリアルインターフェースを使う場合は、安い(抵抗2本でOK)の代わりに、色々設定の変更が必要なのとRaspberry Pi専用になってしまうというデメリットがありますので、そこらへんを考慮した上で接続方法を選択下さい。初心者にはシリアル-USB変換がおすすめです。

 一応両方の接続方法に関して説明いたします。

シリアル-USB変換アダプタで接続する方法

 ルンバのシリアルインターフェースと接続するには、まずルンバの外装を外します。


 爪を押して外していけばOKです。最初はちょっとバキッといきそうで不安ですが、特に工具などは不要で外せました

 以下のようなむき出しの状態にします

 以下のコネクタがルンバオープンインターフェース。信号名は仕様書から抜き出して書き加えました。

 ルンバとシリアル-USB変換アダプタの接続は以下の図と表を参照下さい。表の配線の色は、写真との対応をとっているだけですので、好きな色を使用して下さい。ルンバのシリアル通信の電圧は5Vなので、変換アダプタは5V対応のものを選ぶよう注意しましょう(3.3Vの場合はレベル変換が必要)。

 シリアル変換アダプタのUSBポートはRaspberry Piのお好きなUSBポートに接続して下さい。

配線の色 ルンバ シリアル変換アダプタ
6pin(GND) GND
4pin(TXD) RXD
3pin(RXD) TXD
レベル変換してシリアル接続する方法

 外装を外すまでは、シリアル-USB変換アダプタで接続するときと同じです。Raspberry Piのシリアルインターフェース(UART)につなぐ場合は、ルンバの5VからRaspberry Piの3.3Vにレベル変換が必要です。Raspberry PiのTx(3.3V)はルンバのRx(5V)に直結して実用上は問題なくて、ルンバのTx(5V)を抵抗2つで分圧してRaspberry Piに繋ぐだけで良いという情報があったので、試してみました。

 抵抗は手持ちの10kΩのものを使いました。Raspberry PiのGPIOヘッダの接続先は、Raspberry Pi GPIO Pinoutを参照下さい。具体的には以下のような形です。

ルンバ Raspberry Pi Memo
6pin(GND) 6pin(GND) 直結OK
3pin(RXD) 8pin(TXD) 直結OK
4pin(TXD) 10pin(RXD) レベル変換必要

 実際に接続した様子は以下になります。

 これを読んでよく意味がわからない人は、シリアル-USB変換を購入した方が無難です。

 また、シリアル通信を使う場合は、設定変更が必要になるので注意下さい。一旦本記事の内容の動作確認のところまで進めた後、以下の設定を実施して下さい。

 Raspberry Pi 3の場合は、シリアル通信を実施する際に/boot/config.txtファイルの修正が必要です。具体的には以下でエディタを開いて

$ sudo vim /boot/config.txt

 以下の2行を追加して下さい

core_freq=250
enable_uart=1

 Raspberry Pi 2の場合は、core_freq=250の設定は不要のはずですが、試せてはいません。詳細はRaspberry Piにシリアル通信(UART)でログインする方法(Mac版) - karaage. [からあげ]を読んでおいてもらうと良いかもしれません。

 ROSのパッケージに関しても、修正が必要です。具体的には、create_autonomy/ca_driver/config/default.yamlというファイルを編集します。Raspberry Pi 3では、2行目を以下のように変更してください(-の行が変更前、+の行が変更後の意味です)

- dev: "/dev/ttyUSB0"
+ dev: "/dev/ttyS0"

 Raspberry Pi 2では /dev/ttyS0/dev/ttyAMA0になるはずですが、こちらも試せてはいません。

Raspberry PiへのROSのセットアップ

 以下の記事のUbuntuにROSをインストールする方を参照しセットアップ下さい

 Raspberry Piにはディスプレイをつながず、他のPCからsshなどで接続するのがよいでしょう。その場合は、byobuもインストールしておくと色々楽です。

 ただ、byobuでプログラム実行して以下のようなエラーが出る場合があります

what():  locale::facet::_S_create_c_locale name not valid

 そのときは以下実行ください。毎回実行するのはめんどう臭いので.bashrcとかに追記しておくとよいでしょう

$ export LC_ALL="en_US.UTF-8"

 また、ホスト名でアクセスするために、Raspberry Piにavahi-daemonもインストールしておくとよいでしょう。以下コマンドでインストールできます。

$ sudo apt-get install avahi-daemon

 インストールすると、MacかiTunesをインストールしたWindowsから、ssh ubuntu@ubuntu.localでアクセスできるようになります(ubuntu.localの部分は、必要に応じて自分のRaspberry Piのホスト名に入れ替えてね)。avahi-daemonを入れない場合は、直接IPアドレスでアクセスしましょう。

ルンバを制御するROSパッケージをセットアップする

 ルンバ用のROSパッケージは以下2つがメジャみたいです。

 ネット情報だとroomba_500_seriesの例が多かったのですがcreate_autonomyの方がアップデートも頻繁で、READMEもしっかりしていたのでcreate_autonomyを使用することにします。roomba_500_seriesでも多分問題はないとおもいますので、お好みで。以下はcreate_autonomyのセットアップの例です。

 READMEを見ると、catkin tools(catkin_build)でのビルドを推奨しているので、以下でインストール

$ sudo apt-get install -y python-catkin-tools

 ワークスペースはcatkin_wsとして、あらかじめビルドしておきましょう。よくわからん人はとりあえず以下実行して下さい。

$ rm -rf ~/catkin_ws
$ mkdir -p ~/catkin_ws/src  
$ cd ~/catkin_ws 
$ catkin init  
$ catkin build

 あとは、ほぼREADME通りです。以下コマンドでリポジトリのクローン、必要なパッケージのダウンロード、ビルドをします。

$ cd ~/catkin_ws/src
$ git clone https://github.com/AutonomyLab/create_autonomy.git 
$ cd ~/create_ws
$ rosdep update  
$ rosdep install --from-paths src -i  
$ catkin build

 エラーなくビルドできたら完了

ROSでルンバコントロールの動作確認

 ルンバとRaspberry Piを以下のように接続します。Raspberry Piの電源はモバイルバッテリからとるのがよいでしょう。

 PCからRaspberry Piにログインします。ルンバの電源を入れた後、1つ目のターミナルで以下実行します。

$ roslaunch ca_driver create_2.launch

 ルンバから電子音がして、残りバッテリがターミナルに表示されたら接続成功です。

 次に2つ目のターミナルで以下を実行します。これがルンバに回転しろという指令になります

$ rostopic pub /cmd_vel geometry_msgs/Twist -r 60 -- '[0, 0, 0]' '[0, 0, 0.5]'

 このコマンドを詳しく知りたい方は以下を参照下さい。 ROSトピックの理解

 このように何度もターミナル開いてsshで接続するのも大変ですね。ROSではよくこういうことを行うので、先ほどROSのセットアップのところで紹介したbyobuなどの仮装端末ソフトを使うのがおすすめです。

ルンバからRaspberry Piに電源供給

 ルンバオープンインターフェースのBattery VoltageピンからRaspberry Piに電源供給することも可能です。ただこの電源ピン、仕様の詳細が公開されていません。ネットで色々調べると、どうもルンバのバッテリと直接接続されているわけでなく、間に過電流保護素子(ポリスイッチ)が入っているらしいことがわかりました。

 あるサイトによると、200mAのポリスイッチで330mA程度引っ張れるみたいなことが書いてあります。ルンバの電圧は14V程度なので間に90%程度の効率のD/Dコンを挟んで14Vから5Vに降圧するとすると、14V*330mA*0.9/5V=830mA。むむ、Raspberry Piを動かすにはちょっと厳しそう…

 ダメ元でスイッチサイエンスさんで買った、D/Dコンを使用します。9Aも引っ張れるハイパワーな電源ですが、そもそも大元の電流がそんなに引っ張れないので、もっと小さなものでもOKです。今回はたまたま手持ちにあったものを使用しました。

 必要な工具は以下くらいです。ピンヘッダはD/Dコンに付属していました。ピンヘッダをニッパで切って半田付けします

 あとは、Battery VoltageからD/Dコン、Raspberry Piのピンヘッダの5Vという順に接続してやるだけです。

 一応問題なく動きました。ただ、どれだけ余裕があるかはちょっと不安ですね。Raspberry Pi 3だと重い処理させると落ちちゃったりするかも…

 あと、はてなブックマークのコメントに安いシリーズ電源使えば良いというコメントありましたが、個人的には厳しいかなと思います。330mAしか引っ張れないので、そもそもRaspberry Piが起動しない可能性が高いですし、仮に起動したとして損失が9V*0.3A=2.7Wの熱になるので、相当熱くなると思います(多分電源が止まるか壊れます)。やってみたい方は止めはしませんが自己責任で。

まとめ

 ルンバをハックしてRaspberry PiとROSでコントロールできるようになりました。今後、スマホでコントロールとか、音声認識/音声合成とか人工知能搭載とか、地図生成(SLAM)とか色々試してみたいなと思っています。ただ、今の基板ムキ出しのままだと、普通のルンバとして使用できず妻に怒られてしまうので、ケースとかを作るところからでしょうか。あと、娘はルンバが怖いみたいなので、娘が怖がらないようにも出来たらよいなと考えています。

 ルンバに怯えるレモンちゃん。先は長そう

 もし、この記事ではよく分からなかったけど、もっとRaspberry PiとROSのこと知りたいということであれば以下の本が参考になると思います。Raspbery Piの基礎、バージョン管理システム(Git/GitHub)から始まり、ROSでのソフト開発にとどまらず、デバイスドライバの開発まで踏み込んでいる意欲的な良書です。

 ちなみに、上記の本では下記のRaspberry Pi Mouseを対象にしていますが、ルンバにも応用が利きます。ハードウェアが変わっても応用が利くのがROSの良いところですね(もちろん本のコードが全部そのまま動くわけではありません)。ルンバの方がRaspberry Pi Mouseより安くてお得でもありますが、本の意図している教育的な内容の多くが(センシング、デバイスドライバ開発等)が失われることには留意下さい。教育目的であれば、Raspberry Pi Mouseを使用することを強く勧めます。

追記:改造を手軽にするために自作基板を製作しました。興味ある方は、以下記事参照下さい。

書籍の宣伝「からあげ先生のとにかく楽しいAI自作教室」

 AIの初心者向け本「からあげ先生のとにかく楽しいAI自作教室」を執筆しました。Google Colabを使って、実際に動かしながらAIを学べる本になっています。

 文系でAI素人の私の妻も、実践できて理解を深められるような、初学者向けの内容になっています。この記事紹介したルンバをAIで制御するといった企画も盛り込んでいます。以下に紹介記事を書いていますので、興味ある方は是非ごらんください。

関連記事

 Raspberry Piで作ったロボット。下記記事では、ROSは使っていません。

参考外部リンク

ハードウェア関係

ROS勉強記録: ルンバをプログラムする準備

http://hyakuren-soft.sakura.ne.jp/hobby_robot_sdk/about_roomba_page.html

Roo Pi - controlling a Roomba with a raspbery pi

Raspberry Pi でシリアル通信 – 或る阿呆の記

掃除ロボットをかゆいところまで手の届く仕様に改造する - ABEJA Tech Blog

ソフトウェア関係

http://science.irobot-jp.com

ROS_21:Roomba Driver Install - Qiita

http://szmlb.hatenablog.com/entry/2015/10/11/170900

しくみ製作所

しくみ製作所

https://datahotel.io/archives/2999

本記事を参考にしてくださっている記事

ルンバの制御用USBシリアルケーブルを綺麗に作りたいときのメモ - cvl-robot's diary

ルンバを Raspberry Pi でコントロールする - たるこすの日記

ROSを使ってルンバが操作できるまで feat. Raspberry Pi3とPS4コントローラーとUSBカメラ - Qiita

変更履歴

  • 2019/10/21 シリアル通信に関してRaspi-Configでの設定追記
  • 2019/05/07 本記事を参考にしているサイトへのリンク追加
  • 2017/09/11 本記事を参考にしているサイトへのリンク追加
  • 2017/05/12 電源に関して追記