環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 20.04 |
ROS | Noetic |
Qt | 5.12.8 |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
概要
GUIを1から作るのは大変などでいくつかのツールがあります。その中でもROSではQtがよく使われます。
ROSのGUIプログラムであるrqtは「Ros QT」という意味です。またRvizにもQtは使われています。
本来QtのプログラムはQtの統合開発環境(QtCreator)とビルドシステム(qmake)でビルドすることが多いのですが、ここでは統合開発環境を使わずにQtのプログラムを作成して、それをcatkinでビルドします。
バージョン
ROS indigo以前はQt4が標準でしたが、KineticからはQt5に変わりました。
ソースコード
C++ファイル
メインのプログラムです。今回は基本としてウィンドウを表示するだけのプログラムを書きます。
C++の実行の中ではROSを使わずにQtの作法で書いています。
#include <QApplication>
#include <QLabel>
int main(int argc, char** argv){
QApplication app(argc, argv);
QLabel* label = new QLabel("######## basic1 ########");
label->show();
return app.exec();
}
6行目のQLabel* label = new QLabel("######## basic1 ########");
では今回表示するlabelを製作しています。
7行目ではこのLabelを表示して、8行目でループに入っています。
6、7行目はポインターを使わずに
QLabel label("######## basic1 ########");
label.show();
と書くこともできます(なお、今回の例は同じように実行できます)。c++として言うとこちらのほうが良いのですが、Qtではすべてのオブジェクトはヒープ領域に存在するというお約束があります。ポインターを使わない方法だとスタック領域にメモリが確保されてしまうのでポインターを使用する方法を使うみたいです。
CmakeList.txt
Cmakeの設定です。Qt用の設定は少し複雑です。
まずQt全体としての設定が以下です。Qtのバージョンを設定するのですが、今回は便宜的にrvizとバージョンをそろえるようにコンフィグを書きます。
#Qt5 configulation
set(CMAKE_AUTOMOC ON)
find_package(Qt5 ${rviz_QT_VERSION} EXACT REQUIRED
Core
Widgets
)
set(QT_LIBRARIES Qt5::Widgets)
add_definitions(-DQT_NO_KEYWORDS)
こちらはいつものC++のソースコードをビルドする設定です。${QT_LIBRARIES}
を足します。
add_executable(qt_basic1 src/qt_basic1.cpp)
target_link_libraries(qt_basic1
${catkin_LIBRARIES}
${QT_LIBRARIES}
)
package.xml
Qt5の依存を書く必要があります。
<build_depend>qtbase5-dev</build_depend>
<build_depend>rviz</build_depend>
<exec_depend>libqt5-core</exec_depend>
<exec_depend>libqt5-gui</exec_depend>
<exec_depend>libqt5-widgets</exec_depend>
<exec_depend>rviz</exec_depend>
ビルド
cd ~/catkin_ws
catkin build
実行
以下のコマンドを打つと下の図のようなウィンドウが表示されます。
各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bashを実行する必要があります。
rosrun qt_lecture qt_basic1
参考
Qtプログラミング入門
Dockable panel tutorial
Qtバージョン確認
QtWidgetはヒープ上に作る