Raspberry Pi 3にROSをセットアップしてRaspberry Pi純正カメラ(Raspicam)で遊んでみた

f:id:karaage:20170407151438j:plain:w640

2017/05/02 cakin_make catkin toolsに関して追記

Raspberry Pi 3にROSを入れたい!

 以前Raspberry Pi 2にROS(Robot Operating System)を入れていました。ROSって何という人は下記記事を参照下さい。

 ただ、Raspberry Pi 2だとROSが重いのと、Raspberry Pi Camera Moduleを使えなかった(使い方が分からなかった)のであまり活用できていませんでした。そんなおり、いよいよRaspberry Pi 3でROSをセットアップする方法がネットに色々出てきたので、チャレンジしてみることにしました。

 例によって実際に手を動かすと色々ハマったり分かったことがあったので、まとめておきます。

Raspberry Pi 3とROSでこんなことができる

 まずはROSでどんなことができるかを紹介します。例えばRaspberry Piの純正カメラを使えるraspicam_nodeというノード(ソフト)を使うと、以下の写真のようにRaspberry Piのカメラの映像を別のROSを動かしたPCで表示することができます。

f:id:karaage:20170407151438j:plain:w640

 他のROSのパッケージを入れれば、カメラ画像を使ってマーカ認識したり、顔検出等もできます。つまりRaspberry Piを簡単にロボットの目として使うことができます。もし、Raspberry Piにモータとタイヤをつけて動けるようにすれば、そのままRaspberry Piの自律ロボットをつくることもできそうですね。

必要なもの

Raspberry Pi関連

Raspberry Pi 3 MODEL B

Raspberry Pi 3 MODEL B

 Raspberry Pi 3

 Raspberry Pi 3の付属品(SDカード、Micro SDカード、AC電源、その他開発に必要なもの)や基本的なセットアップに関しては、下記記事を参照してください。

 Raspberry Piを無線で接続したい場合は、以下も必要です

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

Raspberry Pi Camera V2

Raspberry Pi Camera V2

 カメラモジュール

Raspberry Pi B+ (Plus) 専用ケース RS製 (White)

Raspberry Pi B+ (Plus) 専用ケース RS製 (White)

 ケース

PC関連

UbuntuのインストールされたPC(バーチャルマシンでもOK)

Raspberry Pi 3へのROSインストール方法

 ここからはRaspberry Pi 3へのROSインストール方法の説明です。宇宙語が続くので興味のある方のみご覧下さい。

 まずRaspberry Pi 3にROSをインストールする方法として、RaspbianベースにROSをインストールする方法と、UbuntuベースにROSをインストールする方法の2種類があります。結論から言うと、UbuntuベースにROSを入れた方が良いです。Raspberry Pi 3の内蔵WiFiが使えなくなる問題はありますが、普通のROS同様apt-getでパッケージをインストールできるので楽です。純正カメラも設定すれば使えるようになります。

 Raspbianベースの場合は、最初から純正カメラも内蔵WiFiが使えるのは良いのですが、パッケージを全部ソースからビルドする必要があります。ROSは結構パッケージの依存関係が複雑なことが多いので、これはかなり辛いです。自分にはcamera_nodeのビルドすら通すことができませんでした…

 一応RaspbianベースとUbuntuベース両方のセットアップ方法を記載しますが、特にこだわりが無ければUbuntuベースをオススメします。こんなセットアップやってられないYO!という人は、全てセットアップを実施したUbuntu+ROSのイメージファイルを用意してありますので、最後のイメージファイルだけダウンロードしてもらってもOKですw

ROSインストール(Raspbian)

 Raspberry Pi 3のRaspbian上にROSをインストールするにあたっては、以下サイトをめちゃくちゃ参考にしました(ほぼそのまま)。

Raspbianセットアップ

 Raspberry PiへのRaspbianの基本的なセットアップは、手前味噌ですが下記記事参照下さい。

 上記から変更する必要があるのは、raspi-configで下記の通り、Boot設定をTo DesktopからTo CLI(コマンドライン)に変更するのと f:id:karaage:20170324161406p:plain:w640

 言語設定を下記の通り英語にします f:id:karaage:20170324161416p:plain:w640

 さらにキーボード設定を変更します。下記の通りコマンド実行して

