开发ROS程序的过程中,有时需要给程序加一个Qt界面以方便操作,对于一个刚刚创建的ROS程序来说,添加qt界面需要对cmakelist.txt文件配置很多东西,许多人难就难在不会修改对应的cmakelist.txt文件上,下面是我根据网上资料整理的一份ROS+Qt5的工程创建方法,包括了从创建一个最基础的ros空间到添加界面的全过程。
系统环境:ubuntu16.04
ros版本:kinetic
编程语言:c++
qt及qtcreator版本如下图:
QtCreator能够编译ROS程序。即启动后能够找到ros环境变量。
1、创建一个空的ros空间。
根据ros官网的基础教程,你可以自己指定一个目录,建立一个空文件夹,叫做catkin_qt,之后的所有操作都将在这个文件夹下,不会在别处生成多余的文件。
mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
//这是来自ros官网的最基础操作,此时即将会拥有一个空的ros程序包,但里面还没有创建任何程序
2、创建一个普通的ros程序。
进入src目录,执行下面的命令,该命令创建一个最基本的空ros程序,
catkin_creat_pkg qt_app roscpp std_msgs
此时并没有任何cpp文件生成,需要自己添加一个包含main函数的cpp文件
新建一个包含main函数的极其简单的cpp文件,我们这里取名为qt_app_node.cpp,放在了src目录下,还自己写了一个头文件qt_app_node.h,放在了include/qt_app目录下
//这不是最终的文件,只是一个空工程模板
#include
int main(int argc, char *argv[])
{
return 0
}
3、使用Qtcreator添加窗口类文件。
点击“文件”->“新建文件或项目”,按照下述选择创建窗口类文件。
跟随向导一路下来,将会在工程目录下src文件夹中多出三个文件mainwindow.cpp、mainwindow.h和mainwindow.ui,前两个文件定义了窗口类,后一个ui文件描述了窗口样式。
但此时,这些新创建的文件和原本的ros工程还没建立任何关系,只是目录下多出了几个文件而已,并不参与真正的编译,下面要修改cmakelist文件,让这些窗口类文件参与编译。
重点内容:修改cmakelist.txt文件
下面是一份完整的cmakelist文件,里面配置了与Qt相关的内容
cmake_minimum_required(VERSION 2.8.3)
project(qt_app)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
find_package(Qt5 REQUIRED COMPONENTS Widgets )
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(SOURCES
src/qt_app_node.cpp
src/mainwindow.cpp
)
set(FORMS
src/mainwindow.ui
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES qt_app
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
include/qt_app
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node ${SOURCES} ${FORMS} )
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
target_link_libraries(${PROJECT_NAME}_node Qt5::Widgets )
对上述cmakelist文件内容稍作解释:
find_package(Qt5 REQUIRED COMPONENTS Widgets )
这是找到qt5中的widgets组件的关键步骤,使程序编译时能够找到qt5-widgets相关头文件和库函数。
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
CMAKE_AUTOMOC 参数含义见这里
CMAKE_AUTOUIC 参数含义见这里
set(SOURCES
src/qt_app_node.cpp
src/mainwindow.cpp
)
set(FORMS
src/mainwindow.ui
)
指明需要参与编译的cpp及ui文件,分别给它们起个变量名叫SOURCES和FORMS,后续会用到。
add_executable(${PROJECT_NAME}_node ${SOURCES} ${FORMS} )
这是生成可执行文件,此时用到了SOURCES和FORMS所指明的cpp和ui文件。
target_link_libraries(${PROJECT_NAME}_node Qt5::Widgets )
在链接环节,告诉目标文件需要qt5的widgets组件作为动态链接库。
此时,窗口类文件参与了编译,但是还并没有任何窗口被创建,因为窗口类在main函数里还没有任何实体对象。
下面修改qt_app_node.cpp文件,创建一个空窗口。
#include
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
此时,编译程序,执行生成的可执行文件 qt_app__node,将会打开一个空窗口。
使用qt5创建基本窗口的过程已经完成,剩下的是自己添加ros相关代码,并具体绘制窗口控件,这与普通的ros程序和qt程序是一模一样。