一、目标
编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布自定义消息,订阅方订阅自定义消息并将消息内容打印输出。
二、分析
在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:
- 发布方
- 接收方
- 数据(此处为自定义消息)
流程:
- 编写发布方实现;
- 编写订阅方实现;
- 编辑配置文件;
- 编译并执行。
三、实现
0.先配置VSCode(为了代码提示和误抛异常)
这一步也可以不操作,但是最好操作
将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:
获得路径,把路径复制到c_cpp_properties.json 的 includepath属性:
1. 消息发布方的实现
在/src下新建个.cpp文件:
内容:
#include<ros/ros.h>
/* #include<std_msgs/String.h> */
#include<plumbing_pub_sub/Person.h> //刚刚自定义的头文件
#include<sstream>
/*
发布方:发布人的消息
1.包含头文件
2.初始化节点
3.创建ros的节点句柄
4.创建发布者对象
5.编写发布逻辑,发布数据
*/
int main(int argc,char *argv[])
{
setlocale(LC_ALL,"");
// 2.初始化节点
ros::init(argc,argv,"Person_msgs");
// 3.创建ros的节点句柄
ros::NodeHandle nh;
// 4.创建发布者对象
ros::Publisher pub = nh.advertise<plumbing_pub_sub::Person>("LiaoTian",10);
// 5.编写发布逻辑,发布数据
//5.1创建被发布的数据
plumbing_pub_sub::Person person1;
person1.name = "张三";
person1.age = 1;
person1.height = 1.7;
//5.2设置发布的频率
ros::Rate rate(1);
//5.3循环发布出去
while (ros::ok())
{
//修改被发布的数据
person1.age +=1;
//核心:数据发布
pub.publish(person1);
rate.sleep();
//建议回头函数.不写也可以
ros::spinOnce();
}
return 0;
}
配置CMakeList.txt文件:
编译:Ctrl + Shift +B
2.发布方测试
在新的终端里:
wood@wood:~$ cd demoros_ws/
wood@wood:~/demoros_ws$ source ./devel/setup.bash
wood@wood:~/demoros_ws$ rostopic echo LiaoTian