$ sudo dpkg-reconfigure keyboard-configuration

 下記の通り設定します。

Generic 105-key (Intl) PC → Japanese → Japanese → The default for the keyboard layout → No compose key

 以下コマンドで再起動して設定を有効にします。

$ sudo shutdown -r now
RaspbianへのROSセットアップと動作確認

 続いてROSのセットアップです。参考サイトの通りに実行していけばインストールできます。私は面倒くさがりなのでスクリプトにしてGitHubにアップしました。

 以下の3行のコマンドうてば自動でROSがセットアップされます。

$ git clone https://github.com/karaage0703/raspberry-pi-setup
$ cd raspberry-pi-setup
$ ./setup-ros-indigo-raspbian.sh

 以下実行して、エラーなく実行されればOKです。

$ roscore

 止めたい場合はCtrl + Cを入力すればOK。

f:id:karaage:20170407150059j:plain:w640

 Raspbianに関してはここまで。

ROSインストール(Ubunutu)

 Raspbian 3にUbuntu上にROSをインストールするに当たっては、以下サイトをめちゃめちゃ参考にしました(ほぼ全て)

Ubuntuセットアップ

 まずは、Raspberry Piに通常のRaspbianではなく、UbuntuというLinuxをインストールする必要があります。ここから、ハードルが高くて、上記サイトを探していけば全てやり方は書いてあるのですが、正直Linuxの操作に慣れている人でないとハードルが高いと思います(説明が理解できないと思う)。

 ただ、なんと上記サイトの方が作成したRaspbeery Pi用のUbuntu 14.04のイメージファイルを公開して下さっています。まさに神!ありがたく下記サイトからダウンロードさせていただきましょう。

Ubuntu on Raspberry Piイメージファイル

 上記イメージファイルをダンロードしたら、後はRaspbianと同様の要領で、SDカードを作成するだけです。ここらへんのやり方は、以下記事を参考にして下さい(Raspbian Jessie SDディスク作成のところです)。

 具体的な書き込みのコマンドはイメージファイルrp3ubuntu1404.ddと同じフォルダに移動して、以下実行しました

$ sudo dd if=rp3ubuntu1404.dd of=/dev/rdisk2 bs=1m

 ユーザー名、パスワード共にデフォルトはubuntuです。

 続いてRaspbianのときと同様、キーボード設定を変更します。下記の通りコマンド実行して

$ sudo dpkg-reconfigure keyboard-configuration

 下記の通り設定します。

Generic 105-key (Intl) PC → Japanese → Japanese → The default for the keyboard layout → No compose key
Ubuntuネットワーク設定(有線)

 そして、ネットワーク設定です。最初、何故か有線ネットワークを繋げてもeth0を認識できず悩んでいたら、以下サイトに情報がありました。

 以下実行して、再起動すればOKのようです。

$ sudo rm /etc/udev/rules.d/70-persistent-net.rules

 これで有線のLANケーブルをRaspberry Piに繋げれば、インターネットに繋がります(既に有線LANでネットワーク接続ができている前提です)。以下の設定に関しては、インターネットへの接続ができている前提で説明しています。

Ubuntuネットワーク設定(無線)

 無線の設定です。Raspberry Pi 3内蔵のWiFiは、例によってUbuntuでは認識してくれないので、USB WiFiモジュールを使うのがよいです。Ubuntuで内蔵WiFi使うのは不可能ではないみたいなので、興味あるかたは色々調べて見るとよいと思います。

 最初に以下コマンドで設定ファイルを編集します

$ sudo vi /etc/network/interfaces

 以下をファイルの一番下に追加します

auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wifi.conf
wireless-power off

 wifi接続に必要なパッケージをインストールして、wifiの設定ファイルを作成します。ssidpasswordのところは、ご自身の環境のSSIDとパスワードに書き換えて下さい

$ sudo apt-get install wpasupplicant
$ sudo apt-get install wireless-tools
$ sudo -s
# wpa_passphrase ssid passowrd > /etc/wpa_supplicant/wifi.conf
# exit

 /etc/wpa_supplicant/wifi.confという設定ファイルが生成されたら成功です。

 以下実行して、無線LANが認識されたら成功です。

