Part2.1.3 话题通信的实践 自定义消息类型(C++)

本文档介绍了ROS中创建自定义消息类型的过程,包括在msg文件夹下定义消息结构,配置XML和CMake文件。接着展示了发布方和订阅方的程序设计,发布方通过循环发布带有姓名和年龄信息的消息,而订阅方接收消息并打印。重点在于理解ROS中的消息传递机制和回调函数的应用。
摘要由CSDN通过智能技术生成

1 组织要发布的数据

在功能包的src目录下,msg文件夹,在msg文件夹下新建msg类型的文件
在这里插入图片描述
消息类型格式

string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1 
uint8 female = 2

.xml配置文件
在这里插入图片描述
cmake 配置文件


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.发布方程序

#include "ros/ros.h"
#include "sub_pub/Person.h"

int main(int argc,char*argv[])
{

 setlocale(LC_ALL,"");
 ros::init(argc,argv,"my_puber");
 ros::NodeHandle nh;
 ros::Publisher pub=nh.advertise<sub_pub::Person>("mychatter",100);
 ros::Rate r(1);
 ros::Duration(3).sleep();
  int count=0;
  sub_pub::Person msg;
  std::cin >> msg.name;
  msg.age=1;

  while(ros::ok)  

  {
  
   pub.publish(msg);
   msg.age+=1;
   ROS_INFO("msg_name = %s   msg_age= %d ",msg.name.c_str(),msg.age);
      r.sleep();
      ros::spinOnce();
  }


    return 0;
}

3.订阅方程序设计

#include "ros/ros.h"
#include "sub_pub/Person.h"/*自定义消息类型的路径*/

void chattercallback(const sub_pub::Person::ConstPtr& msg) /*回调函数 传入一个指针*/
{


    ROS_INFO("i heard NAME =%s age= %d",msg->name.c_str(),msg->age);
    
}

int main(int argc,char *argv[])
{
   ros::init(argc,argv,"my_lister"); /*节点初始化*/
   ros::NodeHandle n;
   ros::Subscriber sub=n.subscribe("mychatter",100,chattercallback); /*订阅节点,话题 缓冲区的消息数 回调函数*/
   ros::spin(); /*当函数运行到rosspin,会进入到缓冲区对缓冲区的第一个数据进行处理,调用回调函数处理数据,并且rosspin进入后除非rosshutdown,不然就会一直循环,处理一次缓存中的数据就调用一次回调函数,rosspinonce是进入一次回调函数然后退出*/



    return 0;
}


自定义消息类型的发布主要是订阅方和发布方的头文件有所不同,一定要把自定义的消息类型包含到月头文件里去。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蓑烟雨荏平生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值