三种方法在ROS中加载Qt库进行GUI设计

版权声明: https://blog.csdn.net/u014610460/article/details/79355533

编写ros程序,因为有时会涉及到界面设计,所以本人主要用的QtCreator IDE。首先当然是安装QtCreator,这个网上有很多安装教程和下载资源,非常简单。由于Qt的工程大多采用qmake对.pro文件进行编译,而在ros工程中运用的是catkin_make(实际也是对cmake的一个封装,语法都一样),因此很有必要了解下如何用cmake去写Qt工程,这里给个链接(Qt_Cmake_Manual),大致了解下即可。
关于如何在QtCreator中配置ROS环境,可以参考http://wiki.ros.org/IDEs#QtCreator,正如链接里所说,最重要最关键的就是Exec=bash -i -c qtcreator这行令名,用于加载ros环境变量。
在ros的包中都会有CMakeLists.txt文件,在QtCreator中打开项目,选择该文件,并在Arguments中输入-DCMAKE_BUILD_TYPE=Debug,运行cmake,如成功则可继续,如下图所示。一般会遇到的编译出错的情况可根据提示找出,要么语句错误,要么找不到相应的环境变量。
这里写图片描述

下面言归正传,如何进行GUI设计。

方法一:运用qt_build

进入ros工作空间,catkin_create_qt_pkg pkgname 即可建立一个qt_gui模板示例,且可以直接编译后运行。如果不成功,则可能没装qt_ros
我们来分析一下它的CMakeLists.txt文件,发现能找到Qt环境变量的关键在于qt_build包的功劳,及其里面定义的rosbuild_prepare_qt4宏。
对该示例进行稍加整理和扩充,我们可以进行较大项目的开发了。以下笔者对demo进行修改后的运行效果:
这里写图片描述

方法二:运用rqt_plugin

学ros少不了用图形界面进行一些数据分析,常用的如rqt_plot,rqt_graph,rqt_reconfigure,rviz(这个好像也支持插件形式扩充了)等。实际这也是ros完成的一个框架,便于我们以插件的形式添加自己的GUI。源码可以在这里找到。
写rqt_plugin首先得知道ros中的pluginlib,不算太难,关键在于写plugin.xml文件,有专门的例程。很多算法都是通过加载插件实现的,便于工程管理。
rqt提供了C++和python两种语言的插入。如rqt_image_view就用C++实现的,rqt_plot是python实现。如果是用python实现,笔者暂时还没用尝试成功,需要用到PyQt库,再加上python_qt_binding包予以绑定,且用什么比较好的IDE以及对于ui文件的编写和转换为.py都还没研究清楚,希望有人实现后能一起讨论下。这里是ros官网提供的rqt_tutortials

查看CMakeLists.txt可知,rqt_gui_cpp是链接Qt库的关键,它的实现在rqt_gui_core里面。
另外还需要实现以下两个虚函数:

virtual void initPlugin(qt_gui_cpp::PluginContext& context);
virtual void shutdownPlugin();

根据例程自己编写了一个rqt插件,在命令行中运用rqt,可以看到自己写的插件名称(记得source到环境变量),运行并发布消息如下图所示:
这里写图片描述

方法三:直接加载Qt库

前面两种方法都是ros提供好现成demo或模板,且方法一还是用的Qt4实现的,主要因为安装ros时完整版时会自动附带Qt4的库。但现在大部分人都基于Qt5下的开发。方法二较局限于一定要在rqt框架下开发。这也是为什么开头要讲需要了解下如何用cmake编程qt工程的原因了。结合前面两种方法中用到的cmake语法,再综合一下,CMakeLists.txt关键代码段如下:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

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

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
find_package(Qt5Widgets REQUIRED)
qt5_wrap_cpp(MOC src/qt_ros_test.h)
qt5_wrap_ui(UIC src/qt_ros_test.ui)

catkin_package(
   INCLUDE_DIRS include
#  LIBRARIES client_plugin
   CATKIN_DEPENDS roscpp std_msgs
#  DEPENDS system_lib
)

include_directories(
  INCLUDE_DIRS include
  ${CMAKE_CURRENT_BINARY_DIR}/..   ##非常重要,用于找到.ui文件转换后的.h
  ${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME}_node src/main.cpp src/qt_ros_test.cpp src/qt_ros_test.h src/qt_ros_test.ui)
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} Qt5::Widgets)

编译时可能会遇到以下编译不通过提示。
这里写图片描述
主要是找到不Qt的cmake,一般是放在系统目录/usr/lib/i386-linux-gnu/cmake的文件夹中(32位系统)。Q安装ros完整版会自动装qt4库,但qt5一般是用户自己安装的路径下(安装教程一大把),比如home/user/Qt5.5.0,因此在CMakeLists.txt中加入set(Qt5_DIR /home/user/Qt5.5.0/5.5/gcc/lib/cmake/Qt5)就好了,也就是解决“Add the installation prefix of “Qt5” to CMAKE_PREFIX_PATH or set “Qt5_DIR” to a directory containing one of the above files.”的问题。

此外,不过有个小问题就是,运行时会提示匹配不到自定义编写的信号和槽函数,但实际运行是没有问题的。估计跟CMakeLists.txt没有链接到moc文件有关,暂时还没有解决,因为大多数用的时候又没有这个提示。如下图的红色部分:
这里写图片描述

以上就是在ros框架下制作GUI的三种方法,源码下载地址:
https://github.com/WelinLee/ROS_QT_GUI
其中,方法一对应的源码在test_gui文件夹中,
方法二对应的源码在rqt_mypkg文件夹中,
方法三对应的源码在qt_ros_test文件夹中。

此外,基于Qt4和ROS开发的GUI工程示例可在qt4rosgui文件夹中找到。

Enjoy!

猜你喜欢

转载自blog.csdn.net/u014610460/article/details/79355533