$ sudo ifup wlan0
UbuntuへのROSセットアップと動作確認

 続いて、UbuntuにROSをインストールしましょう。こちらも上記サイトの方がこちらのページで日本語でわかりやすくまとめて下さっています。英語が苦でない人は、ROS公式サイトのARMにROSをインストールするマニュアルを見ればOKです。

 私は、例によって自動でセットアップするスクリプトを作成しましたので、以下3行のコマンド実行すれば、ノンストップでROSをインストールしてくれます。

$ git clone https://github.com/karaage0703/raspberry-pi-setup
$ cd raspberry-pi-setup
$ ./setup-ros-indigo-ubuntu.sh

 Raspbianのときと同様、以下実行して、エラーなく実行されればOKです。

$ roscore

 止めたい場合はCtrl + Cを入力すればOK。

raspicam_node セットアップ

 Raspberry Piの標準のカメラをROSで使えるraspicam_nodeという素晴らしいパッケージがあるのでこちらを使います。

 基本的には、上記のREADMEをもとに実施していけばインストールできます。例によって1〜6を自動で実行するスクリプトをraspberry-pi-setupのリポジトリに入れておいたので、楽したい方は使ってみてください。以下実行するだけです。

$ ./setup-ros-indigo-raspicam_node.sh

 上記実行したら以下実行して

$ sudo -s
$ echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0660"' > /etc/udev/rules.d/10-vchiq-permissions.rules
$ usermod -a -G video `whoami`
$ sudo shutdown -r now

 以下実行して

$ cd ~
$ sudo apt-get install -y curl
$ sudo curl -L --output /usr/bin/rpi-update https://raw.githubusercontent.com/Hexxeh/rpi-update/master/rpi-update && sudo chmod +x /usr/bin/rpi-update
$ sudo rpi-update
$ sudo reboot

/boot/config.txtを書き換え

start_x=1 
gpu_mem=128

 ここまでやって再起動

$ sudo shutdown -r now

 これでRaspberry Piの純正カメラが使えるようになります。

 いよいよカメラノードを起動します。以降は、複数コンソールを切り替える必要があります。まずは一つ目のコンソールで以下実行

$ roscore

 次にAlt+F2を押して、別のコンソールに切り替えて以下実行します。

$ rosrun raspicam raspicam_node

 問題なければ、これでカメラノードが起動します。ちなみにroscoreを実行したコンソールに戻りたい場合はAlt+F1です。

 Alt+F3を押して、別のコンソールで以下実行します。

$ rostopic list

 以下のようなトピックが表示されればOK

/raspicam_node/camera/camera_info
/raspicam_node/camera/image _image_transport

 このように毎回コンソールを切り替えてログインするのも大変なので、仮想端末ソフトを使うと便利です。私はよくbyobuというソフトを使っています。詳細は以下参照下さい。

ROS indigo(Ubuntu) on Raspberry Pi 3 イメージファイル

 こんなん全部やってられないYO!という面倒くさがり屋の人のために、UbuntuベースにROSをセットアップまで実施したイメージファイルを作成したので公開します。配布されているUbuntuをベースにROSとraspicam_nodeのみ追加してあります(両方ともライセンスはBSDなので再配布は問題無い認識)。

 無線LAN設定は実施していないので、使用したい方はご自身の設定に合わせて設定下さい。

ROS Indigo(Ubuntu) on Raspberry Pi 3イメージファイル

 イメージファイルは3G程度に縮小されているので、gpartedなどのパーティション管理ソフトでパーティションをリサイズして使って下さい(リサイズしなくても良いですが、SDカードの空き容量が無駄になってしまいます)。

 イメージファイルをSDに書き込む方法や、パーティションのリサイズに関しては下記記事を参照下さい。

ROSを使ってPCとRaspberry Piで通信を行う

 ROSの良いところは、ROSのインストールされたマシン同士で、ROSのプロトコルを用いて簡単に通信やデータのやりとりができるところです。カメラのノード起動しただけだと面白くないので、別のPCでカメラの画像を可視化するということを行ってみたいと思います。以下Raspberry PiのIPアドレスは192.168.0.1という前提で説明します。

 今回は、Raspberry PiとPC(LIVA)を使います。 f:id:karaage:20170407151539j:plain:w640

 PCは昔はてなさんにプレゼントして頂いたものです!ちゃんと活用してますよ!

