很多时候我们开发ROS程序的时候,会遇到GUI的需求。有几种方法可以在ROS中开发GUI程序,比如使用rqt_qt。若基于Python语言,还可以使用pyqt、thinker等GUI库。若基于C++,最好的选择是QT。

ROS官方是支持QT4的,比如可以使用catkin_create_qt_pkg创建qt功能包,而ROS中很多著名的工具都是基于QT4。但是2020年,谁还用QT4,当然是拥抱QT5了。此外,ROS并没有一个官方的IDE,虽然使用编辑器+命令行也能满足需求,但是带界面的IDE更加赏心悦目是吧。故本文首先介绍如何使用Qt Creator这个IDE开发ROS程序,然后介绍如何在ROS程序中使用QT5库来开发GUI界面,最后介绍如何在QT中显示PCL库的点云。

Qt Creator开发ROS程序

Levi-Armstrong大佬已经开发了对应的qt插件:ros_qtc_plugin使我们能在qt creator上编译ROS程序。这个插件以前使用ppa的方式进行安装,现在大佬已经把该插件集成到qt creator里面了,安装和使用文档。大致流程是:

1.安装Qt Creator for ROS

下载对应系统的Qt安装包:分为在线和离线安装两种方式,然后运行.run安装包完成带插件的qt creator的安装。如果你之前使用ppa安装过的话,要先删除ppa。

2.配置Qt Creator for ROS

教程里面配置了Qt Creator的各种选项,但其实只有第一项:配置Ubuntu允许debugging/ptrace是必要的。过程为:

(1.Open file: sudo gedit /etc/sysctl.d/10-ptrace.conf

(2.Change the value of kernel.yama.ptrace_scope to 0

(3.Reload the kernel configuration with sudo systemctl restart procps.service

其它的都是可选的。

3.ROS程序创建

在Qt Creator中创建catkin工作空间、创建功能包和节点。

A.首先创建catkin工作空间

打开 “新建文件或项目”,选择ROS Workspace:

下面填写工作空间名称和路径,ps:创建工作空间不会独立创建文件夹,因此最好先新建一个与该工作空间同名的文件夹作为路径。

B.创建功能包

在工作空间下有一个src目录(默认是隐藏的,先设置显示空目录),右键该目录新建文件打开对话框,选择Package。

填入功能包的名称、和依赖的功能包。

C.创建节点

右键功能包目录下的src文件夹,新建文件打开对话框。选择对应节点类型。

然后填入节点名称,比如test.cpp。

4.配置CMakeLists.txt

跟普通的ROS程序一样,需要配置功能包的CMakeLists.txt文件才能编译。一个典型的CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 2.8.3)
project(ros_basic)find_package(catkin REQUIRED COMPONENTSgeometry_msgsmove_base_msgsnav_msgsroscpprospysensor_msgsstd_msgstf
)catkin_package(
)include_directories(${catkin_INCLUDE_DIRS}
)add_executable(time_test src/time_test.cpp)
target_link_libraries(time_test ${catkin_LIBRARIES} )

5.配置ROS程序

点击项目,首先配置编译选项,使用CatkinMake编译系统。

配置运行选项,设置运行的功能包和节点。

配置完成后,编译程序,然后就可以运行了。

ROS程序使用QT5库

在前面的基础上,添加Qt的GUI界面是很简单的。右键功能包新建文件,打开对话框,选择QT界面类:

然后选择主窗口类:

最后填入类名、头文件名、源文件名、界面文件名等完成创建。

上面创建了一个qt窗口,但是只是增加了几个文件,并没有添加到编译系统。下面修改CMakeLists.txt使得catkin可以编译qt组件。一个典型的配置如下:

cmake_minimum_required(VERSION 2.8.3)
project(test_ros_qt)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)
find_package(Qt5 REQUIRED COMPONENTS  Widgets)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)set(SOURCESsrc/test_node.cppsrc/mainwindow.cpp
)
set(FORMSsrc/mainwindow.ui
)catkin_package(
)include_directories(include/test_node_qt${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 )

重要语句解释:

set(CMAKE_AUTOMOC ON) #QT中使用moc元对象编译器分析QT语句,然后才交给标准的C++编译器。
set(CMAKE_AUTOUIC ON) #QT中使用uic分析ui代码
set(CMAKE_INCLUDE_CURRENT_DIR ON) #设置工程包含当前目录

然后编译运行即可。

QT中显示点云

熟悉PCL的朋友应该知道它自带了可视化点云的类,这些组件基于VTK。因此若想在QT中显示点云,一个直接的方法是使用VTK进行显示。当然也可以使用OpenGL。下面介绍基于VTK的点云可视化方法:

  1. 安装VTK

首先从官网上下载VTK的源码:https://vtk.org/download/ 。我这里选择VTK8.2,解压后进行目录,执行:

mkdir build
cd build
cmake -DVTK_QT_VERSION:STRING=5 \-DQT_QMAKE_EXECUTABLE:PATH=/home/chen/QtCreator/latest/bin \-DVTK_Group_Qt:BOOL=ON \-DCMAKE_PREFIX_PATH:PATH=/home/chen/QtCreator/latest/lib/Qt/lib  \-DBUILD_SHARED_LIBS:BOOL=ON \
make -j4 #编译
sudo make install #安装

PS:正常Qt应该是这么配置的,

cmake -DVTK_QT_VERSION:STRING=5 \ #QT版本-DQT_QMAKE_EXECUTABLE:PATH=/path/to/qt5.2.1-install/5.2.1/gcc_64/bin/qmake \ #qmake的路径-DVTK_Group_Qt:BOOL=ON \-DCMAKE_PREFIX_PATH:PATH=/path/to/qt.5.2.1-install/5.2.1/gcc_64/lib/cmake  \ #qt中cmake的路径-DBUILD_SHARED_LIBS:BOOL=ON.. #VTK目录

编译安装完成后,将 build/lib/libQVTKWidgetPlugin.so 复制到 /home/chen/QtCreator/latest/lib/Qt/plugins/designer/目录下。ps:正常Qt应该复制到:/home/chen/Qt5.5/Tools/QtCreator/lib/Qt/plugins/designer/目录。这样使用Qt designer的时候,就出现该vtk控件了。

下面通过一个综合实例来了解一下如何使用VTK组件显示点云。

综合实例:QT点云显示

根据前面的介绍,建立的工程如下:

其中ui设计文件如下:

mainwindow.h的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QLabel>
#include <QVTKWidget.h>
#include <vtkRenderWindow.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>typedef pcl::PointXYZRGB PointT;
typedef pcl::PointCloud<PointT> PointCloud;namespace Ui {class MainWindow;
}
class MainWindow : public QMainWindow
{Q_OBJECT
public:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();boost::shared_ptr<pcl::visualization::PCLVisualizer> densePointCloudViewer;PointCloud::Ptr densePointCloud;
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

这里面定义一个点云指针,和一个PCL可视化对象,并设置为智能指针。

 mainwindow.cpp的代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);densePointCloudViewer.reset (new pcl::visualization::PCLVisualizer ("DensePointMap", false));densePointCloudViewer->setBackgroundColor (0, 0, 0);densePointCloudViewer->addCoordinateSystem (0.5);//设置坐标轴大小densePointCloudViewer->initCameraParameters ();ui->qvtkWidget->SetRenderWindow (densePointCloudViewer->getRenderWindow());densePointCloudViewer->setupInteractor (ui->qvtkWidget->GetInteractor (), ui->qvtkWidget->GetRenderWindow ());ui->qvtkWidget->update ();densePointCloud.reset (new PointCloud);densePointCloud->points.resize (1000);for (size_t i = 0; i < densePointCloud->points.size (); ++i){densePointCloud->points[i].x = 2 * rand () / (RAND_MAX + 1.0f);densePointCloud->points[i].y = 2 * rand () / (RAND_MAX + 1.0f);densePointCloud->points[i].z = 2 * rand () / (RAND_MAX + 1.0f);densePointCloud->points[i].r = 255;densePointCloud->points[i].g = 255;densePointCloud->points[i].b = 255;}densePointCloudViewer->addPointCloud (densePointCloud, "cloud");ui->qvtkWidget->update ();
}MainWindow::~MainWindow()
{delete ui;
}

