在QT上实现ROS 节点的发布和订阅

 本主要参考博客内容http://www.cnblogs.com/dzqiu/p/9519485.html,其中有些内容不一样,因个人版本而异。

1、安装ros_qtc_plugin

教程很多,贴上大神地址:https://blog.csdn.net/u013453604/article/details/52186375

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,故配置如下:

.5、现在我们来建立发布者节点文件,右键点击helloworld -> Add New ->ROS ->Basic Publisher Node 命名为test1_a.cpp

 

复制代码

 1 #include "ros/ros.h"
 2 #include "std_msgs/String.h"
 3 #include <sstream>
 4 
 5 
 6 int main(int argc, char **argv)
 7 {
 8     ros::init(argc,argv,"test1_a");
 9     ros::NodeHandle n;
10     ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",1000);
11     ros::Rate loop_rate(10);
12     while(ros::ok()) {
13         std_msgs::String msg;
14         std::stringstream ss;
15         ss << "Hello test1_b! I am test1_a.";
16         msg.data = ss.str();
17         ROS_INFO("%s",msg.data.c_str());
18         chatter_pub.publish(msg);
19         ros::spinOnce();
20         loop_rate.sleep();
21     }
22     return 0;
23 }

复制代码

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

复制代码

 1 #include "ros/ros.h"
 2 #include "std_msgs/String.h"
 3 
 4 void chatterCallback(const std_msgs::String::ConstPtr &msg)
 5 {
 6     ROS_INFO("Hello test1_a! I am test1_b. I heard:[%s]",msg->data.c_str());
 7 }
 8 
 9 int main(int argc, char **argv)
10 {
11     ros::init(argc,argv,"test1_b");
12     ros::NodeHandle n;
13     ros::Subscriber sub = n.subscribe("message",1000,chatterCallback);
14     ros::spin();
15 
16     return 0;
17 }

此时窗口上方出现黄色字体Warning,不用担心 ,(最终编译后就消失了)

2.7、添加生成可执行文件,并链接:在helloworld下的CMakeList.txt中添加下面几行:(注:add_executable尽量放在最后,不然生成的可执行文件会在build文件夹中而不是再devel中,最后导致rosrun报错找不到可执行文件(复制过去也行):

add_executable(test1_a test1_a.cpp)
target_link_libraries(test1_a  ${catkin_LIBRARIES})
add_executable(test1_b test1_b.cpp)
target_link_libraries(test1_b  ${catkin_LIBRARIES})

2.8、右击blogbook,点击build,成功后重新打开文件就不会再有警告了。同时,工程也编译完毕! 

3、执行文件

Qt内部可以添加run使得ROS节点很方便就能执行

3.1、 添加run:点击最右边工具栏Project,再Build & Run中选择Run, Run 设置下Add Run Step中选择ROS Run Step,选择package:helloworld,  Target:test1_a;再一次选择ROS Run Step,选择package:helloworld,  Target:test1_b;

3.2、不要忘记先打开一个终端执行roscore,然后点击右边绿色三角或者工具栏中run运行。最终结果在8 ROS Terminals 显示。

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Qt 是一个跨平台的应用程序开发框架,ROS(机器人操作系统)是一个用于开发机器人软件的软件框架。订阅 ROS 话题是指使用 Qt 框架编写的应用程序可以获取 ROS发布的话题数据。 在 Qt订阅 ROS 话题需要借助 ROS Qt 包提供的功能。首先,我们需要在 CMakeLists.txt 文件中添加对 Qt 模块的依赖。然后,在应用程序代码中,我们需要包含 Qt 的头文件,并在主函数中初始化 ROS 节点。 接下来,我们可以使用 ROS Qt 包提供的 QROSNode 类创建一个 ROS 节点对象。通过调用节点对象的 subscribe() 函数,我们可以订阅指定的 ROS 话题,并设置回调函数来处理接收到的数据。回调函数会在有新数据发布到话题时自动被调用。 在回调函数中,我们可以根据需要处理接收到的数据,并更新 Qt 应用程序的界面或执行其他操作。例如,我们可以将接收到的数据显示在 Qt 的文本框或标签中,或者根据接收到的数据控制机器人的运动。 需要注意的是,为了在 Qt 应用程序订阅 ROS 话题,我们需要确保 ROS 环境已经正确地设置,包括正确配置 ROS_MASTER_URI 和 ROS_IP。 总之,借助 ROS Qt 包,我们可以很方便地在 Qt 应用程序订阅 ROS 话题,从而实现对机器人软件的控制和监测。 ### 回答2: 在ROS中,我们可以使用Qt订阅ROS话题,以便接收和处理来自其他节点发布的消息。 首先,我们需要在Qt应用程序中包含ROSrosbridge库,这样才能与ROS系统进行通信。接下来,我们需要创建一个ROS节点,并使用ros::init()函数来初始化ROS。然后,我们可以创建一个Qt Widget界面,用于显示接收到的消息。 接下来,我们需要定义一个ROS话题订阅者,用于接收特定话题的消息。在Qt中,我们可以使用QObject类的子类来实现订阅者。在订阅者类的构造函数中,我们可以使用ros::NodeHandle对象来订阅特定的ROS话题,并指定回调函数来处理接收到的消息。 在回调函数中,我们可以将接收到的消息转换成我们需要的数据类型,并进行处理。例如,如果我们接收到的消息是一个包含字符串数据的std_msgs::String消息,我们可以使用QString来存储和显示该字符串。 最后,在我们的Qt Widget界面中,我们可以使用Qt信号和槽机制来将接收到的消息发送到需要显示的部件。例如,我们可以将接收到的消息通过一个QLabel部件来显示在界面上。 需要注意的是,在订阅ROS话题之前,我们需要确保ROS系统已经启动,并且所需的ROS节点和话题已经被创建。 通过上述步骤,我们可以使用Qt订阅ROS话题,并实时接收、处理和显示来自其他节点发布的消息。 ### 回答3: Qt是一个流行的跨平台应用程序开发框架,它可以用于开发各种类型的应用程序,包括机器人的控制和监控系统。ROS(Robot Operating System)是一个用于机器人软件开发的开源框架,它提供了一系列的工具、库和通信机制,可以方便地实现机器人的感知、控制和协作。 在Qt订阅ROS话题可以通过使用ROSQt增加库(roscpp库)来实现。首先,需要在Qt项目中添加roscpp库的依赖关系。然后,在Qt应用程序中引用roscpp库,并使用roscpp提供的函数来订阅ROS话题。 订阅ROS话题的过程如下: 1. 创建一个Qt的类,用于处理从ROS话题接收到的数据。 2. 在该类的构造函数中,初始化ROS节点,并创建一个订阅器对象。传入订阅器的参数包括订阅的话题名称、订阅消息的类型、回调函数等。 3. 编写回调函数,用于接收到消息后的处理操作。回调函数的参数与订阅的消息类型相匹配。 4. 在订阅器对象中注册回调函数,以便在接收到新消息时调用。 5. 启动ROS节点的事件循环,以便接收消息并调用相应的回调函数。 通过这样的方式,可以在Qt应用程序中实时地订阅ROS话题,并处理接收到的数据。在接收到新消息时,回调函数会被调用,可以在其中更新界面、执行控制操作或进行其他处理。这样,Qt应用程序就与ROS框架进行了集成,可以实现更方便、灵活的机器人软件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值