Raspberry Pi側の設定

 基本的には、先ほどと同じなのですが、1行IPアドレスの設定を事前に行います。

 まずRaspberry Piを立ち上げて、デフォルトのコンソールで以下実行

$ export ROS_IP=`hostname -I`
$ roscore

 Alt+F2を押して、別のコンソールで以下実行

$ export ROS_IP=`hostname -I`
$ rosrun raspicam raspicam_node

 これでRaspberry Pi側は準備完了です。

PCへのROSセットアップと動作確認

 PCにはROSとUbuntuがセットアップされている前提です。

 Ubuntu PCへのROSのセットアップは以下参照下さい。

 Ubuntu PCなんて持ってないよ!という人は、仮想化環境でも大丈夫です。以下参照下さい。

 セットアップできたら、起動してターミナルで以下実行するだけです。

$ export ROS_MASTER_URI=http://192.168.0.1:11311
$ export ROS_IP=`hostname -I`
$ rosrun image_view image_view image:=/raspicam_node/camera/image _image_transport:=compressed

 後は、以下のようにRaspberry Piのカメラモジュールを対象に向けます(カメラモジュールはケースの中に入っています) f:id:karaage:20170407151513j:plain:w640

 以下のようにPC側でRaspberry Piカメラの画像を表示できます。リアルタイムでプレビューしています f:id:karaage:20170407151438j:plain:w640

ROSのビルドシステム catkin_makeとcatkin tools(catkin build)に関して

 ここはある程度詳しい方や興味ある方のみ見てもらえればOKです。ROSのパッケージをビルドする方法、ROSハデフォルトはcatkin_makeなのですが、私は好みでcatkin toolsというツールを用いてビルドしています。

Catkin Command Line Tools — catkin_tools 0.0.0 documentation

 catkin tools(catkin build)は以下コマンドでインストールできます。

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

 catkin toolsでのワークスペースの作り方は以下になります。

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

 catkin tools(catkin build)でワークスペース作っておくと、ビルドしたいパッケージのディレクトリの中で catkin btと実行するとそのバッケージをビルドしてくれたりと便利です(btbuild thisらしい)。

 やっぱりcatkin toolsは嫌だ、catkin_makeを使いたいという場合は、ワークスペースを作り直して下さい。具体的には以下コマンドを実行すればOKです。

$ rm -rf ~/catkin_ws
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin_make

 catkin_makeに関して詳しく知りたい方は以下のサイト等が詳しいです。

まとめ

 ROSを使ってRaspberry Piの純正カメラで遊んでみました。リモートでカメラをモニタリングするだけなら、見守りカメラで使ったRPi-Cam-Web-Interfaceだったり、リモートWiFiカメラで使ったmjpeg-streamerといった技術もあるのですが、ROSでやると、ROSの豊富なパッケージと組み合わせて、画像処理だったりRaspberry Pi自体をロボットにしてしまったりと色々面白いことができそうですね。またいずれトライしてみたいなと思います。

 ROSに関して色々知りたいという方は、まず以下の本が日本語の入門書としてわかりやすいかと思います。

 最近Raspberry PiとROSの本も出ています。こちらもすごく良さそうな本です。なにせRaspberry Pi財団創設者のEben Upton氏推薦!実は既に購入しているのですが、発売されたのが、この記事を書いた後なのでこの記事自体は下記本の内容は何も反映されておりません(笑)

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

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

参考リンク

Raspberry pi 2(Raspbian Jessie)にROS indigo(ROS-Desktop,rqt,rviz)をインストールする - Flow-Developers

cmake error, poco was not found, Raspberry Pi, ROS Indigo - ROS Answers: Open Source Q&A Forum

How to install Vorbis OGG?

yaml-cpp includes / libraries · Issue #24 · ros-perception/image_common · GitHub

Compressed image transport segmentation fault with OpenCV. · Issue #49 · ros-perception/image_common · GitHub

c++ - fatal error: yaml-cpp/yaml.h: No such file or directory - Stack Overflow

ROSのインストール | エンジニア「くがとしお」のレベル上げ

raspberry pi 3で ROS Kinetic Kame を動かす - 空飛ぶロボットのつくりかた

関連記事