对熟悉PCL的朋友来说上面的代码还是很简单的,唯一需要注意的点是每次更新PCLVisualizer对象,都要将绑定的VTKWidget更新。

test_node.cpp是节点主程序,代码如下:

#include <ros/ros.h>
#include <QApplication>
#include "mainwindow.h"int main(int argc, char **argv)
{ros::init(argc, argv, "test_node");ros::NodeHandle nh;ROS_INFO("Hello world!");ROS_INFO("Hello OK!klk");QApplication a(argc,argv);MainWindow w;w.show();return a.exec();
}

接下来是重头戏,CMakeLists.txt如下:

cmake_minimum_required(VERSION 2.8.3)
project(test_ros_qt)add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)find_package(Qt5 REQUIRED COMPONENTS  Widgets
)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES test_ros_qt
#  CATKIN_DEPENDS roscpp
#  DEPENDS system_lib
)include_directories(include/test_node_qtinclude${catkin_INCLUDE_DIRS}/usr/local/include/usr/include/pcl-1.7/usr/include/vtk-6.2
)set(LIBS-lpcl_common-lpcl_search-lpcl_features-lpcl_segmentation-lpcl_recognition-lpcl_visualization-L/usr/lib/x86_64-linux-gnu/-L/usr/lib/x86_64-linux-gnu/-lboost_system-lboost_thread-lvtkRenderingCore-6.2-lvtkCommonDataModel-6.2-lvtkCommonMath-6.2-lvtkCommonCore-6.2-lvtkGUISupportQt-6.2Qt5::Widgets
)set(SOURCESsrc/test_node.cppsrc/mainwindow.cpp
)set(FORMSsrc/mainwindow.ui
)add_executable(${PROJECT_NAME}_node ${SOURCES} ${FORMS})
target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES} ${LIBS}
)

