本篇博客主要介绍怎么使用qt对ros进行gui设计与调试,包括使用列表视图显示ROS话题发布与接收的消息,点击QT按钮按钮进行ros消息的发布

在阅读本文之前没有安装QT与配置环境可以参考博文:如何用Qt的对ROS项目进行调试及创建GUI界面。

最近有个项目需要对ROS进行GUI设计,而ROS在这方面开发教程实在是很少,去师兄那里取经之后就开始干活了,现将自己的详细经验分享。

一,ROS下创建QT_GUI文件

(1)安装catkin_create_qt_pkg ROS包,打开终端输入以下命令:

$ sudo apt-get install ros- <distro> -qt-ros // distro是ros版本,例如LZ的就是ros-hydro-qt-ros

(2)进入工作空间使用如下命令创建基于QT的ros_gui文件:

$ cd catkin_ws / src //进入自己的工作空间
$ catkin_create_qt_pkg ros_gui //创建ros_gui包
$ catkin_create_qt_pkg ros_gui //创建ros_gui包

(3)如下图,在终端输入qtcreator打开QT(或者在桌面配置了QT-ROS启动快捷方式的直接点击启打开),选择打开项目进入ros_gui文件下选择CMakeList.txt文件打开:

(4)进入的CMake向导构建路径步骤点击下一步:

(5)在执行Cmake步骤中,参数选项输入:-DCMAKE_BUILD_TYPE = DEBUG,然后点击执行CMake,最后点击完成:

(6)如下图,可以看到打开的ros_gui项目(吐槽下这里居然不显示头文件目录,导致编辑头文件代码不方便,建议将头文件与CPP文件放在一起再导入,导入后修改的cpp中头文件路径):

二,在QT视图中显示ROS话题发布与接收的消息

(1)打开终端roscore启动ros_Master,在QT上直接编译运行ros_gui项目,填写自己的ROS信息(ROS_MASTER_Url可直接在终端中查看,ROS_IP可以在终端输入的ifconfig命令查看),点击连接,如下图可以看到程序内置了一个文本视图与ROS发送节点,视图上显示节点发送的信息:

(2)下面在窗口空间中添加一个文本视图使其显示接收到的消息,打开main_window.ui文件,拖入一个列表视图控件并将其对象名更改为view_logging_sub,然后拖入两个Label控件到对应的视图空间上改为pub与sub:

