Raspberry Pi 2にROS(Robot Operating System)をインストールしてみる

f:id:karaage:20150829081351p:plain:w640

ROSとは?

 Robot Operating Systemの略です。Operating Systermといっても実はOSでは無くて、Linux(Ubuntu)上で動くミドルウェアです。アメリカ発のミドルウェアで、現在のロボットの研究・開発ではデファクトスタンダードになっているOSS(オープンソースソフトウェア)です。
 この前、DARPAというロボット競技会で日本が10位になってしまったと話題になりましたが、実はこの競技会のロボットの大半に使われているミドルウェアがROSです。DARPAで使われているソフトウェアも、結構OSSとしてWeb上に公開されていたりします。日本のロボットもROSを使っていますね。

 後は、トヨタさんが最近HSR(Human Support Robot)というロボットを作っていますが、こちらにも実はROSが使われていたりします。


 ROSの良い点はソフトウェアの再利用しやすいこと、世界中の人が色々なデバイス(カメラ・センサ・ロボット)のデバイスドライバやソフト使っているところと、シミュレーション(Gazebo)や画像処理ライブラリ(Open CV)と連携しやすい等色々あるみたいなので、以前Raspberry Piで作ったロボットをROSで動くようにして色々試してみようかなと思います。

 参考書は以下の本です。今の所唯一の日本語で書かれたROSの書籍です。

 以下はROSに興味ない人は全く意味のない内容が続くので、ここまで読んでまだ興味があるという人だけ続きを読むをクリックください。

Raspberry Pi 2にROSをインストールする方法

 ROSはUbuntu上で動くのでUbuntuをインストールしたPCにインストールするのが通常なのですが、Ubuntuが動くまともなPCが無かったのと、以前作ったロボットがRaspberry Piで動くのでRaspberry Piにインストールにチャレンジしてみます。

必要なもの

 最低限は以下くらい。

Raspberry Pi 2 Model B

Raspberry Pi 2 Model B

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

 あとは以下を参考に適当に購入ください。


ROSがインストールされたRaspberry Pi 2用Ubuntuをダウンロード

 正攻法でインストールするなら、ROSをビルドからしないといけないのですが、数時間以上かかるらしいので、失敗したら立ち直れません。そんな軟弱な私のような人のために、Raspberry Pi 2用にROSをインストールしたUbuntuのイメージファイルを公開している仏のような人がいました。以下のサイトからダウンロード。

http://www.mauriliodicicco.com/raspberry-pi2-ros-images/

 tar.gzで固めてあるので、適当に解凍してください。Macならターミナル起動して、ダウンロードしたファイル(ubuntu_arm_ros.tar.gz)を格納したフォルダまで移動して、以下コマンドで解凍。

$ tar xvzf ubuntu_arm_ros.tar.gz

 aristoteles.imgという洒落た名前の巨大(15GB)なイメージファイルが出てきます。最初何度やっても解凍できなかったのですが、パソコンの空き容量がないというとほほなオチでした…

ディスクのフォーマット

 次にROSをインストールするSDをフォーマットしましょう。好きな方法でよいですが、確実なのはSD Formatterを使う方法です。以下のサイトからダウンロードしたSD Formatterを使ってSDカードをフォーマットをしましょう。ドライブを選択するだけの簡単設計。

SD Memory Card Formatter - SD Association

ディスクのデバイスファイルを確認

 MacでコピーしたいSDカードを挿入後にdfコマンド実行してSDカードのデバイスファイルを確認。よくわからなければ、挿入前と挿入後でdfコマンド実行して比較しましょう。

$ df

 挿入後に増えているデバイスファイルがSDカードのデバイスファイルです。例えば/dev/disk2とか/dev/disk3とか。

イメージ書き込み

 書き込みしたいSDカードを挿入して、以下のコマンドでアンマウント

$ diskutil umountDisk /dev/disk2

 例えばドキュメントフォルダ直下にイメージファイルを置いた場合は以下のコマンドで書き込みできます。/dev/disk2の場合は /dev/rdisk2のようにrをつけるのがポイント。理由は…よくわからないです、すみません。なんでも、アンバッファモードになって速度が速くなるみたいです。bs=1mは一度に書き込む容量を表していて1m(1MB)くらいにしないとこれまた速度が遅くなります(2015/10/12修正)。

