Ros
6 May 2023

ROS Topic and Message

ROS Learning Notes

ROS Learning Notes 04

image

Keypoints

  • Customized msg type

image

image

Customized msg type

  • Must in work_space/src/topic_name/msg folder
  • Example: /home/lshi/rosleaning/src/topic_learning/Person.msg
    • MSG file definition:
      string name
      uint8 sex
      uint8 age
      
      uint8 unknown = 0
      uint8 male = 1
      uint8 female = 2
      
    • Add dependency in package.xml:
      <build_depend>message_generation</build_depend>
      <exec_depend>message_runtime</exec_depend>
      
    • Add compilation route in CMakeLists.txt:
      message_generation # find_package section
      
      # `Declare ROS messages, services and actions` section
          
      add_message_files(FILES Person.msg)
      generate_messages(DEPENDENCIES std_msgs)
      
      # catkin specific configuration section
      CATKIN_DEPENDS message_runtime ...  
      
    • Compile in work_space to generate the msg head file in devel/include/topic_name/Person.h:
      cd ~/roslearning
      catkin_make
      
  • Publisher and subscriber
    • publisher
      # include <ros/ros.h>
      # include "topic_learning/Person.h"
      
      int main(int argc, char **argv){
      
          ros::init(argc, argv, "person_publisher");
          ros::NodeHandle nh;
          ros::Publisher person_info_pub = nh.advertise<topic_learning::Person>("/person_info", 10);
          ros::Rate loop_rate(1);
      
          int count = 0;
          while (ros::ok()){
              topic_learning::Person person_msg;
              person_msg.name = "Tom";
              person_msg.age = 18;
              person_msg.sex = topic_learning::Person::male;
      
              person_info_pub.publish(person_msg);
              ROS_INFO("Publish Person Info: name:%s age:%d sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);
      
              loop_rate.sleep();
          }
      }
      
      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      import rospy
      from topic_learning.msg import Person
      
      def person_publisher():
        rospy.init_node('person_publisher', anonymous=True)
        person_info_pub = rospy.Publisher('/person_info', Person, queue_size=10)
        rate = rospy.Rate(10)
      
        while not rospy.is_shutdown():
          person_msg = Person()
          person_msg.name = "Tom"
          person_msg.age = 18
          person_msg.sex = Person.male
      
          person_info_pub.publish(person_msg)
          rospy.loginfo("Publish person message[%s, %d, %d]", person_msg.name, person_msg.age, person_msg.sex)
      
          rate.sleep()
      
      if __name__ == '__main__':
        try:
          person_publisher()
        except rospy.ROSInterruptException:
          pass
      
    • subscriber
        #include <ros/ros.h>
        #include "topic_learning/Person.h"
      
        void personInfoCallback(const topic_learning::Person::ConstPtr& msg){
            ROS_INFO("Subscribe Person Info: name:%s age:%d sex:%d", msg->name.c_str(), msg->age, msg->sex);
        }
      
        int main(int argc, char **argv){
      
            ros::init(argc, argv, "person_subscriber");
            ros::NodeHandle nh;
            ros::Subscriber person_info_sub = nh.subscribe("/person_info", 10, personInfoCallback);
            ros::spin();
            return 0;
        }
      
        #!/usr/bin/env python
        # -*- coding: utf-8 -*-
      
        import rospy
        from topic_learning.msg import Person
      
        def personInfoCallback(msg):
          rospy.loginfo("Subscribe Person Info: name:%s age:%d sex:%d", msg.name, msg.age, msg.sex)
      
        def person_subscriber():
          rospy.init_node('person_subscriber', anonymous=True)
          rospy.Subscriber('/person_info', Person, personInfoCallback)
          rospy.spin()
      
        if __name__ == '__main__':
          person_subscriber()
      
      
    • Compile
      # add dependency in CMakeLists.txt
      add_executable(person_publisher src/person_publisher.cpp)
      target_link_libraries(person_publisher ${catkin_LIBRARIES})
      add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
      
      add_executable(person_subscriber src/person_subscriber.cpp)
      target_link_libraries(person_subscriber ${catkin_LIBRARIES})
      add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
      

Tags:
0 comments