我尝试了一下,好像不能直接find_package找到PCL之类的库,直接设置路径才能编译通过。

最后,就是编译程序,运行结果如下:

QT5+ROS程序开发相关推荐

  1. 〖Linux〗使用Qt5.2.0开发Android的NDK应用程序

    2013年12月11日,Qt发布了其新的Qt版本:Qt5.2.0: 利用这个新的版本,我们可以很轻松地制作出Android手机的NDK应用程序. 开发环境:Ubuntu13.10 x86_64 下载链 ...

  2. QtCreator与catkin命令两种方式开发ROS程序(图示加代码)

    QtCreator与catkin命令两种方式开发ROS程序(图示加代码) 一.Qt Creator安装及开发ROS 1.安装Qt Creator 2.使用Qt Creator开发ROS 1.创建工作空 ...

  3. linux中qt加载rviz,ROS与Qt5人机交互界面开发-添加rviz显示界面

    ROS与Qt5人机交互界面开发-添加rviz显示界面 说明: 介绍如何添加rviz显示界面 步骤: 实现效果: 核心代码 创建librviz界面类: qrviz_widget.h内容如下: #ifnd ...

  4. Qt5+STM32F407+步进电机 | 通过电脑控制步进电机实现:6+2通道、速度可变、运动精确步数的教程——程序开发(3/4)

    这次项目的讲解分为4各部分,分别是简介(1/4).基础知识(2/4).程序开发(3/4)和联合调试(4/4),这一次内容属于程序开发(3/4),可以对应文章标题(↑)快速定位目前处于哪一讲解环节. 程 ...

  5. ROS应用开发入门 服务数据的定义和使用

    ROS是机器人操作系统的简称,本文介绍ROS应用开发入门,服务数据的定义和使用.客户端和服务端 之间通讯都使用服务数据(service data).本文先定义一个服务数据,编译成功后,用一个服务端和一 ...

  6. ROS项目开发流程、框架

    1.       ROS项目开发流程? 参照古月大神写的ROS探索总结系列:http://blog.exbot.net/archives/619 具体项目设计可看看<程序员>杂志的最新一篇 ...

  7. 机器人操作系统ROS 编程开发--详细总结

    最近工作涉及到自动驾驶的,需要学习ROS,学习中总结了一些知识点,分享给大家. ROS基本介绍 机器人操作系统ROS,是一种分布式处理框架(又名Nodes),ROS常用C++和python编程语言开发 ...

  8. Qt程序开发通用框架

    基于Qt5.6.3通用的程序开发基础框架. 此框架采用流行的分层+插件架构 技术架构采用"3/N层+插件架构"(目前非常流行的架构),其中"3/N层"对系统进行 ...

  9. 基于Golang的CLI 命令行程序开发

    基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...

最新文章

  1. [Pytorch]基于混和精度的模型加速
  2. android碎片实验报告,实验报告
  3. HTTP/3 原理实战
  4. Tableau研学小课堂(part2)--Tableau数据源界面
  5. Shell脚本——内置命令
  6. 2021年四月上旬推荐文章
  7. 阿里小蜜多模态知识图谱的构建及应用
  8. 前端性能监控方案window.performance 调研(转)
  9. python数字组合算法_python猜数字游戏快速求解解决方案
  10. 开源非英文关键词编程语言
  11. Android 圆角的效果实现
  12. node.js配置oracle,Node.js 安装配置 | 菜鸟教程
  13. winhex使用教程(详细版)
  14. Nature、Science、Cell、Plos系列顶级学术杂志解析
  15. 对链表结构体定义中的LNode,*LinkList的理解
  16. java 获取文件后缀及根据文件扩展名判断文件是否图片格式
  17. web服务器性能瓶颈,Web服务器性能瓶颈因素
  18. openEuler 文档捉虫 2.0 上线啦,一键式提交 PR,成为开源贡献者,你也可以参与,文档伴读方案正式开源!
  19. 蓝桥杯精选赛题系列——统计数字
  20. 嵌入式开发什么时候需要用RTOS?

热门文章

  1. 2018暑假第一周总结(7.9-7.15)
  2. 20165237 2017-2018-2 《Java程序设计》第1周学习总结
  3. selenium通过autoit实现上传和下载
  4. mysql 多表 update sql语句总结
  5. ubuntu 10.04 install vbox site
  6. 对视觉任务更友好的Transformer,北航团队开源Visformer!
  7. 成都理工大学“自然地理学”专业转行AI之路(精彩直播回放)
  8. ECCV 2020 谷歌论文盘点—Poster 篇
  9. 奥迪推出大型自动驾驶数据集A2D2
  10. 百度开源业内首个口罩人脸检测及分类模型,携手开发者共同“抗疫”