こんにちは,SUGAR SWEET ROBOTICSのysugaです.今回は前回の記事で予告したように,TurtleBot2 KobukiをROSを使って動作させてみます.
PCはUbuntu 12.04 64bit版を使います.
ROSとは
ROSとは,Robot Operating Systemの略で,当初は米国Willow Garage社が,現在はOpen-Source Robotics Foundationが主体的にメンテナンスをする,オープンソースのロボット用基盤ソフトウエアです.
「ロボット用基盤ソフトウエア」というのは,要するにロボットを動かすためのソフトウエアの動作するプラットフォームや,通信方法を統一的に扱うための,ライブラリや開発ツール群をさす言葉と思ってください.
ですので,ROSでは,ROSで定義される通信方法を提供するための各種のライブラリだけでなく,開発を効率化するためのツールセットが配布されています.
ROSはいろいろなプラットフォームで動作していますが,とりあえずはUbuntu Linuxで試すのが一番良いと思います.他のプラットフォームでは,ちょっとだけ苦難の道が待っているので(笑)
ROSのインストール
この記事ではROSのインストールについては細かく解説しません.
以下の記事を参考に,コマンドラインでどんどん進んで行ってみましょう.Ubuntu Linuxならすんなりと入るはずです.
catkinの準備
ROSのGroovyというバージョンからは,catkinというパッケージ管理システムが導入されています.これを使ってみましょう.
catkinでは,ワークスペースという概念が導入されています.ワークスペース内に,複数のパッケージを収集して管理するようですが,僕も使い始めたばっかりで・・・てへ.
以下のようにディレクトリを作って,ワークスペースを用意しました.
$ source /opt/ros/groovy/setup.bash $ mkdir -p ~/work/ros/catkin_ws/src $ cd ~/work/ros/catkin_ws/src $ catkin_init_workspace
これでワークスペースが準備されます.この中でdevelというディレクトリが生成され,その中のsetup.bashも読み込むことにします.
$ source ~/work/ros/catkin_ws/devel/setup.bash
ホームディレクトリの.bashrcに,setup.bashを読み込む設定を加えておきましょう.
$ gedit ~/.bashrc
>>エディタで以下の2行を.bashrcの最後に追加しておく.
source /opt/ros/groovy/setup.bash source /home/ [ユーザ名] /work/ros/catkin_ws/devel/setup.bash
先に作成したsrcのディレクトリ内のソースコードを呼び込むと,自動的にビルドするようになります.
ソースコードを追加したら,もう一度catkin_wsディレクトリで以下のコマンドを打ちます.
$ catkin_make --force-cmake
このテクニックはKobukiを使用する際に使います.
TurtleBot用パッケージの入手
これは一行です.3つのパッケージをインストールします.
$ sudo apt-get install ros-groovy-turtlebot ros-groovy-turtlebot-apps ros-groovy-turtlebot-viz
これで必要なパッケージのほとんどが入手出来ますが・・・後述のとおり,Kobukiのライブラリが不調・・・
Kobuki用パッケージの入手
さて,Kobukiのマニュアルにはaptを使ってKobukiのパッケージをインストールするように書いていますが,この記事を書いている2013年4月現在では,ドッキング動作などが上手く動作しませんので,ソースコードからビルドすることをお勧めします.
$ cd ~/work/ros/catkin_ws/src $ git clone https://github.com/yujinrobot/kobuki.git $ cd ~/work/ros/catkin_ws $ catkin_make --force-cmake
最後のコマンドが,新しく入手したパッケージを認識させつつビルドするおまじないです.
すでに,kobuki用のパッケージがインストールされていますので,この設定を上書きするために,さらにちょっとおまじない.
$cd ~/work/ros/catkin_ws $catkin_make install
これでcatkin_wsワークスペースにinstallというディレクトリが出来,その中のsetup.bashを読み込めば,このディレクトリに入ったパッケージが優先されます.
$source home/ [ユーザ名] /work/ros/catkin_ws/install/setup.bash
もちろん,このコマンドを~/.bashrcに書き込むと便利でしょう.
Kobukiのドライバのインストール
Kobukiを接続する前に,ドライバの設定をします.
$rosrun kobuki_ftdi create_udev_rules
おそらく,sudoのパスワードを入力を求められますが,これでKobukiを接続すると,
/dev/kobuki
に対応するようになります.
Kobukiの動作
まず,masterを起動します.
$roscore
次に,kobukiのコアライブラリを起動します.
$roslaunch kobuki_node minimal.launch
さらに,別のターミナルを起動して,キーボード操作のノードを立ち上げます.
$roslaunch kobuki_keyop keyop.launch
キーボード操作のノードを起動したターミナルで矢印キーを入力すると,kobukiが動きます.キーを長押しすると速度が増します.スペースキーで停止します.「q」キーで修了します.
さらに,別のターミナルで,ドッキングステーション帰還のためのノードを起動します.
$roslaunch kobuki_auto_docking minimal.launch
そして,ドッキングさせるには,以下のコマンドを入力します.
$roslaunch kobuki_auto_docking activate.launch
Kobukiが正面にいればすんなりと入ると思いますが,失敗も多いようです.今後に期待.
ちょっとだけ解説
keyopから,koubki_nodeにキーボードのデータが送られているのだな,というのはなんとなく分かると思います.
ROS初心者向けにちょっとだけ解説しますね.
kobuki_nodeとkobuki_keyopを動かしている状態で,以下のコマンドを入力すると,ROSシステム上で動作しているソフトウエアとデータの流れが視覚化されます.
$<a href="http://ros.org/wiki/rqt_graph">rqt_graph</a>
このグラフの楕円は,ノードというROSにおける実行単位(基本的にはプロセス)を表しています.
keyopというのが,キーボードからの入力を受け取っているというのは直感的に分かると思います.
mobile_baseと,mobile_base_nodelet_managerというのが,kobukiを制御している本体です.複数のノードが起動しているのは,コマンドラインで使ったroslaunchに秘密があります.roslaunchは,複数のノードを一発で起動するためのコマンドで,引数で与えた.launchファイル(中身はXML)に様々な設定が書かれています.
*ここでは実際は,nodeletという機能を使って二つのノードは一つのプロセスで実行されており,ノード間の通信はポインタの受け渡しだけでかなり高速になっています.
*diagnostics_aggregatorは,nodeletの状態を出力するためのノードで,ここでは解説しません.
keyopからの矢印は,mobile_base_nodelet_managerに向かっており,矢印の上に/mobile_base/commands/velocityという名前が付いているので,velocity(速度)を送信しているのだな,というのが分かってもらえるでしょうか?このグラフの大事な部分はそこだけです.
ではデータの受け渡しは,ただ単純にTCP/IPソケットのようなもので送信しているのかというと,もうちょっとだけ複雑な処理をしているので,そこを見てみましょう.
左上のドロップダウンメニューを,「Nodes/Topics(active)」に設定すると,もうすこしだけ複雑なグラフが見えてきました.
グラフ上の楕円は相変わらずノードです.そしてノードを囲うように描かれている大きな四角は,「ネームスペース」です.これは,複数のノードをグループ化するのに使います.後述するトピックにもネームスペースを設定出来ます.mobile_baseと,mobile_base_nodelet_managerという二つのネームスペースが設定されているのが分かります.
そして,ネームスペースに囲まれている小さな四角が「トピック」です.トピックとはROSでのデータ交換における重要な概念です.トピックは最初に起動したmaster (roscore) によって管理されており,各ノードは,トピックにデータを書き込んだり,トピックからデータを詠み込んだりすることによってデータを交換します.従ってシステムには最低1つのmasterが必要になります.
ノードが起動すると,masterに対してトピックのsubscribe (購読) リクエスト,もしくはpublish (出版) リクエストを送り,同一のトピックに対して,publishとsubscribeの双方がリクエストされると,それらのノード間での接続が確立されてデータ通信が成立します.
従って,現在のシステムでは,keyopは/mobile_base/commands/velocityというトピックをpublishしており,これをmobile_base_nodelet_managerがsubscribeすることによって通信が成立している,という構図です.
rosnodeコマンドや,rostopicコマンドを使えば,手軽にアクティブなトピックやノードを確認することが出来ます.
TurtleBotスタックを使う
とりあえず,kobukiのノードをすべて停止して,Turtlebotのスタックを使ってみましょう.
$roslaunch turtlebot_bringup minimal.launch
コマンドラインばかりで寂しいので,グラフィカルなインターフェースでKobukiの状態確認でもしてみますか?
$rqt -s kobuki_dashboard
左上のボタンを押すと,Turtlebotのノードに接続して,Kobukiの状態を取得します.バンパを押したり,Kobukiを持ち上げたりしてみてください.他にも,LEDの色を設定したり出来ます.
まとめ
こんな感じでROSだとすんなりと動くと思います.
なにより,コマンドラインばかりだと,記事が書きやすいです(笑)
次回はSLAM(移動しながらマップを描くプログラム)を試してみましょう.