zoukankan      html  css  js  c++  java
  • 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

    截图

     

     实时传送信息

  • 相关阅读:
    vue-cli3搭建可视化项目架构
    select框修改默认样式
    修改checkbox的默认样式
    input和textarea修改placehold的文字颜色
    checkbox更改默认样式,以及选中文字也可以选中checkbox
    自封装 ajax 函数,ajax原理
    git@github.com: Permission denied (publickey)
    EAS webservice安全模式
    DB2 根据id查表
    office web apps server安装
  • 原文地址:https://www.cnblogs.com/gjianli/p/15635398.html
Copyright © 2011-2022 走看看