目次
はじめに
ROSでは下記のrqtというソフトが使用できます。
rqtはQtベースのGUIソフト開発ツールです。
このrqtを使うことにより、
かっこよく、再利用性の高いGUIソフトを
簡単に作ることができます。
基本的には、
上記のrqtのWikiを読めば、
使い方はわかると思いますが、
今回は、ROSの可視化ソフトrvizにおける"定規ツール"
(rviz上で指定した2点の距離などがわかる)
を実際にrqtで作る所を説明して、
rqtによるGUIツールの作り方を説明したいと思います。
ちなみに、自分のROSの環境は
Version:fuerte
OS:Ubuntu 12.04
です。
0. rqtのインストール
まず初めに肝心のrqtをダウンロードします。
下記のコマンドをシェルで実行しましょう。
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install ros-fuerte-qt-gui-core ros-fuerte-rqt
1. GUI用のパッケージを作成します。
続いて、GUI用のパッケージを作成します。
今回のアプリはrviz用の定規アプリなので
RvizRulerという名前にします。
好みのスタックの下に下記のコマンドでパッケージを作ります。
roscreat-pkg RvizRuler rospy tf rqt_gui rqt_gui_py
rqt_guiはrqt_gui.pyはrqtを使用するパッケージでは必要です。
tfはRviz Rulerの中で使用するので
予め入れておきます。
2. plugin.xmlを作成する。
パッケージのトップディレクトリに、
plugin.xmlというファイルを作成します。
ソースコードはこの記事の一番下をご覧ください。
library pathの部分はメインとなる
Pythonソフトが入っているディレクトリになります。
ステップ4で作成します。
続いて、class nameとtypeは
それぞれのPythonソフトにおけるGUI Classを指します。
詳しくは後ほど説明します。
base_class_typeは基本的にこのままでOKです。
続いて, descriptionはそのプラグインの説明です。
labelはrqtのpluginsのタブの中で表示される名前になり、
icon typeはその名前の横に表示されるアイコンを表します。
3. manifest.xmlを変更する。
続いてroscreat-pkgで生成された
manifest.xmlを修正します。
下記のコードのように、
plugin.xmlを読み込むように、
<export> <rqt_gui plugin="${prefix}/plugin.xml"/> </export>
と3行追加するだけです。
4. Qtデザイナーでuiファイルを作成する。
続いて、ソフトのGUI部を作成します。
rqtではネイティブのQtを使用しているので、
Qt APIからGUIを作成することができますが、
Qtデザイナーというソフトを使用することで、
GUIを使って、GUIソフトを作成することができます。
Qtデザイナーはフリーなので、
ubuntuの場合、ソフトウェアセンタでQtと調べると出てくるはずです。
インストール後、Qtデザイナーを立ち上げて、
GUIソフトである.uiファイルを作成します。
Qtデザイナーの使い方に関しては下記の資料を参考にして下さい。
・第5章 Qt Designerを使ってみよう | densan-labs.net http://densan-labs.net/tech/qt/chapter5.html
・QtDesigner 使い方入門 http://vivi.dyndns.org/tech/Qt/QtDesigner.html
また、より高度なGUIを作りたい場合は、下記の参考書がオススメです。
Learning Ros for Robotics Programming Aaron Romero,Enrique Fernandez Packt Publishing 売り上げランキング : 2660 Amazonで詳しく見る by AZlink |
今回は、Rviz用の定規ということで、
Rviz上から指定した場所の位置や原点から距離・角度を表示し、
二点を指定した場合は、その距離と角度を表示するようにしました。
下記の図のようにQtのLabelで文字を描画し、
TextBoxでそれぞれのデータを表示させるようにします。
Qtデザイナーを使えば、GUIのコンポーネントの配置も
ドラッグ・アンド・ドロップでできますし、楽ですね。
それぞれのコンポーネントのオブジェクト名を設定することを忘れないようにしましょう。
uiファイルの詳細に関しては、
この記事の末尾に書いてあるGitHubのリポジトリから
実際のファイルをcloneし、
Qtデザイナーで開いてみることをオススメします。
5. scriptフォルダを作成し、Pythonソフトを作成する。
最後に実際のGUIアプリの機能を有するソフトを作成します。
まず初めにパッケージのトップディレクトリに、
Pythonソフトを格納するscriptフォルダを作成します。
このscriptフォルダに格納するのは、
下記の3つのファイルです。
1. __init__.py
このファイルは、
Pythonでソフトを作成する時のおまじないのようなものです。
中身は空でこの名前のファイルを作成すればOKです。
このファイルの存在意義について知りたい人は
下記のリンクをどうぞ
2. RvizRuler.ui
先ほど説明した、Qtデザイナーを使って作成した
GUIファイルです。
この場所に配置します。
3. RvizRuler.py
実際のGUIの機能を有するPythonソフトです。
今回は下記のようなRvizRulerを実装したいと仮定しました。
- Rvizの2D Estimateのボタンを押して、Rviz内で位置を指定する。
- 一つ目の点を指定する(2D Estimateのボタンを押して、仮想空間上で
クリック&スナップする)と、その位置と方位、
原点からの距離と角度を表示する。
- 二つ目の点を指定すると、新しい方の点のデータを表示し、
一つ目の点の距離と角度を表示する。
- 選んだ2点を示す線を表示するトピックをPublishし、
Rviz上で測定した場所がわかるようにする。
これらの機能を実装するように作成したソフトが
下記のソフトです。
基本的には、rqtのwikiのチュートリアル内の
Pythonソフトをテンプレートにして、
InitialPoseCallbackという
Rvizからの位置情報のTopicを受信する関数と、
printdataという
データを表示させる&TopicのPublish用の関数を追加しただけです。
Callback関数内ですべて実装したかったのですが、
Qt描画の部分はQtのAPIでスレッドを作成する必要があるようなので、
別々の関数にして、グローバル変数でデータをやりとりするようにしました。
より詳しい実装方法に関しては、
実際のソフトを参照してもらえるとわかりやすいかと思います。
完成品
上記の方法で作成したRvizRulerパッケージを
下記のGitHubリポジトリで公開しました。
RvizRuler AtsushiSakai/HelloROS RvizRuler
このソフトをチェックアウトし、
rosmakeすれば、
下記のコマンドでrqtを起動した時に、
左上のPluginsの中にRvizRulerが表示され、
それをクリックするとRvizRulerが起動するはずです。
rosrun rqt_gui rqt_gui
あとは、前述の通り
RvizもPluginsの中から選んで起動し、
Rviz上で2D Estimateのボタンを押して、
Rviz上でクリック&スナップすれば、
情報が表示されるはずです。
また、冒頭のスクリーンショットのように、
RvizでRvizRulerからPublishされる
/RvizRuler/line(visual_msg/Marker)
を表示させるようにすると、
選んだ2点を結ぶ緑色の線が表示されます。
あとは個々人で使いやすいように
カスタマイズしてもらえると良いと思います。
また今回作成したパッケージの中の
代表的なファイルを下記に載せておきます。
Enjoy ROS!!