(3)打开qnode.hpp(项目列表不显示的直接打开项目包括文件夹拖入qt)与qnode.cpp,在其添加代码(添加部分代码标记为//添加):

<qnode.hpp>:

#include <QStringListModel>
#include <std_msgs / String.h> //add/ ******************* ****************************
**
************************************************** *************************** /
class QNode:public QThread {Q_OBJECT
public:QStringListModel * loggingModel_sub(){return&logging_model_sub; } //addvoid log_sub(const LogLevel&level,const std :: string&msg); //addvoid Callback(const std_msgs :: StringConstPtr&submsg); //addQ_SIGNALS:void loggingUpdated_sub(); //addprivate:    ros :: Subscriber chatter_subscriber; //addQStringListModel logging_model_sub; //add
};

<qnode.cpp>:

/ ******************* ****************************
**
************************************************** *************************** /
bool QNode :: init(){
//在这里添加你的ros通讯。
chatter_publisher = n.advertise <std_msgs :: String>(“chatter”,1000);chatter_subscriber = n.subscribe( “chatter”,1000,&QNode ::Callback,this); //加}bool QNode :: init(const std :: string&master_url,const std :: string&host_url){
//在这里添加你的ros通讯。
chatter_publisher = n.advertise <std_msgs :: String>(“chatter”,1000);chatter_subscriber = n.subscribe( “chatter”,1000,&QNode ::Callback,this); //add}void QNode :: log_sub(const LogLevel&level,const std :: string&msg){// addlogging_model_sub.insertRows(logging_model_sub.rowCount(),1);std :: stringstream logging_model_msg;开关(级别){case(Debug):{ROS_DEBUG_STREAM(MSG);logging_model_msg <<“[DEBUG] [”<< ros :: Time :: now()<<“]:”<< msg;break;}case(Info):{ROS_INFO_STREAM(MSG);logging_model_msg <<“[INFO] [”<< ros :: Time :: now()<<“]:”<< msg;break;}case(Warn):{ROS_WARN_STREAM(MSG);logging_model_msg <<“[INFO] [”<< ros :: Time :: now()<<“]:”<< msg;break;}case(Error):{ROS_ERROR_STREAM(MSG);logging_model_msg <<“[ERROR] [”<< ros :: Time :: now()<<“]:”<< msg;break;}case(Fatal):{ROS_FATAL_STREAM(MSG);logging_model_msg <<“[FATAL] [”<< ros :: Time :: now()<<“]:”<< msg;break;}}QVariant new_row(QString(logging_model_msg.str().c_str()));logging_model_sub.setData(logging_model_sub.index(logging_model_sub.rowCount() -  1),NEW_ROW);Q_EMIT loggingUpdated_sub(); //用于重新调整滚动条
}void QNode :: Callback(const std_msgs :: StringConstPtr&submsg)// add
{log_sub(Info,std :: string(“Success sub:”)+ submsg-> data.c_str());
}

(4)再打开main_window.hpp(项目列表不显示的直接打开项目包括文件夹拖入qt)与main_window.cpp,其中添加代码(添加部分代码标记为// add):

<main_window.hpp>:

pubilc Q_SLOTS:
/ ******************************************
**
********* /void updateLoggingView_sub(); //add

<main_window.cpp>:

/ *********************
**
********************** /
ui.view_logging_sub->setModel(qnode.loggingModel_sub()); //add
QObject :: connect(&qnode,SIGNAL(loggingUpdated_sub()),this,SLOT(updateLoggingView_sub())); //add/ ******************* ****************************
**
************************************************** *************************** /
void MainWindow :: updateLoggingView_sub(){// addui.view_logging_sub-> scrollToBottom();
}

(5)如下图,保存修改后的文件并且编译运行可以实现在GUI显示消息的接收与发送:

三,使用QT按钮进行消息的发布

下面实现通过点击按钮进行ROS消息的发送:

(1)如下图打开main_window.ui,拖入一个按钮控件,将对象名改为sent_cmd:

(2)打开qnode.hpp(项目列表不显示的直接打开项目包含文件夹拖入qt)与qnode.cpp,在其中添加代码(添加部分代码标记为红色//添加):

<qnode.hpp>:

class QNode:public QThread {Q_OBJECT
pubilc:
/ *********************
**
********************** /
void sent_cmd(); //add

<qnode.cpp>:

/ ******************* ****************************
**实施
**********************************
void QNode :: sent_cmd()// add
{if(ros :: ok()){std_msgs :: String msg;std :: stringstream ss;ss <<“clicked the button”;msg.data = ss.str();chatter_publisher.publish(MSG);log(Info,std :: string(“I sent:”)+ msg.data);ROS :: spinOnce();
}

(4)再打开main_window.hpp(项目列表不显示的直接打开项目包括文件夹拖入qt)与main_window.cpp,其中添加代码(添加部分代码标记为红色// add):

<main_window.hpp>:

pubilc Q_SLOTS:
/ ******************************************
**
********* /
void pub_cmd(); //add

<main_window.cpp>:

/ *********************
**
********************** /
QObject ::connect(ui.sent_cmd,SIGNAL(clicked()),this,SLOT(pub_cmd())); //add/ *********************
**
********************** /
void MainWindow :: pub_cmd(){// add
qnode.sent_cmd();
}

(5)最后编译运行,如下图,点击sent_cmd按钮可以看到发送的消息:

下一篇博客会详细讲解怎么在GUI中显示rviz,怎么使用按钮运行ROS启动文件启动。

ROS项目开发实战(三)——使用QT进行ROS的GUI界面设计(详细教程附代码!!!)相关推荐

  1. 个人作业项目报告(三)输出结果及测试样例的结果(附代码)

    代码调用图 代码调用图的图例:(感谢刘泽@kfk的vs2015企业版的强大功能) 输出结果 因为助教给的程序是在WIndows平台上运行代码得到的结果,所以主要放出的是Windows平台下的结果,Li ...

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

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

  3. Python编程:从入门到实践+爬虫开发与项目实战+网络编程基础+项目开发实战

    给还在苦苦自学Python的小伙伴们分享一波学习教程~有了它们,至少能节省50%的时间,少走一半的弯路. 书不在多,而在于精~ <Python编程:从入门到实践>豆瓣评分9.2 本书是针对 ...

  4. springboot项目开发实战

    文章目录 springboot项目开发实战之后端流程详解 一.创建简单的springboot之web项目 1.简单springboot框架环境搭建 2.相关jar包的导入 3.配置文件yaml的设置 ...

  5. 基于 uni-app 和 uni-cloud 小程序项目开发实战

    基于 uni-app 和 uni-cloud 小程序项目开发实战 前言 一.技术栈 二.环境搭建 三.项目功能介绍 1.地图地点搜索及路线规划 2.uniCloud服务空间 3.AI识图 4.上拉框组 ...

  6. Android项目开发实战常用知识点

    Android项目开发实战常用知识点 一:启动页延时两秒再跳转到主界面: //执行类 private class SlpashRunnable implements Runnable {@Overri ...

  7. 云计算Python自动化运维开发实战 三、python文件类型

    为什么80%的码农都做不了架构师?>>>    云计算Python自动化运维开发实战 三.python文件类型 导语: python常用的有3种文件类型 1. 源代码     py ...

  8. python项目开发实战网盘-python项目开发实战 第2版

    python项目开发实战 第2版是一本Python项目开发流程实战手册,由日本BePROUD股份有限公司编著.本书的内容全部基于python开发事实,全部都是BeProud员工实际尝试.实践过的,可以 ...

  9. android网络游戏开发实战pdf_Python项目开发实战+第2版PDF高清文档下载

    本书来自真正的开发现场,是BePROUD公司众多极客在真实项目中的经验总结和智慧结晶.作者从Python的环境搭建开始讲起,介绍了Web应用的开发方法.项目管理及审查.测试与高效部署.服务器调试等内容 ...

最新文章

  1. java程序运行结果题_(Java程序设计)试题
  2. 可用子网数要不要减2_网络层 | 网际协议IP(2)
  3. 一线大厂为什么对免费的开源项目这么热衷?
  4. respond java 使用_java – 使用android问题的HttpResponse:执行总...
  5. oracle 关于归档的视图,10G中,什么视图可以看归档空间的大小
  6. xcode工程间的引用,iOS静态库
  7. rest sso 和_SSO企业单点登录系统——CAS REST认证方式
  8. 2021-09-09316. 去除重复字母 栈
  9. 网络安全实验1——口令攻击和钓鱼攻击
  10. dbv连oracle,oracle工具:DBV的用法
  11. 【目标检测】YOLOv1代码实现之TensorFlow
  12. 移动端适配方案(rem+flex)
  13. SpringBoot中微服务技术中进程间通信原理
  14. 计算机网络之传输层笔记
  15. 带着11名医生冲刺上市,清晰医疗能够对标希玛眼科吗?
  16. 高斯-约当消元法(随机程序,UVA 10828)
  17. BitComet for Mac(高效好用的BT下载客户端)
  18. coreldraw x8里线段显示尺寸_CorelDRAW X8实现轮廓线的粗细变化的方法
  19. 图像开运算、闭运算、形态学梯度、“礼帽”和“黑帽”
  20. 登录安全性 一天内连续输入密码错误3次,第二天才能登录(过了当天凌晨24点),实现原理

热门文章

  1. Axure-中继器的使用
  2. 单精度浮点数计算机存储的理解(IEEE 754)
  3. Gut:中国药科大学周伟等团队在肠道菌群驱动风湿性关节炎机制研究和中药干预方面取得新进展...
  4. 小说阅读网html+css+JavaScript
  5. 内网服务器防火墙作用,防火墙内网用户通过公网域名访问内部服务器典型配置案例集...
  6. 股价跳水20%,市值缩水1230亿美元?Facebook财报会议告诉你原因
  7. vue:高德地图的使用
  8. 编译原理个人作业--第五章——基于 编译原理 国防工业出版社 第三版
  9. python利器app插件_python利器app
  10. 语音降噪论文“A Hybrid Approach for Speech Enhancement ...“的研读