一、创建msg文件
(1)在自定义功能包下,创建msg文件夹,并在msg文件夹下创建msg文件,编写文件内容,如个人信息:姓名 身高 体重
(2)保存msg文件后,打开与功能包同级的package.xml文件,修改依赖:
其中,message_generation是编译依赖,若出错则编译出现问题,message_runtime是运行依赖,若出错,则程序运行报错。
(3)打开与功能包同级的CMakeLists.text文件,从上往下修改与message有关的代码。首先添加依赖:
再修改文件名:
去掉注释:
添加依赖:
保存后,进行编译:
编译成功。
二、创建发布文件
(1)配置头文件,在工作空间devel的include文件夹下打开终端,在终端输入指令:
pwd
复制终端输出的文件路径,打开.vscode文件夹下的c_cpp_properties.json文件,将文件路径复制进“includePath”中:
可以将include/后改为“**”,意思是包含include文件夹下所有文件:
(2)编写发布程序。在功能包的src文件夹下新建一个.cpp文件,写入发布程序:
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
/*
发布方:发布人的消息
1.包含头文件
#include "plumbing_pub_sub/person.h"
2.初始化ROS节点
3.创建ROS节点句柄
4.创建发布者对象
5.编写发布逻辑,发布数据
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化ROS节点
ros::init(argc,argv,"Laoshi");
//3.创建ROS节点句柄
ros::NodeHandle nh;
//4.创建发布者对象
ros::Publisher pub = nh.advertise<plumbing_pub_sub::person>("liaotian",10);
//5.编写发布逻辑,发布数据
//(1)创建被发布的数据
plumbing_pub_sub::person person;
person.name = "张三";
person.age = 0;
person.height = 1.68;
//(2)设置发布频率
ros::Rate rate(1);
//(3)循环发布数据
while(ros::ok()){
//修改数据
person.age += 1;
//核心:数据发布
pub.publish(person);
ROS_INFO("发布的消息:%s,%d,%.2f",person.name.c_str(),person.age,person.height);
//休眠
rate.sleep();
//建议
ros::spinOnce();
}
return 0;
}
(3)开与功能包同级的CMakeLists.text文件,修改文件名:
添加文件依赖:
(4)保存后编译:
(5)打开终端,先执行roscore,配置环境后执行文件:
(6)为了更加直观,可以将输出结果打印在屏幕上,在数据发布处添加一行代码:
ROS_INFO("发布的消息:%s,%d,%.2f",person.name.c_str(),person.age,person.height);
再次运行:
运行成功,可以看见输出结果打印在屏幕上,无问题。
三、创建订阅文件
(1)在功能包src文件夹下创建.cpp文件命名为demo04_sub_person.cpp,编写订阅文件代码:
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
/*
订阅方:订阅者的消息
1.包含头文件
#include "plumbing_pub_sub/person.h"
2.初始化ROS节点
3.创建ROS节点句柄
4.创建订阅者对象
5.处理订阅的数据
6.调用spin()函数
*/
void doPerson(const plumbing_pub_sub::person::ConstPtr& person){
ROS_INFO("订阅人的信息:%s,%d,%.2f",person->name.c_str(),person->age,person->height);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ROS_INFO("订阅方实现:");
// 2.初始化ROS节点
ros::init(argc,argv,"jiazhang");
// 3.创建ROS节点句柄
ros::NodeHandle nh;
// 4.创建订阅者对象
ros::Subscriber sub = nh.subscribe("liaotian",10,doPerson);
// 5.处理订阅的数据
// 6.调用spin()函数
ros::spin();
return 0;
}
(2)开与功能包同级的CMakeLists.text文件,修改文件名:
(3)保存后编译,编译无问题后,打开终端,运行roscore,配置环境,运行订阅程序和发布程序:
运行成功。