• ros(5)话题的自定义消息


    1.首先创建msg文件

    在cd ~//catkin_workspace/src/learning_topic/msg/新建person.msg

    string name
    uint8  age
    uint8  sex
     
    uint8 unknown = 0
    uint8 male    = 1
    uint8 female  = 2

    修改package.xml

     

     添加这两句

     <build_depend>message_generation</build_depend>
      <exec_depend>message_runtime</exec_depend>

    修改cmakelists.txt

    find_package(catkin REQUIRED COMPONENTS
      geometry_msgs
      roscpp
      rospy
      std_msgs
      turtlesim
      message_generation ##查找依赖包
    )
     
    ##生成消息
    add_message_files(
      FILES
      Person.msg
    )
     
    generate_messages(
      DEPENDENCIES
      std_msgs
    )
     
    ##添加依赖包
    catkin_package(
    #  INCLUDE_DIRS include
    #  LIBRARIES learning_topic
       CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
    #  DEPENDS system_lib
    )

    编译

    catkin_make

    会在/devel/include/<package_name>/person.h文件

    2.创建发布者和订阅程序

    person_publisher.cpp

    /**
     * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person
     */
     
    #include <ros/ros.h>
    #include "learning_topic/Person.h"
     
    int main(int argc, char **argv)
    {
        // ROS节点初始化
        ros::init(argc, argv, "person_publisher");
     
        // 创建节点句柄
        ros::NodeHandle n;
     
        // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
        ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
     
        // 设置循环的频率
        ros::Rate loop_rate(1);
     
        int count = 0;
        while (ros::ok())
        {
            // 初始化learning_topic::Person类型的消息
            learning_topic::Person person_msg;
            person_msg.name = "Tom";
            person_msg.age  = 18;
            person_msg.sex  = learning_topic::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();
        }
     
        return 0;
    }

    person_subscriber.cpp

    /**
     * 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person
     */
     
    #include <ros/ros.h>
    #include "learning_topic/Person.h"
     
    // 接收到订阅的消息后,会进入消息回调函数
    void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
    {
        // 将接收到的消息打印出来
        ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", 
                 msg->name.c_str(), msg->age, msg->sex);
    }
     
    int main(int argc, char **argv)
    {
        // 初始化ROS节点
        ros::init(argc, argv, "person_subscriber");
     
        // 创建节点句柄
        ros::NodeHandle n;
     
        // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
        ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
     
        // 循环等待回调函数
        ros::spin();
     
        return 0;
    }

    修改

    cmakelists

    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)

    编译

    catkin_make

    运行

    roscore
    
    rosrun topic_publisher person_publisher
    
    rosrun topic_publisher person_subscriber

    截图

     

     实时传送信息

  • 相关阅读:
    pyhon简单比较文本相似度的方法
    MongoDB数据的导入、导出、备份与恢复
    django实现注册、登录小系统
    nginx+uwsgi部署django的简单介绍
    python操作Excel的几种方式
    Python的Pexpect的简单使用
    JVM之类加载
    Java中的绑定
    JVM之GC
    JVM之内存管理
  • 原文地址:https://www.cnblogs.com/gjianli/p/15635398.html
Copyright © 2020-2023  润新知