ROS自定义msg类型

ROS自定义msg数组类型

C++版本
1.新建msg文件
在pub_sub_test功能包中创建msg文件夹,在msg文件夹其中新建一个名为test.msg消息类型文件

int32 A
int32 B
int32 C

2.msg类型的使用

定义一个消息发布节点pub_msg.cpp

    #include "ros/ros.h"
    #include "pub_sub_test/test.h" //虽然是test_msg.msg,这里却是.h

    int main(int argc, char *argv[])
    {
    
    

    ros::init(argc, argv, "talker"); //初始化ros,talker 节点名字

    //ros::NodeHandle n;

     //ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 
 
    ros::NodeHandle nh;
    ros::Publisher num_pub = nh.advertise<pub_sub_test::test>("chatter", 10); //话题名可以自己定义,

    pub_sub_test::test num; //定义消息
    ros::Rate rate_loop(10);
    while (ros::ok())
    {
    
    
    static int i;
    i++;
    num.A = i;
    num.B = i;
    num.C = i;
    num_pub.publish(num);
    ros::spinOnce();
    rate_loop.sleep();
    }
    return 0;
    }

定义一个消息订阅节点sub_msg.cpp


#include "ros/ros.h"
#include "pub_sub_test/test.h" //虽然是test_msg.msg,这里却是.h
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>   

    void messageCallback(const pub_sub_test::test::ConstPtr& msg)
    {
    
    
     //ROS_INFO(“I heard: A=%d,B=%d,C=%d sum=[%d]”,msg->A,msg->B,msg->C,msg->A+msg->B+msg->C);
    //这里只做求和,表示简单的处理
     std::cout<<msg->A<<std::endl;
    }

    int main(int argc, char **argv)
    {
    
    
   
   ros::init(argc, argv, "listener");//初始化ros 节点名listener

    ros::NodeHandle n;

    ros::Subscriber sub = n.subscribe("chatter", 10, messageCallback);

    ros::spin(); //一直授权订阅
    return 0;
    }

  1. 修改CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(pub_sub_test)
find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  rospy
  std_msgs
  geometry_msgs 
)
add_message_files(FILES
  test.msg
)
generate_messages(DEPENDENCIES
  std_msgs
)
catkin_package(
  CATKIN_DEPENDS
  message_runtime
#  INCLUDE_DIRS include
#  LIBRARIES pub_sub_test
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)
include_directories(
  include ${
    
    catkin_INCLUDE_DIRS}
# include
  ${
    
    catkin_INCLUDE_DIRS}
)
add_executable(pub_string src/pub_string.cpp)
target_link_libraries(pub_string ${
    
    catkin_LIBRARIES})
add_executable(sub_string src/sub_string.cpp)
target_link_libraries(sub_string ${
    
    catkin_LIBRARIES})

set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")


python 版本

1.新建msg文件
在tsst功能包中创建msg文件夹,在msg文件夹其中新建一个名为test.msg消息类型文件

float32[] data

2.msg类型的使用

定义一个消息发布节点talker.py

#!/usr/bin/env python2
# -*- coding: UTF-8 -*-

import rospy
#from后边是自己的包.msg,也就是自己包的msg文件夹下,test是我的msg文件名test.msg
from tsst.msg import test

def talker():
    pub = rospy.Publisher('chatter', test, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
   		#temp为到时候要用于传输的信息
        temp = [1, 2]
        #这里test就像构造函数般使用,若有多个msg,那么写成test(a,b,c,d...)
        rospy.loginfo(test(temp))
        pub.publish(test(temp))
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

定义一个消息订阅节点listener.py

#!/usr/bin/env python2
# -*- coding: UTF-8 -*-

import rospy
from tsst.msg import test

def callback(data):
#传过来的所有msg为data,其中data.后边的变量看msg文件写,比如我的是float32[] data,那么我就是data.data
    rospy.loginfo(data.data)

def listener():

    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('chatter', test, callback)

    rospy.spin()

if __name__ == '__main__':
    listener()

猜你喜欢

转载自blog.csdn.net/zhngyue123/article/details/108004543