目录
前言
主要是实现自定义消息的话题通信,发布方的实现,其实相关流程与前面的没啥区别。
在编程之前,要先对vscode配置以下,主要是为了避免误抛出异常,主要的目的就是让vscode知道头文件的位置。将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/opt/ros/noetic/include/**",
"/home/liuxin/liuxin/src/helloworld/include/**",
"/home/liuxin/DEMON3_WS/src/plumbing_pub_sub/include/**",//新添加的
"/usr/include/**"
],
"name": "ROS"
}
],
"version": 4
}
怎么知道他(person.h编译自动生成的)的具体文件呢?
Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。
执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。
一、发布方实现
流程:1、包含头文件
2、初始化ROS节点
3、创建节点句柄
4、创建发布者对象
5、编写发布逻辑、发布数据
1、包含头文件
//1.包含头文件;
#include "ros/ros.h" //必须有的
#include "plumbing_pub_sub/Person.h" //自定义消息的头文件
2、初始化ROS节点
setlocale(LC_ALL,"");//防止乱码
//2.初始化 ROS 节点
ros::init(argc,argv,"BanZhuRen");
3、创建节点句柄
//3.创建节点句柄
ros::NodeHandle nh;
4、创建发布者对象
//4.创建发布者对象
ros::Publisher pub = nh.advertise<plumbing_pub_sub::Person>("liaotian",10);
plumbing_pub_sub::Person person;
5、编写发布逻辑,发布数据
//5.编写发布逻辑,发布数据
//先创建发布的消息
person.name = "张三";
person.age = 1;
person.height = 1.73;
//发布的频率
ros::Rate rate(1);
//编写循环,循环中发布消息,这个循环相当于对消息的一个处理。
while (ros::ok())
{ person.age +=1; //person.age = person.age+1 其实和++没区别,但是换成2就有区别了
pub.publish(person); //发布这个消息,消息包含name,age,height三个消息
rate.sleep();
ros::spinOnce();
}
return 0;
}
逐行解析
//先创建发布的消息
person.name = "张三";
person.age = 1;
person.height = 1.73;
类似于自定义消息的各个属性的初始值
//发布的频率
ros::Rate rate(1);
发布的频率
while (ros::ok())
{ person.age +=1; //person.age = person.age+1 其实和++没区别,但是换成2就有区别了
pub.publish(person); //发布这个消息,消息包含name,age,height三个消息
rate.sleep();
ros::spinOnce();
}
return 0;
![点击并拖拽以移动 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==](https://img-blog.csdnimg.cn/2022010704203494408.gif)
消息的处理,节点不死,循环不结束。这个消息的处理只是处理了age。ros::spinOnce() 后者在调用后还可以继续执行之后的程序。
总的程序如下:
/*
发布方实现
1.包含头文件;
2.初始化 ROS 节点
3.创建节点句柄
4.创建发布者对象
5.编写发布逻辑,发布数据
*/
//1.包含头文件;
#include "ros/ros.h" //必须有的
#include "plumbing_pub_sub/Person.h" //自定义消息的头文件
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");//防止乱码
//2.初始化 ROS 节点
ros::init(argc,argv,"BanZhuRen");
//3.创建节点句柄
ros::NodeHandle nh;
//4.创建发布者对象
ros::Publisher pub = nh.advertise<plumbing_pub_sub::Person>("liaotian",10);
plumbing_pub_sub::Person person;
//5.编写发布逻辑,发布数据
//先创建发布的消息
person.name = "张三";
person.age = 1;
person.height = 1.73;
//发布的频率
ros::Rate rate(1);
//编写循环,循环中发布消息,这个循环相当于对消息的一个处理。
while (ros::ok())
{ person.age +=1; //person.age = person.age+1 其实和++没区别,但是换成2就有区别了
pub.publish(person); //发布这个消息,消息包含name,age,height三个消息
rate.sleep();
ros::spinOnce();
}
return 0;
}
![点击并拖拽以移动 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==](https://img-blog.csdnimg.cn/2022010704203494408.gif)
6、运行结果
这里涉及了一个函数rostopic。
-
rostpic echo 指定话题
获取指定话题当前发布的消息
特别注意:
系统内置的msg可以直接用这个语句,因为系统可以自动找到他的一些依赖文件,比如头文件一类的。
但是我们自定义的msg,系统是没办法直接找到的,所以我们需要先进入功能包,然后 source以下,再运行这个指令。cd 功能包名