常见的消息包
消息包定义一般如下👇
(1)创建包和依赖项
(2)在新建的qq_msgs的包新建msgs的文件夹,在该文件夹里面新建Carry.msg类型的文件。
其实,Carry.msg就是你自己定义的消息类型,属于qq_msgs包下面的。
(3)在对应CMakeList.txt文件下查看如下信息
- 查看依赖项是否都满足
- (4)选中如下文件
- 取消注释
因为我们只需要使用string 还有int64类型的数据组成我们的新的消息包,所以就只需要包括标准消息包就可以了。
保存即可
(5)打开package.xml文件
(6)保存 编译
使用新的消息包
chao_node节点文件如下
#include<ros/ros.h>
#include<std_msgs/String.h>
#include<qq_msgs/Carry.h> //引进我们自己的消息包
int main(int argc, char *argv[])
{
ros::init(argc, argv, "chao_node");
printf("小马同学,hello welcome coming Ros world! \n ");
// 建立节点句柄
ros::NodeHandle nh;
//建立发布者
ros::Publisher pub=nh.advertise<qq_msgs::Carry>("play_game_topic",10);
//控制循环次数,ros系统给我自带了控制语句,不用我们自己写睡眠函数
ros::Rate loop_rate(10); // publish 10 times of per second
while(ros::ok())
{
printf("xiaoma will carry !\n");
//开始定义标准消息包、
qq_msgs::Carry msg;
msg.grade = "hornor";
msg.star=30;
msg.data="please come on!\n";
//给发布者发布
pub.publish(msg);
loop_rate.sleep();//调用loop_rate的sleep函数,让其产生短暂的阻塞
}
return 0;
}
ma_node的代码
#include<ros/ros.h>
#include<std_msgs/String.h>
#include<qq_msgs/Carry.h> //引进我们自己的消息包
void xiaoli_callback(qq_msgs::Carry msg)
{
ROS_INFO(msg.grade.c_str());
ROS_INFO("%lld", msg.star);
ROS_INFO(msg.data.c_str());
}
void play_game_callback(qq_msgs::Carry msg)
{
ROS_WARN(msg.data.c_str());//这个输出语句只是把输出内容变成还黄色
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "ma_node");
printf("马同学,我将接受发布者的消息! \n ");
// 建立节点句柄
ros::NodeHandle nh;
//建立订阅者1
ros::Subscriber sub=nh.subscribe("xiang_he_xiao_ma_wan_you_xi",10,xiaoli_callback);
//建立订阅者2不能和第一个名字一样
ros::Subscriber sub2=nh.subscribe("play_game_topic",10,play_game_callback);
while(ros::ok())
{
ros::spinOnce();
}
return 0;
}
他的配置文件格式与chao_node一样,分别是CMakeList.txt文件和package.xml文件。
运行结果: