読者です 読者をやめる 読者になる 読者になる

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

f:id:karaage:20170503001812j:plain:w640

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

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

f:id:karaage:20170503002035j:plain:w640

【国内正規品】 iRobot ロボット掃除機 ルンバ 622 ホワイト

【国内正規品】 iRobot ロボット掃除機 ルンバ 622 ホワイト

 目的はもちろんお掃除してもらうことなのですが、やはりルンバを買ったら色々いじりたくなってしまいますね。というわけで、サクッと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 MODEL B

Raspberry Pi 3 MODEL B

 Raspberry Pi 3

 microSDカード。最低8GB程度

 マイクロUSB接続

PLANEX 無線LAN子機 (USBアダプター型) 11n/g/b 150Mbps MacOS X10.10対応 GW-USNANO2A (FFP)

PLANEX 無線LAN子機 (USBアダプター型) 11n/g/b 150Mbps MacOS X10.10対応 GW-USNANO2A (FFP)

 PLANEX GW-USNANO2A

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

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

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

普通のジャンパワイヤ(オス?オス)

普通のジャンパワイヤ(オス?オス)

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

 モバイルバッテリ(使用したものが品切れだったので、同じメーカの別のものにリンクしています)

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

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

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

 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変換アダプタで接続する方法

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

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

 以下のようなむき出しの状態にします f:id:karaage:20170503001804j:plain:w640

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

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

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

f:id:karaage:20170503001810j:plain:w640

配線の色 ルンバ シリアル変換アダプタ
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) レベル変換必要

 実際に接続した様子は以下になります。 f:id:karaage:20170505104450j:plain:w640

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

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

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

$ sudo vim /boot/config.txt

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

core_freq=250

 また、以下の記述があるかを確認しておきましょう(デフォルトでは記述があるはずです)

enable_uart=1

 Raspberry Pi 2の場合は、この設定は不要のはずですが、試せてはいません。ここらへんのもう少し詳細はMacからRaspberry Piにシリアル通信(UART)でログイン - 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"

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

$ sudo apt-get install avahi-daemon

ルンバを制御する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の電源はモバイルバッテリからとるのがよいでしょう。 f:id:karaage:20170503001812j:plain:w640

 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に降圧するとすると、14V330mA0.9/5V=830mA。むむ、Raspberry Piを動かすにはちょっと厳しそう…

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

f:id:karaage:20170503001811j:plain:w640

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

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

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

まとめ

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

f:id:karaage:20170503001809j:plain:w640  ルンバに怯えるレモンちゃん。先は長そう

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

Raspberry Piで学ぶ ROSロボット入門

Raspberry Piで学ぶ ROSロボット入門

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

Raspberry Pi Mouse V2 フルキット

Raspberry Pi Mouse V2 フルキット

関連記事

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

参考外部リンク

ハードウェア関係

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

趣味で作るロボット用ソフトウェア: ルンバの制御について

Roo Pi - controlling a Roomba with a raspbery pi

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

ソフトウェア関係

アイロボットルンバ|ロボット開発応援プロジェクト 公式サイト

ROS_21:Roomba Driver Install - Qiita

ROSでroombaを動かすまでのまとめ - AKHrobotics

ルンバがうちに、やってきた。 – しくみ製作所ブログ

「@Roomba 掃除しろ」 Slack BOT から新型ルンバ980をWiFiで制御する – しくみ製作所ブログ

「Hey Siri 掃除をして」で、Roomba(ルンバ)に掃除をしてもらう | マルチクラウドインテグレーター データホテルのテックブログ