ROS自定义消息--数组和整型数据
前言
ROS自带的消息格式已经包含一维数组,有时候我们需要定义多维数组,以及混合数据类型,这里就用到了自定义消息。
一、ROS中的消息数据格式
可以使用rosmsg show
命令来查看:
rosmsg show std_msgs
二、自定义话题消息
1.新建msg文件
在功能包中新建一个msg文件夹,创建自定义的消息,,消息如下(matrix_msg.msg):
int8[] a
int8[] b
int8[] c
int8 x
int8 y
修改CMakeLists.txt文件:
find_package中添加 message_generation
:
find_package(catkin REQUIRED COMPONENTS
...
message_generation
)
增加add_message_files
:
add_message_files(
FILES
matrix_msg.msg
)
catkin_package
增加message_runtime
:
catkin_package(
INCLUDE_DIRS include
# LIBRARIES gazebo_nav
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
修改generate_messages
命令:
generate_messages(
DEPENDENCIES
geometry_msgs
std_msgs # Or other packages containing msgs
)
修改package.xml文件:
增加如下描述:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
修改完成后,进行编译,会产生一个matrix_msg.h
文件,之后使用时引用该头文件即可。
2.编写发布者和接收者程序
发布者程序:
#include <ros/ros.h>
#include <std_msgs/Int8.h>
#include <gazebo_nav/matrix_msg.h>
int main(int argc,char** argv)
{
ros::init(argc,argv,"matrix_test");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<gazebo_nav::matrix_msg>("matrix_test",10);
ros::Rate loop(10);
while (ros::ok())
{
gazebo_nav::matrix_msg msg;
msg.a = {1,2,3};
msg.b = {4,5,6};
msg.c = {7,8,9};
msg.x = 10;
msg.y = 20;
pub.publish(msg);
ros::spinOnce();
loop.sleep();
}
return 0;
订阅者程序代码:
#include <ros/ros.h>
#include <gazebo_nav/matrix_msg.h>
#include <std_msgs/Int8.h>
std::vector<int> v1;
std::vector<int> v2;
std::vector<int> v3;
std::vector<std::vector<int>> v33;
int sub_x = 0;
int sub_y = 0;
void matrix_CB(const gazebo_nav::matrix_msg& msg)
{
ROS_INFO("this is matrix msg sub:");
for(int i=0;i < msg.a.size();i++)
{
v1.push_back(msg.a[i]);
v2.push_back(msg.b[i]);
v3.push_back(msg.c[i]);
}
v33.push_back(v1);
v33.push_back(v2);
v33.push_back(v3);
sub_x = msg.x;
sub_y = msg.y;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
std::cout<<v33[i][j]<<"\t";
}
std::cout<<std::endl;
}
ROS_INFO("sub_x:::::: %d",sub_x);
ROS_INFO("sub_y:::::: %d",sub_y);
}
int main(int argc,char** argv)
{
ros::init(argc,argv,"matrix_test_sub");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("matrix_test",10,matrix_CB);
ros::Rate r(10);
ros::spin();
return 0;
}
修改CMakeLists.txt文件,编译成功后运行。
运行结果:
可以看到,订阅者可以正常订阅到发布者发布的消息。
总结
这里仅仅用一个简单的例程来讲述ROS中如何自定义消息格式的数据,通过使用多个一维数组来构成数据格式,使用发布者将数据发送出去,订阅者订阅到数据,之后可以用eigen库来构建矩阵进行数据处理。