• ROS 自定义 msg 类型及发布消息笔记


    本文所用代码为个人独自编写仅用于测试的代码,实现效果为:循环打印某位学生的成绩及其评价。

    创建工作空间

    首先打开终端 ( Ctrl + Alt + T),创建工作文件夹 (catkin_ws 为工作文件夹名称,可以自定义):mkdir -p ~/catkin_ws/src

    输入后,我们可以在文件管理的主目录中,找到一个名为 catkin_ws 的文件夹,这个就是我们刚才创建的工作空间:

    进入 src 文件夹:cd ~/catkin_ws/src/

    使当前文件夹具有 ros 工作空间属性:catkin_init_workspace

    然后返回工作空间主目录:cd ~/catkin_ws/

    进行编译:catkin_make

    编译完成后,你再打开 catkin_ws 文件夹,你会发现多出了很多的文件:

    为了方便后期使用,我们需要添加 source:echo "source ~/catkin_ws/devel/setup.zsh" >> ~/.zshrc

    我用的终端是 zsh,如果你的终端是 bash 的话,把 .zsh 改为 .bash.zshrc 改为 .bashrc即可

    创建及配置 msg 文件

    首先进入 src 文件夹:cd ~/catkin_ws/src/

    创建一个功能包,其中的 ros_topic 可以自定义名称:catkin_create_pkg ros_topic roscpp rospy std_msgs

    进入该功能包:cd ~/catkin_ws/src/ros_topic/

    在该功能包下,我们创建一个 msg 文件夹,这个文件夹用来存放 .msg 文件:mkdir msg

    进入该 msg 文件夹:cd ~/catkin_ws/src/ros_topic/msg/

    创建 .msg 文件,score可自定义:gedit score.msg

    在弹出的框中,粘贴如下测试代码并保存:

    string student_name
    float32 score
    string evaluation
    
    string good = "good"
    string bad  = "bad"
    

    好了,到这一步,我们已经把 msg 文件创建好了,代码也输入进去了,现在需要修改 package.xml 文件进行相应的配置:gedit ~/catkin_ws/src/ros_topic/package.xml

    <exec_depend>std_msgs</exec_depend> 代码下面粘贴如下代码并保存:

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

    粘贴完成后效果如图:

    然后我们再对 CMakeLists.txt 文件进行相应的配置:gedit ~/catkin_ws/src/ros_topic/CMakeLists.txt

    在弹出的框中,找到 find_package,添加 message_generation

    find_package(catkin REQUIRED COMPONENTS
      roscpp
      rospy
      std_msgs
      message_generation
    )
    

    找到已被注释的 add_message_files,删掉它前面的注释符号,并修改为如下:

    add_message_files(
      FILES
      score.msg
    )
    

    同样的,找到已被注释的 generate_messages,删掉它前面的注释符号,并修改为如下:

    generate_messages(
      DEPENDENCIES
      std_msgs
    )
    

    找到 catkin_package 并修改为如下:

    catkin_package(
      CATKIN_DEPENDS
      message_runtime
    #  INCLUDE_DIRS include
    #  LIBRARIES ros_topic
    #  CATKIN_DEPENDS roscpp rospy std_msgs
    #  DEPENDS system_lib
    )
    

    创建及配置发布者 Publisher

    我们开始新建 cpp 文件:gedit ~/catkin_ws/src/ros_topic/src/publisher_score.cpp

    在弹出的框中,粘贴如下测试代码并保存:

    #include "ros/ros.h"
    #include "ros_topic/score.h"
    
    int main(int argc, char **argv) {
    
        // 初始化 ROS 节点
        ros::init(argc, argv, "publisher_score");
        
        // 创建节点句柄
        ros::NodeHandle n;
    
        // 创建一个 Publisher
        ros::Publisher score_pub = 
            n.advertise<ros_topic::score>("/score", 10);
    
        // 设置一个循环 1Hz
        ros::Rate loop_rate(1);
    
        while (ros::ok()) {
            
            // 初始化 learning_topic::score 类型的消息
            ros_topic::score score_msg;
    
            // 创建一个人物以及他的成绩
            score_msg.student_name = "LiHua";
            score_msg.score = 90.5;
            score_msg.evaluation = ros_topic::score::good;
    
            // 发布消息
            score_pub.publish(score_msg);
            ROS_INFO("%s got %.1f points in the exam and was rated as %s", 
                score_msg.student_name.c_str(),
                score_msg.score, 
                score_msg.evaluation.c_str());
    
            // 按照循环频率延时
            loop_rate.sleep();
    
        }
        return 0;
    }
    

    现在,我们打开文件管理器,打开 /主目录/catkin_ws/src/ros_topic/src,就可以看到刚才创建的 cpp 文件了:

    接下来,我们再次配置 CMakeLists.txt 文件:gedit ~/catkin_ws/src/ros_topic/CMakeLists.txt

    下拉到最后一行,添加如下代码并保存:

    add_executable(publisher_score src/publisher_score.cpp)
    add_dependencies(publisher_score ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    target_link_libraries(publisher_score ${catkin_LIBRARIES})
    

    到此,我们就全部配置完毕,先返回工作空间主目录下:cd ~/catkin_ws/

    进行编译:catkin_make

    编译完成后,启动 roscoreroscore

    然后再打开一个终端 ( Ctrl + Alt + T),输入:rosrun ros_topic publisher_score

    就会看到如下效果,那么我们就完成了:

  • 相关阅读:
    redhat安装opencv
    vsftpd的配置与使用
    Redhat 安装编译 Python-2.7.12
    YUM 安装与配置
    docker安装mysql
    高频问题 java8新特性(转载)
    quartz简单实例实现
    java8线程池
    java8多线程不带返回值
    java8多线程带返回值的
  • 原文地址:https://www.cnblogs.com/zhangxiaochn/p/12445511.html
Copyright © 2020-2023  润新知