Qt Creatorで作成したGUIのROSノード化

・Qt Creatorで生成したGUIでROSメッセージを扱いたく,まずROSノード化をしてみました

# 内容

## 1.Qt Creatorでプロジェクトを作成(ビルドシステムはcmakeを選択)

・qtcreatorでプロジェクトを作成します(※qtcreatorの基本的な使い方は割愛させていただきます)
・ビルドシステムの選択で`cmake`を選択

## 2.qt creatorのcmake設定

qtcreatorのRUNボタン実行時には`CMAKE_PREFIX_PATH`へrosパッケージのパスが通っていないみたいなので以下のように,プロジェクトのビルド設定画面で`/opt/ros/noetic`みたいにパスを追加してあげます.

![cmake_setting2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/6f82d025-b71b-85fd-dc99-e77e1a233ad7.png)

そして`find_package`で`roscpp`を探索できるようにします.

![Untitled4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/fc69dbc4-e85a-826a-8e1e-5820a29e3335.png)

するとプロジェクトのcmakeパス設定にroscpp関係のパッケージパスが追加されます.

![cmake_setting3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/fb1ddf68-0ea1-2e38-be46-5fb82afa3f50.png)

これでrosパッケージへのパスが通るようになりました

## 3.メインプログラムをROSノード化

次にメインプログラムをノード化するように変更します

以下3点を追加すればOKです

・`#include <ros/ros.h>`
・`ros::init(argc, argv, "aaa");`
・`ros::NodeHandle nh = ros::NodeHandle();`

追加後のプログラムは以下のようになります

```main.cpp
#include "mainwindow.h"

#include <QApplication>
#include <ros/ros.h> // 追加


int main(int argc, char *argv[])
{

    ros::init(argc, argv, "aaa"); // 追加

    ros::NodeHandle nh = ros::NodeHandle(); // 追加

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
```

## 4.`CMakeLists.txt`で`roscpp`パッケージを読み込む

roscppへのリンク設定などを行います.

以下3点を追加すればOK

・`find_package( roscpp )`を追加(※手順2ですでに追加済み)
・`include_directories( ${roscpp_INCLUDE_DIRS} )`を追加
・`target_link_libraries(untitled26 PRIVATE Qt5::Widgets ${roscpp_LIBRARIES})`の`${roscpp_LIBRARIES}`を追加

追加後の`CMakeLists.txt`は以下のようになります

```CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

project(untitled26 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http://doc.qt.io/qt-5/deployment-android.html for more information.
# They need to be set before the find_package(Qt5 ...) call.

#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
#    endif()
#endif()

find_package(Qt5 COMPONENTS Widgets REQUIRED)

# 追加 ここから
find_package( roscpp )

include_directories(
 ${roscpp_INCLUDE_DIRS}
)
# 追加 ここまで

if(ANDROID)
  add_library(untitled26 SHARED
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )
else()
  add_executable(untitled26
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )
endif()

target_link_libraries(untitled26 PRIVATE Qt5::Widgets ${roscpp_LIBRARIES}) # 追加
```

## 5.実行


違うブラウザで`roscore`実行

```
roscore
```
qt creatorのrunボタンで実行でGUIが表示されます

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/14f0b993-f75b-ad69-e21e-205fb1377d73.png)


GUIがノードになったか確認

```
$ rosnode list
/aaa
/rosout
```

OKです.



# まとめ

qt creatorで作成したプロジェクトのROSノード化ができました