在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:

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

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

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

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

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

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

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

 

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

 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 }

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

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

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

 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 显示。