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库来构建矩阵进行数据处理。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值