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

    截图

     

     实时传送信息

  • 相关阅读:
    logback 打印mybatis sql mybatis 日志打印sql语句和返回结果
    SpringBoot使用logback输出日志并打印sql信息 --经典---
    Logback设置SQL参数打印
    springboot2.X整合mybatis
    异常解决:java.lang.IllegalStateException: Failed to introspect Class
    springboot 启动报错 java.lang.IllegalStateException: Failed to introspect annotated methods on class org
    数据库相关中间件介绍
    QWaitCondition 的正确使用方法(通过 mutex 把有严格时序要求的代码保护起来,同时把 wakeAll() 也用同一个 mutex 保护起来)
    对生产者和消费者问题的另一个解决办法是使用QWaitCondition(封装好了wakeOne,wakeAll,而且与QReadWriteLock对接,几乎是万能的办法)
    Linux定时器的使用(三种方法)
  • 原文地址:https://www.cnblogs.com/gjianli/p/15635398.html
Copyright © 2011-2022 走看看