ROS消息包
ROS消息包分为
std_msgs:基础数值类型
common_msgs:常规消息包,与应用密切相关
一、ROS消息包
可以在网址中查找需要的消息包
https://index.ros.org/
1、ROS标准消息包std_msgs
2、ROS常规消息包common_msgs
3、ROS常规消息包geometry_msgs几何消息包
4、ROS常规消息包sensor_msgs传感器消息包
二、自定义消息类型
生成自定义消息的步骤:
1.创建新软件包xx_msgs,依赖项roscpp、 rospy、 std_msgs 、***message_generation、message_runtime***【消息包也是软件包,以msg结尾来区分】
2.软件包添加msg目录,新建自定义消息文件,以.msg结尾。
3.在CMakeLists.txt中,将新建的.msg文件加入add_message_files()
4.在CMakeLists.txt中,去掉generate_messages()注释符号,将依赖的其他消息包名称添加进去。
5.在CMakeLists.txt中,将 message_runtime 加入 catkin_package()的CATKIN DEPENDS。
6.在package.xml中,确认message_generation、message_runtime都加入依赖项中<build_depend>和<exec_depend>中编译软件包,生成新的自定义消息类型
创建信息的软件包时,要添加message_generation、message_runtime
catkin_create_pkg new_msgs roscpp rospy std_msgs message_generation message_runtime
在功能包下src新建msg/new.msg
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d749113ac9004fe08b04ea9f1df6c2d5.png
修改CMakeLists.txt,=,加入新建消息
## Generate messages in the 'msg' folder
add_message_files(
FILES
new.msg
)
新的消息类型需要依赖的其他消息包列表,string是std_msgs中的数据类型
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
依赖的软件包能够在启动的时候使用新定义的消息类型
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES qq_msg
CATKIN_DEPENDS message_generation message_runtime roscpp rospy std_msgs
# DEPENDS system_lib
)
在package.xml中,确保message_generation、message_runtime都加入依赖项中<build_depend>和<exec_depend>中编译软件包
编译后,可查看消息列表rosmsg
三、自定义类型在C++节点中的应用
1、在节点代码中,先include新消息类型的头文件
2、在发布或订阅话题的时候,将话题中的消息类型设置为新的消2息类型o
3、按照新的消息结构,对消息包进行赋值发送或读取解析
4、在CMakeList.txt文件的find_package()中,添加新消息包名称作为依赖项。
5、在节点的编译规则中,添加一条add dependencies0,将新消息软件包名称_generate messages_cpp作为依赖项。
6、在package.xml中,将新消息包添加到和中夫
7、运行 catkin make 重新编译
修改发布者节点的消息发布类型
chao_node.cpp
#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("begin 1\n");
ros::NodeHandle n;
ros::Publisher chao_pub = n.advertise<qq_msgs::carry>("kuaishangche", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
while(ros::ok())
{
printf("Start 2\n");
qq_msgs::carry msg;
msg.grade = "wangzhe";
msg.star = 50;
msg.data = "machao,daifei";
chao_pub.publish(msg);
loop_rate.sleep();
}
return 0;
}
修改chao_node的编译规则
使其先去编译新的消息包,然后再编译节点
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
new_msgs
)
添加节点编译的依赖项
add_dependencies(chao_node new_msgs_generate_messages_cpp)
修改package.xml
在package.xml中,确认new_msgs都加入依赖项中<build_depend>和<exec_depend>中
修改订阅者节点的消息接收类型
ma_node.cpp
#include <ros/ros.h>
#include "std_msgs/String.h"
#include <qq_msgs/carry.h>
// 接收到订阅的消息后,会进入消息回调函数
void chao_Callback(qq_msgs::carry msg)
{
ROS_INFO(msg.grade.c_str());
ROS_INFO("%d",msg.star);
ROS_INFO(msg.data.c_str());
}
void yao_Callback(std_msgs::String msg)
{
ROS_INFO(msg.data.c_str());
}
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "ma_node");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber,订阅名为kuaishangche的topic,注册回调函数 InfoCallback
ros::Subscriber ma_sub = n.subscribe("kuaishangche", 10, chao_Callback);
ros::Subscriber yao_sub = n.subscribe("daiwo", 10, yao_Callback);
// 循环等待回调函数
while(ros::ok())
{
//printf("9\n");
ros::spinOnce();
}
return 0;
}
修改ma_node的编译规则,添加节点编译的依赖项
修改package.xml
在package.xml中,确认new_msgs都加入依赖项中<build_depend>和<exec_depend>中