Convert/Run Qt5 app into/as a ROS2 package

Amar Lakshya published on
4 min, 626 words

So you want to run your Qt5 app as a ros2 node?, Here we go

Step - 1: Build the Qt5 App

The first thing you need to do is to convert your Qt5 app to a ros2 package so that you can build it using: ament build.

Let's make an example Qt5 app to showcase this!

After installing Qt creator we get two types of Qt Quick apps we can make. They differ on the build system they use:

  • qmake apps
  • cmake apps

Let's have a look at how to make each one of them:

  • This is the qmake build system app - Qt5 qmake app

  • This is the cmake build system app - Qt5 cmake app

Step - 2: Depending on the build format, create/extend CMakeLists.txt

  • Here we have two different steps for the Qt5 app depending on the build system you chose, you'll get these directory structures:
- CMake:
.
├── CMakeLists.txt
├── CMakeLists.txt.user
├── main.cpp
├── main.qml
├── Page1Form.ui.qml
├── Page2Form.ui.qml
├── qml.qrc
└── qtquickcontrols2.conf
0 directories, 8 files
- qmake:
.
├── demo.pro
├── demo.pro.user
├── main.cpp
├── main.qml
├── Page1Form.ui.qml
├── Page2Form.ui.qml
├── qml.qrc
└── qtquickcontrols2.conf
0 directories, 8 files

  • Smply open the CMakeLists.txt to edit and in the case of a qmake build create CMakeLists.txt, make it look like this:
cmake_minimum_required(VERSION 3.5)
project(demo)

set (CMAKE_CXX_STANDARD 14)
if(NOT WIN32)
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra -fPIC")
endif()

IF (NOT DEFINED BUILD_VERSION)
	SET(BUILD_VERSION "not set")
ENDIF()
ADD_DEFINITIONS(-DBUILD_VERSION="${BUILD_VERSION}")

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rmw_implementation REQUIRED)
find_package(std_msgs REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Quick REQUIRED)

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


include_directories(
	${rclcpp_INCLUDE_DIRS}
	${std_msgs_INCLUDE_DIRS}
	${Qt5Core_INCLUDE_DIRS}
	${Qt5Quick_INCLUDE_DIRS}
	)

file(GLOB SOURCE_FILES
	"src/*.cpp"
	)

add_executable(${PROJECT_NAME} ${SOURCE_FILES} "src/qml.qrc")

ament_target_dependencies(${PROJECT_NAME}
	rclcpp
	std_msgs
	rmw_implementation
	)
target_link_libraries(${PROJECT_NAME}
	Qt5::Core
	Qt5::Quick
	)

install(TARGETS ${PROJECT_NAME} DESTINATION bin)

ament_package()

Step - 3: Create a package.xml and add it to project

  • ROS2 needs a package.xml to find build and execution dependencies and to state metadata.

  • A simple package.xml looks like this:

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="2">
	<name>demo</name>
	<version>0.0.1</version>
	<description>A demo app for the blog</description>
	<maintainer email="nope@notgoogle.com">Amar Lakshya</maintainer>
	<license>Apache License 2.0</license>

	<buildtool_depend>ament_cmake</buildtool_depend>

	<build_depend>rclcpp</build_depend>
	<build_depend>std_msgs</build_depend>

	<build_depend>qtbase5-dev</build_depend>
	<build_depend>qt5-qmake</build_depend>

	<exec_depend>libqt5-core</exec_depend>
	<exec_depend>rclcpp</exec_depend>
	<exec_depend>std_msgs</exec_depend>

	<export>
		<build_type>ament_cmake</build_type>
	</export>
</package>

Step - 4: Let's restructure the directory to clean everything.

  • First, create an src directory and move everything in it as a ROS2 package ( let's say demo) . Now, create an src directory and move all the qml, cpp, qml.qrc and conf files in that directory. Now your project folder should look something like this:
.
└── src
    └── demo
        ├── CMakeLists.txt
        ├── demo.pro
        ├── demo.pro.user
        ├── package.xml
        └── src
            ├── main.cpp
            ├── main.qml
            ├── Page1Form.ui.qml
            ├── Page2Form.ui.qml
            ├── qml.qrc
            └── qtquickcontrols2.conf

3 directories, 10 files

Step - 5: All set, time to build the package!

  • Now, source your ROS2 workspace and run: ament build.

Doing these steps, you should get a ROS2 Qt5 app package called demo.

Step - 6: running the package in qtcreator!

  • Note that you will be easily able to run the package using ros2 commandline options, however, It would make our lives incredibly easy to run and build our Qt5 app in the Qt Creator.

    For that, first install the RTPS middleware system-wide by following directions on their project page: RTPS Build instructions

    and that's it! Now source your ROS2 workspace and go to your Qt5 app folder and just run qtcreator!

    You will now be able to develop Qt5 apps with ROS2 in the Qt Creator

TIP: Here is the git-hosted sample project.