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ではじめるロボットプログラミング―フリーのロボット用「フレームワーク」 (I・O BOOKS)
- 作者: 小倉崇
- 出版社/メーカー: 工学社
- 発売日: 2015/06/25
- メディア: 単行本
- この商品を含むブログ (4件) を見る
以下はROSに興味ない人は全く意味のない内容が続くので、ここまで読んでまだ興味があるという人だけ続きを読むをクリックください。
Raspberry Pi 2にROSをインストールする方法
ROSはUbuntu上で動くのでUbuntuをインストールしたPCにインストールするのが通常なのですが、Ubuntuが動くまともなPCが無かったのと、以前作ったロボットがRaspberry Piで動くのでRaspberry Piにインストールにチャレンジしてみます。
必要なもの
最低限は以下くらい。
- 出版社/メーカー: RaspberryPi.org
- メディア: エレクトロニクス
- この商品を含むブログ (10件) を見る
BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2
- 出版社/メーカー: バッファロー
- 発売日: 2011/07/30
- メディア: Personal Computers
- 購入: 198人 クリック: 5,602回
- この商品を含むブログを見る
あとは以下を参考に適当に購入ください。
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カードをフォーマットをしましょう。ドライブを選択するだけの簡単設計。
ディスクのデバイスファイルを確認
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ではできない、パーティションを結合して、大きなパーティションをつくることもできます。
WiFi設定
WiFi設定。有線LANでいいよって人は無視してよいですけど、自律で動くロボットなら必須かと思います。ちなみに自分が使うのは以下のUSB-WiFiモジュール。小型なのとUbuntuで認識できた実績もあるので悪くないかなと思います。結構熱くなるけど。
BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2
- 出版社/メーカー: バッファロー
- 発売日: 2011/07/30
- メディア: Personal Computers
- 購入: 198人 クリック: 5,602回
- この商品を含むブログを見る
とりあえず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
以下のようないかした画面が立ち上がります。というかこのマリオさんのデフォ設定超クールなのでどうやっているのか教えて欲しい。
右クリック→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
まとめと今後の予定
Raspberry Pi2にROSを入れてみたのですが、正直ROSはかなり難易度が高いのと、Raspberry Pi2だとマシンスペックが足りずできないことも多いのでどうしようかなというところです。いくつかネタはあるので、少しだけトライして様子見してみようかなと思います。
追記(2016/07/01)
Linux(Ubuntu) PCにもROSインストールしてみました。興味ある方はこちらもどうぞ。
参考サイト
偉大な先人たちに助けられっぱなしです。私の記事が怪しい場合は以下のサイトを見に行くのがよいと思います。