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

1 组织要发布的数据

在功能包的src目录下,msg文件夹,在msg文件夹下新建msg类型的文件
Part2.1.3 话题通信的实践 自定义消息类型(C++)_第1张图片
消息类型格式

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

.xml配置文件
Part2.1.3 话题通信的实践 自定义消息类型(C++)_第2张图片
cmake 配置文件

Part2.1.3 话题通信的实践 自定义消息类型(C++)_第3张图片
Part2.1.3 话题通信的实践 自定义消息类型(C++)_第4张图片

Part2.1.3 话题通信的实践 自定义消息类型(C++)_第5张图片
Part2.1.3 话题通信的实践 自定义消息类型(C++)_第6张图片

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("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;
}


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


你可能感兴趣的:(ROS学习从0到1,c++,开发语言,后端)