【ROS系列】使用QT编写ROS订阅、发布程序
Linux下一直使用QT进行开发,支持cmake使得很容易导入其他工程。学习ROS过程中,很多函数名称难记,使用QT不仅可以提示补全,还为了以后开发GUI方便吧。
1、安装ros_qtc_plugin
首先安装Qt,Qt我安装的是5.5.1版本,直接下载run文件安装即可。同样,ros_qtc_plugin我也是直接下载run运行安装。安装完成后在Terminal可以见到有qtcreator-ros直接运行即可。
2、ROS工程建立
2.1、新建工作区,点击New Project 选择Other Project -> ROS Workspace:

2.2、填写工作区名称,选择路径。选择路径时建议新建同名文件夹,工作区建立时没有自动新建文件夹:


2.3、新建package:左侧工程栏右击src,点击Add New,选择ROS -> Package

2.4、新建包的名字为hellowrld,配置包属性,一般需要依赖roscpp,这里我们写一对简单的发布、订阅程序,所以同时依赖roscpp message_generation std_msgs rospy,故配置如下:

2.5、现在我们来建立发布者节点文件,右键点击src -> Add New ->ROS ->Basic Publisher Node 命名为pub1.cpp
2.6、建立订阅者节点文件,右键点击src -> Add New ->ROS ->Basic Subscriber Node 命名为sub1.cpp。经过两步我们可以看到添加的两个文件,已经有写好的模板程序:

这时,我们看到Qt上面报错:找不到头文件,而且编辑时也没有提示补全!因为Qtcreator-ros中使用cmake来进行管理文件,在导入文件时没有在添加文件路劲进去cmakeList.txt中去。所以接下来做的就是添加关联!
2.7、添加生成可执行文件,并链接:在helloworld下的CMakeList.txt中添加下面几行:(注:add_executable尽量放在最后,不然生成的可执行文件会在build文件夹中而不是再devel中,最后导致rosrun报错找不到可执行文件(复制过去也行),血淋淋的教训):
add_executable(pub1 pub1.cpp)
target_link_libraries(pub1 ${catkin_LIBRARIES})
add_executable(sub1 sub1.cpp)
target_link_libraries(sub1 ${catkin_LIBRARIES})
2.8、右击blogbook,点击build,成功后重新打开cpp文件就不会再找不到头文件了。同时,工程也编译完毕!
3、执行文件
Qt内部可以添加run使得ROS节点很方便就能执行
3.1、 添加run:点击最右边工具栏Project,再Build & Run中选择run, Add Run Step,选择package:helloworld, Target:pub1或者sub1(添加完一个添加另一个)

3.2、不要忘记先打开一个终端执行roscore,然后点击右边绿色三角或者工具栏中run运行。这时可能会发现没有运行结果??点击一栏:1、issues,2、Search...,3、Applic...点击三角形,选择08 ROS Terminal勾上可视即可。另外,可在发布者Terminal使用ctrl+c中断再运行,再观看订阅者Terminal!

结语:
从这个示例很容易发现ROS在消息传输(发布、订阅)中很容易协调,应该在多传感器数据的时候十分好用?期待。
【ROS系列】使用QT编写ROS订阅、发布程序的更多相关文章
- SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- ROS学习手记 - 8 编写ROS的Publisher and Subscriber
上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber 要玩 Publisher 和 Subscriber, 需要具 ...
- Qt for Mac:发布程序(widgets和quick2)
当你用Qt开发好程序后,是不是会很期待将你的成果分享给你的小伙伴 可是Qt的库并不是OS X标配的,所以我们要自己去复制库到app包里,才可以让app在其他未安装Qt的电脑上运行. 比较幸运的是,Qt ...
- Qt之新手打包发布程序
工具:电脑必备.QT下的windeployqt Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无 ...
- [SpingBoot guides系列翻译]Redis的消息订阅发布
Redis的消息 部分参考链接 原文 CountDownLatch 概述 目的 这节讲的是用Redis来实现消息的发布和订阅,这里会使用Spring Data Redis来完成. 这里会用到两个东西, ...
- Node.js系列文章:编写自己的命令行界面程序(CLI)
CLI的全称是Command-line Interface(命令行界面),即在命令行接受用户的键盘输入并作出响应和执行的程序. 在Node.js中,全局安装的包一般都具有命令行界面的功能,例如我们用于 ...
- Qt Package Project 打包发布程序
在Qt项目开发完成后,我们想将项目打包发布成一个可执行文件,需要做如下步骤: 首先,将项目中的release文件中的可执行文件拷到一个新建的文件夹中,例如project.exe,用Qt自带的生成必备的 ...
- 利用Qt自带工具发布程序
Qt官方开发环境生成的exe发布方式--使用windeployqt 从开始菜单-->Qt 5.4.0-->5.4-->MinGW 4.9 (32-bit)-->Qt 5.4 f ...
- QT打开ROS工作空间时遇到的问题和解决方法
之前一直觉得不用IDE写程序看着好像我很能的样子. 其实就相当于工业时代我还钻木取火并且告诉别人你们用打火机根本不知道火被点燃的过程是怎样的. 因为这个技能并非人人都会,就可以拿出去到处臭屁 好了, ...
随机推荐
- Tree Representation Implementation & Traversal
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Tre ...
- php 事务处理,ActiveMQ的发送消息,与处理消息
可以通过链式发送->处理->发送...的方式处理类似事务型业务逻辑 比如 发送一个注册消息,消息队列处理完注册以后,紧接着发送一个新手优惠券赠送,赠送完再发一个其它后续逻辑处理的消息等待后 ...
- 2081.09.22 Kuma(非旋treap)
描述 有N张卡片,编号从0到n-1, 刚开始从0到n-1按顺序排好. 现有一个操作, 对于p. l,表示从第p张卡片之后的l张卡片拿到 最前面. 例如n=7的时候, 刚开始卡片序列为0 1 2 3 4 ...
- 2018.07.10NOIP模拟 Draw(容斥原理)
Draw 题目背景 SOURCE:NOIP2016-RZZ-4 T3 题目描述 给定笛卡尔坐标系上 n 个不重复的点. 定义一个 L 形为: 一个形如 (x,y),(x+1,y)-(x+a,y),(x ...
- js 获取时间不能大于当前系统时间
var dataDate=$.trim($("#dataDate").val()); if(dataDate.length==0){ $("#dataDateTip&qu ...
- A标签中传递的中文参数到Servlet 后台request.getParameter()接收时出现中文乱码
package util; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequ ...
- HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)
题意:给定 n 个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. 析:先把所有的文本串和病毒都插入到AC自动机上,不过标记不一样,可以给病毒标记-1, ...
- cuDNN
https://developer.nvidia.com/developer-program https://developer.nvidia.com/cudnn cuda和cuDNN的关系 http ...
- Java 容器 LinkedHashMap源码分析2
一.类签名 LinkedHashMap<K,V>继承自HashMap<K,V>,可知存入的节点key永远是唯一的.可以通过Android的LruCache了解LinkedHas ...
- 为spring代理类设置属性值
现在有一个bean包含了私有属性,如下: @Component public class Bean { String name; public String getName() { return na ...