#C++实现话题发布与接收
1、第一步依旧是进入工作空间里面的src,如果没有工作空间则新建,如果有就直接跳过。
lzw08@ubuntu:~$ cd ros_ws/src
新建工作空间方法如下图所示:
2、创建工作包
lzw08@ubuntu:~/ros_ws/src$ catkin_create_pkg topic roscpp rospy std_msgs
说明:同样,catkin_create_pkg是创建工作包的命令,“turtle”是工作包的名字,后面跟的都是工作包的依赖。
3、进入到工作包里面的src文件夹
lzw08@ubuntu:~/ros_ws/src$ cd topic/src
4、创建发布话题的.cpp文件:ptopic.cpp
说明:touch是创建文件(.cpp/.py等)的命令,gedit是打开文件(.cpp/.py/.txt等)的命令
lzw08@ubuntu:~/ros_ws/src/topic/src$ touch ptopic.cpp
打开.cpp文件并粘贴代码
lzw08@ubuntu:~/ros_ws/src/topic/src$ gedit ptopic.cpp
#include <iostream>
#include <ros/ros.h>
#include "std_msgs/String.h"
using namespace std;
int main(int argc, char *argv[])
{
string nodeName = "ptopic";
string topicName = "topic";
ros::init(argc, argv, nodeName);
ros::NodeHandle node;
const ros::Publisher &publisher = node.advertise<std_msgs::String>(topicName,1000);
int index = 0;
ros::Rate rate(1);
while(ros::ok())
{
std_msgs::String msg;
msg.data = "智能机器人实验室 XQ " + to_string(index);
publisher.publish(msg);
//ROS_INFO("发布的数据是:",msg.data);
cout << msg.data << endl;
rate.sleep();
index++;
}
return 0;
}
5.创建话题订阅者的.cpp文件:stopic.cpp
lzw08@ubuntu:~/ros_ws/src/topic/src$ touch stopic.cpp
打开.cpp文件并粘贴代码
lzw08@ubuntu:~/ros_ws/src/topic/src$ gedit stopic.cpp
#include "ros/ros.h"
#include <iostream>
#include "std_msgs/String.h"
using namespace std;
void topicCallback(const std_msgs::String::ConstPtr &msg)
{
cout <<"订阅的机器人是" +(*msg).data << endl;
}
int main(int argc, char **argv)
{
string nodeName = "stopic";
string topicName = "topic";
ros::init(argc, argv, nodeName);
ros::NodeHandle node;
const ros::Subscriber &subscriber = node.subscribe(topicName, 1000, topicCallback);
ros::spin();
return 0;
}
6、回到上级目录更改编译规则
lzw08@ubuntu:~/ros_ws/src/topic/src$ cd ..
lzw08@ubuntu:~/ros_ws/src/topic$ gedit CMakeLists.txt
1)第5行的注释打开:
2)第136行注释打开,并改为下图:
因为写了两个.cpp 文件,所以将改完之后的136行复制一遍粘贴到137行并修改:
3)第149~151行的注释打开,并修改:
同样,因为写了两个.cpp 文件,所以将这三行复制一下,粘贴到第152行,并修改:
7、回到工作空间编译
lzw08@ubuntu:~/ros_ws/src/topic$ cd ~/ros_ws
lzw08@ubuntu:~/ros_ws$ catkin_make
8、编译完成后就可以运行了
1)同样,运行节点前要先将主节点(roscore)运行起来
打开一个新的终端
lzw08@ubuntu:~$ roscore
然后这个终端就可以放在一边不管了。
2)打开两个新的终端,分别运行ptopic.cpp和stopic.cpp
运行前都要进入到工作空间内,配置好环境,才能运行
lzw08@ubuntu:~$ cd ros_ws //进入工作空间
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash // 配置环境
lzw08@ubuntu:~/ros_ws$ rosrun topic ptopic //运行ptopic.cpp
lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun topic stopic
9、如果你先运行stopic后运行ptopic,会发现stopic运行之后没现象
其实,stopic已经运行起来了,不过它作为话题的订阅者,发布者还没发布话题,所以它订阅不到话题,也就显示不了内容了。
10、利用qt的可视化工具可以看到发布者、订阅者以及话题之间的关系
lzw08@ubuntu:~/ros_ws$ rosrun rqt_graph rqt_graph
11、qt还有一个工具可以模拟发布者发布话题,此时只需运行stopic而无需运行ptopic
lzw08@ubuntu:~/ros_ws$ rosrun rqt_publisher rqt_publisher
选择话题名,点击右边绿色的+号,然后勾选上即可
通过下拉箭头还可以自定义要发布的内容,上图我键入了111111