$ sudo dd if=Documents/aristoteles.img of=/dev/rdisk2 bs=1m

 しばらく(数分)待つと完了のメッセージが出るので、書き込み完了。途中経過が気になる方はCtrl+Tで進捗を表示できます。あとは以下のコマンドでアンマウントしてからSDカードを取り出しましょう。

$ diskutil eject /dev/disk2

Raspberry Pi 2でROS起動・セットアップ

 早速起動してセットアップしてみましょう。Raspberry Pi 2にイメージファイル書き込んだSDをさして起動するだけです。デフォルトのユーザ名とパスワードはubuntuです。

日本語キーボード設定

 神イメージを用意してくださった、マリオさんは陽気(多分)なイタリア人で、キーボードもイタリア設定になっているので、日本語設定にもどします。以下のコマンドで日本語設定しましょう。

$ sudo dpkg-reconfigure keyboard-configuration

 大体以下の設定でうまくいくと思います。

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

SDカード容量拡張

 SDカード16GB以上の容量を使っている場合でも、16GBのイメージのため16GBまでしか使えません。このままではもったいないお化けが出てしまうので、使ってないSDの容量も使えるようにしてやりましょう。以下のコマンドをうつと/mnt/sdというディレクトリにSDの残り容量がマウントされます。下手をするとデータが全て吹っ飛ぶので慎重に。CUIのfdisk使う方法とGUIのgparted使う方法の2つを説明します。fdiskを使うのは男らしいですが、オススメはgparted、操作がGUIで直感的ですし。パーティションの結合もできます。

fdiskを使う方法
$ sudo fdisk /dev/mmcblk0

Command (m for help): n

次にCommand (m for help): が出てくるまでエンター連打(デフォルト設定)

Command (m for help): w

これでパーティション割り当てられたので一旦再起動

$ sudo shutdown -r now

 以下コマンドで領域をフォーマット

$ sudo mkfs.ext4 /dev/mmcblk0p3
$ sudo mkdir /mnt/sd

 マウントのテスト

$ sudo mount /dev/mmcblk0p3 /mnt/sd

 マウントされたかを確認

$ df

 /dev/mmcblk0p3/mnt/sdにマウントされていたらOK。以下でアンマウント

$ sudo umount /mnt/sd

起動時にマウントするように以下コマンドで/etc/fstabを編集

$ sudo vi /etc/fstab

末尾に以下追記

/dev/mmcblk0p3  /mnt/sd           ext4    defaults,noatime  0        2

再起動

$ sudo shutdown -r now

 これで/mnt/sdに残りのSD容量がマウントされます。 残り容量が少なくなってきたら/mnt/sdを使用しましょう

gpartedを使う方法

 gpartedを使うとGUIでパーティション変更できるので使いやすいかもしれません。以下サイトが非常にわかりやすいです。fdiskではできない、パーティションを結合して、大きなパーティションをつくることもできます。

eichimu.hatenablog.com

WiFi設定

 WiFi設定。有線LANでいいよって人は無視してよいですけど、自律で動くロボットなら必須かと思います。ちなみに自分が使うのは以下のUSB-WiFiモジュール。小型なのとUbuntuで認識できた実績もあるので悪くないかなと思います。結構熱くなるけど。

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

 とりあえずRaspbianの要領でWiFi設定するも繋がらないので、ネットの参考サイトを元に調査。

 以下コマンドでUSB-WiFiを認識しているかチェック。

$ iwconfig

wlan1でUSB-WiFiは認識していそうなことがわかる

じゃあと有効にしようと以下コマンドうつと

$ sudo ifconfig wlan1 up

 SIOCSIFFLAGS: Operation not possible due to RF-killというエラー発生。調べたらWiFiモジュールにブロックがかかっていると発生するエラーらしいとか。外し方は以下。

$ rfkill list
0: phy0: Wireless LAN
             Soft blocked: yes
             Hard blocked: no

ソフト的にブロックされているらしい。以下のコマンドで外す

$ sudo rfkill unblock wifi

ブロックが外れたことを確認

$ rfkill list
0: phy0: Wireless LAN
             Soft blocked: no
             Hard blocked: no

以下コマンド。無事WiFiが立ち上がる(はず)

$ sudo ifconfig wlan1 up

テストとして、以下コマンドで周囲のアクセスポイントがずらずらでてきたらOK

$ sudo iwlist wlan1 scanning

