Raspberry Piでルンバをハックする
たまにアマゾンで何か面白い商品はないかと物色しているんですが、先日中古の800番台のルンバを2万円切る価格で見つけました。
新品だと最低でも5万円ぐらいはするような感覚だったので、躊躇せずポチりました。というのも、以前からルンバは内部でROSを使っていて、外部からアクセスできる端子があるらしいという話を聞いていたのです。
ROSとは「Robot Operating System」の略で、ロボットの開発や制御に使うソフトウエア群です。
Operating System(オペレーティングシステム)とありますが、いわゆるWindows、Mac、LinuxのようなOSではなくて、ロボット開発のフレームワークやミドルウエア、開発支援のソフトウエアみたいなものの様です。
以前からROSがどんなものか動かしてみたいと思っていたのですが、実機のロボットが手元になく、ROSが使えるようなロボットはそこそこ価格がするので、手を出せないでいました。それが2万円を切る価格で買える(しかも残り1台)ということで、迷う理由はありません。
ついでに掃除をする機能もついていますしね。
準備
用意した物は、
- ルンバ885
- RaspberryPi 3B
- microSDカード
- USBケーブル-micro B
- モバイルバッテリー
- ジャンパーワイヤ(オス-オス、オス-メス)
- 抵抗:10kΩ
です。
秋月電子通商やスイッチサイエンスの方がお値打ちかもしれませんが、多分アマゾンでも揃えられると思います。
Raspberry Piセットアップ
ROSを動かすOSとしてはRaspbianでも出来そうですが、実績としてはUbuntu系が多いようなので、今回は比較的軽量なUbuntu MATEのLTSで16.04を使うことにします。
OS:Ubuntu MATE 16.04 LTS
OSのインストールは、Raspberry Piの他のOSのインストール手順と変わらないので、省略します。
Raspberry PiでUbuntu MATEを起動したとして、以下を続けます。
Raspberry Pi環境のセットアップ
ソフトウェアのインストール
$sudo apt update -y && sudo apt upgrade -y && sudo apt clean && sudo apt autoremove
$sudo apt install vim git avahi-daemon openssh-server
wifi接続&SSHサービスの起動
ルンバや他のロボットにraspiを搭載して動かすと、有線では厳しくなるので無線接続が基本になります。
wifiの接続はGUIから設定できるので、特に説明は必要ないと思います。
SSHサービスの設定と起動も本文の本筋から外れるので省きます。優良な記事が他にたくさんあると思うのでそちらを参照してください。
avahiの設定
avahiはZeroconf仕様の実装で、詳しい説明はしませんが、ローカルネットワーク上でraspiにアクセスしたい時に便利になります。
詳しく知りたい方は、「avahi」や「Zeroconf」で調べてみてください。
$ sudo vim /etc/avahi/services/ssh.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_ssh._tcp</type>
<port>22</port>
</service>
</service-group>
$ sudo vim /etc/hosts
$ sudo vim /etc/hostname
それぞれのファイルの「raspberrypi」と書かれているところを、好きなホスト名に変えることが出来ます。
例)roombapi
avahi-daemon起動
$ sudo service avahi-daemon restart
ホスト名を「roombapi」にした場合、クライアントから以下のようにアクセスできるようになります。
$ ssh roombapi.local
ROSインストール
概ね公式の以下の通りで、インストールできると思います。
Ubuntu install of ROS Kinetic – 公式
http://wiki.ros.org/kinetic/Installation/Ubuntu
今回ROSのバージョンはKineticを使います。
ROS:Kinetic Kame
ここはまだ、リモートでアクセスしなくても良いです。
後でROSの動作確認をするためGUIでログインした方が好都合なので、raspiに直接ディスプレイやキーボード/マウスを接続して端末アプリで以下を実行します。
1 aptの準備
ROSのパッケージにアクセスできるようにsources.listにrosの該当リポジトリを追記して、認証する鍵情報を取り込みます。
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
2 ROS Kineticインストール
$ sudo apt update$ sudo apt install ros-kinetic-desktop-full$ apt-cache search ros-kinetic
3 ROSの環境セットアップ
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc$ source ~/.bashrc
4 ROSの開発やパッケージ管理に必要なライブラリをインストール
$ sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
5 rosdepの初期化
rosdepはROSの各種パッケージの依存関係を管理してくれるツールです。
これを初期化します。
$ sudo rosdep init$ rosdep update
6 ROSのワークスペース作成&初期化
$ mkdir -p ~/catkin_workspace/src$ cd catkin_workspace/src$ catkin_init_workspace$ cd ~/catkin_workspace/$ catkin_make
7 作成したワークスペースをROSの環境に設定する
$ echo “source ~/catkin_workspace/devel/setup.bash” >> ~/.bashrc$ source ~/.bashrc
動作確認
ROSは「ノード」と呼ばれる最小実行単位から別の「ノード」へメッセージを送り、複数のノードが組み合わさって動作します。なので、1つのノードにターミナルを1つ割り当てて実行するのが基本になります。
以下、それぞれ別のターミナルを開いて実行
ターミナル1:roscore起動
ROSのコアを起動します。
$ roscore
ターミナル2:turtlesim_node起動
turtlesimのノードを起動します。
カメのキャラクターが真ん中に表示されたウィンドウが表示されます。
$ rosrun turtlesim turtlesim_node
ターミナル3:turtle_teleop_key node起動
キーボードでカメを操作するノードを起動します。
起動後、矢印キーを押すと、カメが前後に動いたり回転したりします。
$ rosrun turtlesim turtlesim_node
キーボードの矢印キーでタートルを動かせればROSの動作確認は出来ました。
ROSでルンバを動かす
1 パッケージのインストールとビルド
ルンバを動かすためのROSパッケージの”create_autonomy”をインストールし、ビルドします。
$ cd ~/catkin_ws/src$ git clone https://github.com/AutonomyLab/create_autonomy.git$ cd ~/catkin_ws$ catkin_make -j2$ source devel/setup.bash
もし、下記の様なエラーが出たら、
https://github.com/tork-a/jog_control/issues/12
CMake Error at create_autonomy/ca_driver/CMakeLists.txt:4 (find_package):
By not providing "Findlibcreate.cmake" in CMAKE_MODULE_PATH this project
has asked CMake to find a package configuration file provided by
"libcreate", but CMake did not find one.
Could not find a package configuration file provided by "libcreate" with
any of the following names:
libcreateConfig.cmake
libcreate-config.cmake
Add the installation prefix of "libcreate" to CMAKE_PREFIX_PATH or set
"libcreate_DIR" to a directory containing one of the above files. If
"libcreate" provides a separate development package or SDK, be sure it has
been installed.
-- Configuring incomplete, errors occurred!
See also "/home/asao/catkin_workspace/build/CMakeFiles/CMakeOutput.log".
See also "/home/asao/catkin_workspace/build/CMakeFiles/CMakeError.log".
Makefile:318: recipe for target 'cmake_check_build_system' failed
make: *** [cmake_check_build_system] Error 1
Invoking "make cmake_check_build_system" failed
ディレクトリをワークスペースに移動して以下のコマンドを実行すると、ビルド時に依存するパッケージを取得します。
実行後もう一度ビルドします。
$ cd ~/catkin_workspace$ rosdep install -r --from-path src --ignore-src
2 Raspiの設定
シリアル通信用の設定
$ sudo vim /boot/config.txt#以下の2行を追加core_freq=250enable_uart=1
$ vim create_autonomy/ca_driver/config/default.yaml#コメントアウト#/dev/ttyUSB0 #追記/dev/ttyS0
実行権限を付与
$ sudo chmod a+rw /dev/ttyS0
3 配線
ルンバにはmini DIN 7pinのシリアルポートがついています。ただ全部のルンバについているかというとそうではないみたいで、色々調査すると500、600、700、800シリーズならついてそうです。800シリーズは取手のしたにありました。
また、iRobot社はシリアルインターフェースの仕様を公開していて、こちらを参考にしてraspiと接続してみます。
iRobot® Roomba 500 Open Interface (OI) Specification
Raspberry Piは3.3Vですが、ルンバ側は5Vです。raspi→ルンバへの信号は直接送っても良いみたいですが、逆はレベル変換が必要です。
今回はとりあえず動くことを確認するために、抵抗の分圧でレベル変換しました。ルンバのシリアルポートは見難いので、上の仕様書で指す場所をよく見て確認した方が良いです。
raspberrypi | ケーブル色 | ケーブル色 | ルンバ | |
---|---|---|---|---|
GPIO15(RXD) | 青 | → | 緑 | TXD |
GPIO14(TXD) | 黄 | → | 黄 | RXD |
GND | 黒 | → | 黒 | GND |
4 ルンバの動作確認
ここからはルンバを動かすので、raspiをモバイルバッテリーに繋ぎます。
上記の配線をして、raspiとルンバの電源を入れます。
sshでraspiに接続してから、一つ目のターミナルで、以下を実行します。
$ roslaunch ca_driver create_2.launch
何やらズラズラっと表示されます。
Battery level 98.54 %
のように充電率が表示されたら、
別のターミナル開いて以下を実行するとルンバが回転します。
$ rostopic pub /cmd_vel geometry_msgs/Twist -r 60 -- '[0, 0, 0]' '[0, 0, 0.5]'
直進と回転の両方を同時に実行することも出来ます。
$ rostopic pub /cmd_vel geometry_msgs/Twist -r 60 -- ‘[0.1, 0, 0]' '[0, 0, 0.5]'
まとめ
以上で、Rasberry PiからROSを使ってルンバを動かすことが出来ました。
ただ、動かすのにいちいち上記のようなコマンドを打つのは面倒です。
今後は、スマホやゲームのコントローラー、音声で操作したり、C++やpython等のプログラミング言語で操作できるようにしたいと考えています。
その先にはカメラをつけて、周囲の状況を判断して障害物を避けるようなことができると面白そうですね。
ファブリカコミュニケーションズで働いてみませんか?
あったらいいな、をカタチに。人々を幸せにする革新的なサービスを、私たちと一緒に創っていくメンバーを募集しています。
ファブリカコミュニケーションズの社員は「全員がクリエイター」。アイデアの発信に社歴や部署の垣根はありません。
“自分から発信できる人に、どんどんチャンスが与えられる“そんな環境で活躍してみませんか?ご興味のある方は、以下の採用ページをご覧ください。