ROS中的自定义消息
生成自定义消息
1.创建 qq_msgs 软件包,并添加依赖相 message_generation message_runtime
2.软件包添加msg目录,新建自定义消息文件,以 .msg 结尾 (文件夹的名称只能是msg,消息文件一定以大写开头)
3.在CMakeLists.txt中,检查message_generation message_runtime 是否存在
4.在CMakeLists.txt中,将新建的.msg 文件加入add_message_files()
5.在CMakeLists.txt中,去掉generation_message()注释符号,将依赖的其他消息包的名称添加进去
6.在CMakeLists.txt中,将 message_runtime 加入 catkin_package() 的CATKIN_DEPENDS
7.在package.xml中,将message_generation 、message_runtime加入<build_depend>和<exec_depend>
8.编译软件包,生成新的消息类型,并使用 rosmsg show 软件包/消息文件
使用自定义类型
1.在节点代码中,先include新消息类型的头文件
2.在发布或者订阅话题的时候,将话题中的消息类型设置为新的消息类型
3.按照新的消息结构,对消息包进行赋值发送或读取解析
发布者
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <qq_msgs/Carry.h>int main(int argc, char *argv[])
{ros::init(argc,argv,"wave_node"); //初始化printf("Hello World\n");//创建节点句柄ros::NodeHandle nh;ros::Publisher pub = nh.advertise<qq_msgs::Carry>("xiao_qiao_dai_fei_qun",10);//生成频率对象,可以控制话题发布的频率ros::Rate rate(10); //一秒发布10次while(ros::ok()){printf("我要开始刷屏了!\n");//生成一个消息包qq_msgs::Carry msgs;msgs.grade = "王者";msgs.star = 50;msgs.data = "大刘求带飞";//发布消息pub.publish (msgs);//进行短时间的阻塞rate.sleep();}return 0;
}
订阅者
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <qq_msgs/Carry.h>//回调函数
void qiao_callback(qq_msgs::Carry msg)
{/*printf(msg.data.c_str());printf("\n");*///能够显示接受信息时间的函数ROS_WARN(msg.grade.c_str());ROS_WARN("%d 星",msg.star);ROS_INFO(msg.data.c_str());}void yao_callback(std_msgs::String msg)
{//将消息打印成黄色ROS_WARN(msg.data.c_str());
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"qioa_node");ros::NodeHandle handle;ros::Subscriber sub = handle.subscribe("xiao_qiao_dai_fei_qun",10,qiao_callback);ros::Subscriber sub2 = handle.subscribe("fu_zhu_qiu_dai_qun",10,yao_callback);while (ros::ok){ros::spinOnce();}return 0;
}
4.在CMakeList.txt文件的find_package()中,添加新消息包名称作为依赖项
5.在节点的编译规则中,添加一条add_dependencies(),将 新消息软件包名称_generate_message_cpp
6.在package.xml中,将新消息包添加到<build_depend>和<exec_depend>中去
7.订阅者和发布者一样