• ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务


    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务

    我使用的虚拟机软件:VMware Workstation 11
    使用的Ubuntu系统:Ubuntu 14.04.4 LTS
    ROS 版本:ROS Indigo


    一. 创建自定义的ROS消息 :(msg

    下面我们来介绍具体步骤:

    1:现在beginner_tutorials软件包中创建一个 msg 文件夹,用来存放我们下面要创建的消息文件:

    $ cd ~/catkin_ws/src/beginner_tutorials
    $ mkdir msg
    $ echo "int64  num" > msg/Num.msg 

    我们来看看上面的命令执行完后得到了什么:

    $ ls msg/
    Num.msg

    打开这个 Num.msg 文件,看看:打开这个 Num.msg 文件,看看:

    $ gedit gedit msg/Num.msg 

    这里写图片描述

    这样就简单的创建了一个消息文件。

    我们具体介绍一下消息( msg ) : msg 文件就是一个描述 ROS 中所有 消息类型 的简单文本。它们可以用来生成不同语言的源代码。

    所以下一步:我们要确保 msg 文件被转换成为 C++Python 或者 其他语言的源代码:

    2:所以,我们要 确保 package.xml 包含一下两条语句。如果没有的话,就添加上这2句话 (完整的 package.xml 文件)

    <build_depend>message_generation</build_depend>
    <run_depend>message_runtime</run_depend> 

    打开 package.xml 文件 :

    aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ ls
    CMakeLists.txt  include  launch  msg  package.xml  scripts  src
    aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ gedit package.xml 

    将上的两代码添加到这个 package.xml 文件里,如下图所示:

    这里写图片描述

    解释:
    message_generation ” 是构建时需要的。
    message_runtime ” 是运行的时候需要的。

    3:编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 find_packag() 函数,增加对 message_generation 的依赖,这样就可以生成消息了。

    打开 CMakeLists.txt 文件:

    aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ ls
    CMakeLists.txt  include  launch  msg  package.xml  scripts  src
    aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ gedit CMakeLists.txt 

    这里写图片描述

    find_package(catkin REQUIRED COMPONENTS
      roscpp
      rospy
      std_msgs
      message_generation
    )

    4:继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 catkin_package() 函数, 添加运行依赖:message_runtime , roscpp , rospy , std_msgs

    这里写图片描述

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

    5: 继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 add_message_files()函数:添加新创建的消息文件: Num.msg

    这里写图片描述

     add_message_files(
        FILES
    #   Message1.msg
    #   Message2.msg
        Num.msg
     )

    6:继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 。通过上一步手动添加完 .msg 文件后,我们要确保 CMake 知道在什么时候重新配置我们的 project 。 确保添加了如下代码: 添加包含 msgs 的软件包依赖

    这里写图片描述

     generate_messages(
       DEPENDENCIES
       std_msgs
     )

    现在,CMakeLists.txt 文件就编写完了。以上 1~6 就是创建消息的所有步骤。

    接下来,编译,就可以生成自己的消息源代码了。


    二. 编译工作空间:

    $ cd ~/catkin_ws
    $ catkin_make

    如何检测创建成果呢:通过 rosmsg show 命令,检查 ROS 是否能够识别消息:

    $ rosmsg show beginner_tutorials/Num
    int64 num
    

    看样子已经成功创建了一个简单的消息。

    所有在 msg 路径下的 .msg 文件都将转换为 ROS 所支持语言的源代码。那么,编译生成的 .msg 消息文件生成的 C++Python 的文件存放在哪个路径里呢:

    生成的 C++ 头文件将会放置在 : ~/catkin_ws/devel/include/beginner_tutorials/

    aobosir@ubuntu:~/catkin_ws/devel/include/beginner_tutorials$ ls
    Num.h

    Python 脚本语言会在 : ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg 目录下创建。

    aobosir@ubuntu:~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg$ ls
    __init__.py  _Num.py

    lisp 文件会出现在 : ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/ 路径下.

    aobosir@ubuntu:~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg$ ls
    beginner_tutorials-msg.asd  Num.lisp  _package.lisp  _package_Num.lisp

    三. 创建自定义的 ROS 服务 :( srv

    1:现在 beginner_tutorials 软件包中创建一个 srv 文件夹,用来存放我们下面要创建的服务文件:

    $ roscd beginner_tutorials
    $ mkdir srv

    这次,不自己写服务文件了, 我们直接复制已有的文件:( roscp 是一个很实用的命令行工具,它实现了将文件从一个 package (程序包)复制到另外一个 package (程序包)的功能。) ( package : 程序包或者叫软件包 )

    $ roscp  rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

    我们打开这个 AddTwoInts.srv 文件看看里面有什么:

    gedit srv/AddTwoInts.srv

    这里写图片描述

    简单吧,就这玩意。下面就是编写 package.xml 文件 和 CMakeLists.txt 文件了。跟创建消息的步骤类似:(目的:确保 srv 文件被转换成为 C++Python 和其他语言的源代码)

    2:查看 beginner_tutorials 程序包中的 package.xml , 确保它包含一下两条语句: (上面创建的 msg 消息的时候就可以添加了,所以这次就不需要添加了)

    <build_depend>message_generation</build_depend>
    <run_depend>message_runtime</run_depend> 

    3:编写 beginner_tutorials 程序包中的 CMakeList.txt 文件中的 find_packag() 函数,增加对 message_generation 的依赖:(上面创建 msg 消息的时候已经添加了,所以现在就不需要添加了。可以跳过这个步骤)

    这里写图片描述

    (你发现了吧, message_generationmsgsrv 都起作用)

    4:继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 中的 add_service_files() 函数:添加新创建的服务文件 :

    这里写图片描述

     add_service_files(
       FILES
    #   Service1.srv
    #   Service2.srv
    AddTwoInts.srv
     )

    5:继续编写 beginner_turtorials 程序包中的 CMakeLists.txt 文件中的 generate_messages() 函数:添加包含 msgs 的软件包依赖: (在创建 msg 消息的时候,就已经添加了,所以现在可以跳过这个步骤)

    这里写图片描述

    (你发现了吧, generate_messages() 函数 对msgsrv 都起作用)

    OK 完成 1~5 的步骤你的服务文件就已经创建完成了。

    四. 编译工作空间:

    那么到这里,一切步骤全部搞定,现在我们回到主工作空间路径来编译一下:

    $ cd ~/catkin_ws
    $ catkin_make

    OK, 编译完成。



    总结:
    我们现在已经学会了如何创建ROS消息和服务,它们是ROS节点间相互通讯的除ROS话题外的另一种方式。

    下一节,我就来使用刚刚创建的ROS消息和ROS服务,编写ROS服务版的 Hello World 程序。(使用ROS服务进行通信的Hello World程序)

  • 相关阅读:
    开放的Web平台才是是我们想要的——HTML5变为HTML
    Web字体格式介绍及浏览器兼容性一览
    E百科 | 基于MEC的边缘AI服务
    技术改变生活 浅谈阿里云混合云的探索与实践
    阿里云CDN产品经理陈章炜:边缘创新技术和落地实践
    什么是微内核架构设计?
    技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch
    如何接地气地接入微前端?
    阿里云原生应用安全防护实践与 OpenKruise 的新领域
    函数计算镜像加速:从分钟到秒的跨越
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928572.html
Copyright © 2020-2023  润新知