ROS自定义消息---发布数组和整型数据

ROS自定义消息--数组和整型数据

  • 前言
  • 一、ROS中的消息数据格式
  • 二、自定义话题消息
    • 1.新建msg文件
    • 2.编写发布者和接收者程序
  • 总结


前言

ROS自带的消息格式已经包含一维数组,有时候我们需要定义多维数组,以及混合数据类型,这里就用到了自定义消息。


一、ROS中的消息数据格式

可以使用rosmsg show命令来查看:

rosmsg show std_msgs

ROS自定义消息---发布数组和整型数据_第1张图片

二、自定义话题消息

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 
#include 
#include 

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 
#include 
#include 

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自定义消息---发布数组和整型数据_第2张图片
可以看到,订阅者可以正常订阅到发布者发布的消息。

总结

这里仅仅用一个简单的例程来讲述ROS中如何自定义消息格式的数据,通过使用多个一维数组来构成数据格式,使用发布者将数据发送出去,订阅者订阅到数据,之后可以用eigen库来构建矩阵进行数据处理。

你可能感兴趣的:(linux,学习)