このままだと起動したら毎回rfkillしないといけないので、以下で自動的に起動するようにする

$ sudo vi  /etc/rc.local

以下を追記

rfkill unblock wifi


あとは/etc/network/interfacesを以下コマンドでviで編集

$ sudo vi /etc/network/interfaces

 以下の通り。

# The loopback network interface
auto lo
iface lo inet loopback
iface eth0 inet dhcp

# The primary network interface
allow-hotplug wlan1
iface wlan1 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

 次に/etc/wpa_supplicant/wpa_supplicant.confを以下コマンドで編集

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

 中身は以下。ssidとパスワードを入力してください。

network={
    ssid="MyNetwork"
    psk="MyPassPhrase"
}

 以下コマンドで再起動

$ sudo shutdown -r now

 これでネットにつながる。はず。

Ubuntu(+ROS)にソフトインストール

 ROS使うのに便利だったりするソフトのインストール。ROS関係は一通りインストールされているので、その他のツールなど。随時追加中。

FireFox

 デフォルトのブラウザは日本語表示できなかったので、とりあえずfirefox入れてみるテスト。

インストール

$ sudo apt-get update
$ sudo apt-get install firefox

以下コマンドで起動

$ firefox

 自分のサイト見たら、一応日本語表示されました。

スクリーンショットソフト(shutter)

 以下でshutterというアプリをインストール。

$ sudo apt-get update
$ sudo apt-get install shutter

 以下コマンドで起動

$ shutter

 結構起動まで遅いのでいまいちかも。

ターミナルソフト(terminator)

 ウィンドウを分割できるターミナル。ROSでは複数のプロセスを走らせる必要があるので便利。

$ sudo apt-get update
$ sudo apt-get install terminator

X Window設定

 以下コマンドでXWindow立ち上げ

$ startx

 以下のようないかした画面が立ち上がります。というかこのマリオさんのデフォ設定超クールなのでどうやっているのか教えて欲しい。

f:id:karaage:20150829080437p:plain:w640

 右クリック→Terminalでターミナルが立ち上がります

 キーボード設定がまた元に戻ってしまうので、以下コマンドで修正。ついでにCapsキーをCtrlキーとして使えるように設定しています(不要なら -option ctrl:nocapsを削除ね)

$ setxkbmap -model jp106 -layout jp -option ctrl:nocaps


 毎回上記コマンドをうつのも面倒なので.bashrcにコマンド記載して自動化

$ vi ~/.bashrc

末尾に以下を追加ね

setxkbmap -model jp106 -layout jp -option ctrl:nocaps

 再起動してstartxすれば反映されるはず。すぐ反映させたかったら以下コマンドね

$ source ~/.bashrc

ネットワーク設定

 とりあえず以下の設定をしないと動かないです。詳しい説明は省略します。すみません。

以下のファイルを編集

$ sudo vi ~/conf/ros_master_uri

以下の行を追記

export ROS_MASTER_URI=http://localhost:11311

 .bashrcを編集

$ vi ~/.bashrc

以下追記

source /opt/ros/indigo/setup.bash
→ source ~/ros/devel/setup.bash

ターミナル再起動。ターミナル再起動の代わりに以下コマンドでもOK

$ source ~/.bashrc

以下コマンド実行

$ export

以下が表示されていればOK

ROS_MASTER_URI="http://localhost:11311"

ROS動作チェック

 いよいよ動作チェックです。

シミュレータ起動

 以下コマンド実行

$ roscore

なにやらいろいろ表示されて止まってしまうので、このウィンドウはそのままにして、別ウィンドウを開き下記コマンド実行

$ rosrun turtlesim turtlesim_node

カメさんのシミュレータが走ればとりあえずOK

f:id:karaage:20150829081351p:plain:w640

まとめと今後の予定

 Raspberry Pi2にROSを入れてみたのですが、正直ROSはかなり難易度が高いのと、Raspberry Pi2だとマシンスペックが足りずできないことも多いのでどうしようかなというところです。いくつかネタはあるので、少しだけトライして様子見してみようかなと思います。

追記(2016/07/01)

Linux(Ubuntu) PCにもROSインストールしてみました。興味ある方はこちらもどうぞ。

参考サイト

 偉大な先人たちに助けられっぱなしです。私の記事が怪しい場合は以下のサイトを見に行くのがよいと思います。


関連記事