• 7、创建ROS msg和srv


    一、msg和srv介绍

    msg: msg文件使用简单的文本格式声明一个ROS message的各个域。

    仅须要创建一个msg文件,就能够使用它来生成不同语言的message定义代码。

    srv:srv文件则声明了一个服务,包括request(请求)和response(响应)。

    msg文件和srv文件分别存储在包的msg文件夹和srv文件夹下。

    1、msg文件

    msgs是简单的txt文件。每行定义一个信息域,每行的格式为:

    信息域的名称 信息域的类型

    信息域的类型有下面几种:

     int8, int16, int32, int64 (plus uint*)
     float32, float64
     string
     time, duration
     other msg files
     variable-length array[] and fixed-length array[C] 

    这里是一个演示样例,此例使用了一个Header类型,一个原始字符串类型,还有两个其它提前定义好的其它类型:

    Header header
    string child_frame_id
    geometry_msgs/PoseWithCovariance pose
    geometry_msgs/TwistWithCovariance twist

    2、srv文件

    srv文件和msg文件相似。唯一不同的是它包括两个部分——request和response。

    两部分用---分隔:

    int64 A
    int64 B
    ---
    int64 Sum

    上面的演示样例中。A和B是request。Sum是response。

    二、使用msg

    1、创建一个msg

    让我们在前面创建的包beginner_tutorials中使用msg文件定义一个msg,假设此包已被删除的话,请參考本系列的第一篇文章又一次创建这个包。

    首先进入包文件夹:

    roscd beginner_tutorials

    创建一个msg文件夹:

    mkdir msg

    然后使用下面方式创建Num.msg文件(你也能够自行创建。使用编辑器编辑后保存):

    echo "int64 num" > msg/Num.msg

    上面创建的文件仅包括一行,当然你也能够向当中加入很多其它的信息域,每一个一行,比如:

    string first_name
    string last_name
    uint8 age
    uint32 score

    创建好之后,我们须要确保msg文件能够被转换为c++/python或者其它语言的代码。

    打开package.xml文件,确保里面存在这两行且去掉它们的凝视:

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

    须要指出,在构建阶段我们须要 "message_generation", 而在运行时我们须要 "message_runtime"

    然后打开包文件夹下的CMakeLists.txt文件。在find_message调用中加入message_generation依赖,让你能够生成ROS信息。

    例如以下所看到的,括号中加入一项message_generation就可以:

    find_package(catkin REQUIRED COMPONENTS
       roscpp
       rospy
       std_msgs
       message_generation
    )

    你或许注意到有时你构建项目的时候,即使你没有在CMakeLists.txt中调用find_package,仍然构建正常。

    这是由于catkin将你全部的项目集成到一起,仅仅要你之前的项目调用了find_package,如今的项目就会被配置为相同的调用。可是这是存在隐患的。当你独立构建一个项目的时候,缺少find_package调用会导致构建失败。

    然后同上面相似。确保你加入了message_runtime 依赖。如图所看到的:

    这里写图片描写叙述

    然后找到例如以下代码段:

    这里写图片描写叙述

    去掉凝视,改为:

    add_message_files(
      FILES
      Num.msg
    )

    然后,确保generate_messages()函数被调用:

    这里写图片描写叙述

    去掉凝视。改动为:

    generate_messages(
      DEPENDENCIES
      std_msgs
    )

    如今全部的文件都准备好了。总结一下,大概有这么几个步骤:

    1. 在msg文件夹下使用msg文件语法定义一个msg
    2. 改动CmakeLists.txt。在find_package调用中,加入message_generation依赖
    3. 改动CmakeLists.txt,在catkin_message下加入message_runtime依赖
    4. 改动CmakeLists.txt,去掉add_message_files凝视,加入我们自定义的msg文件
    5. 改动CmakeLists.txt。去掉generate_messages()的凝视

    三、使用rosmsg

    我们能够使用rosmsg命令查看我们定义的msg的具体信息,以确保它能被ROS正确识别:

    rosmsg show beginner_tutorials/Num

    会得到:

    int64 num

    假设你忘了msg位于哪个包中。你也能够省略包名:

    rosmsg show Num

    得到:

    [beginner_tutorials/Num]:
    int64 num

    四、使用srv

    1、创建一个srv

    相同是先定义srv文件:

    roscd beginner_tutorials
    mkdir srv

    避免手动创建的麻烦。我们能够使用roscp命令从其它包里拷贝一份srv文件出来,使用方法:

    roscp [package_name] [file_to_copy_path] [copy_path]

    在这里,我们从rospy_tutorials拷贝一份srv文件出来:

    roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

    同上面相似的,确保srv文件能够被转为代码,我们须要向package.xml中加入内容:

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

    这里前一步创建msg的时候已经做过了,所以在这里我们能够省略这一步。

    相同的,加入message_generation依赖。我们也做过了:

    find_package(catkin REQUIRED COMPONENTS
      roscpp
      rospy
      std_msgs
     message_generation
    )

    接下来就是要将我们的srv文件添进项目了:

    找到这段:

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

    去掉凝视且改动为:

    add_service_files(
      FILES
      AddTwoInts.srv
    )

    能够发现,创建srv的流程同msg基本一致。

    2、使用rossrv

    我们能够使用rossrv命令查看我们创建的服务的信息,确保它被ROS正确识别:

    rossrv show beginner_tutorials/AddTwoInts

    得到:

    int64 a
    int64 b
    ---
    int64 sum

    相似于rosmsg,你也能够省略包名:

    $ rossrv show AddTwoInts
    [beginner_tutorials/AddTwoInts]:
    int64 a
    int64 b
    ---
    int64 sum
    
    [rospy_tutorials/AddTwoInts]:
    int64 a
    int64 b
    ---
    int64 sum

    五、使用msg和srv的基本流程

    1、msg依赖

    我们在前面已经做过这一步,改动CMakeLists.txt :

    # generate_messages(
    #   DEPENDENCIES
    # #  std_msgs  # Or other packages containing msgs
    # )

    去掉凝视。然后加入我们依赖的不论什么包:

    generate_messages(
      DEPENDENCIES
      std_msgs
    )

    这里解释一下依赖的问题,像前面介绍的那样。我们在编写msg文件时。不止能够使用原生的int、string等类型。有时候也会用到其它包里提前定义好的信息类型,比方前面的样例中的geometry_msgs/PoseWithCovariance pose,当我们须要用到其它包里定义好的信息时,我们就要声明对其它包的依赖。比方上面的样例里我们就要声明一个geometry_msgs的依赖。

    而在前面的样例中,我们的msg文件里仅仅有这一行:

    int64 num

    仅仅使用了原生的int类型,所以我们仅仅须要声明std_msgs依赖就可以。

    2、開始构建

    全部的msg和srv文件已定义好。CmakeLists.txt文件也已经改动好。如今我们就能够构建我们的beginner_tutorial包了。

    如今我们位于beginner_tutorial包的文件夹下,运行下面命令进入工作空间的顶层文件夹:

    cd ../..

    运行:

    catkin_make install

    如今。msg文件夹下的全部.msg文件,都会生成ROS支持的语言的源码。C++的头文件在~/catkin_ws/devel/include/beginner_tutorials/里。Python基本在 ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg里,lisp文件则在 ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/ 里。

    同msg的位置相似,C++的srv头文件与msg头文件位于同一文件夹下。而python和lisp在msg文件夹之外存在一个srv文件夹存放srv文件生成的代码。

    六、获取帮助

    我们已经学习了非常多ROS命令,记住每一个命令的參数和使用方法是非常困难的,我们能够使用帮助查看具体使用方法。

    比如:

    rosmsg -h

    或者:

    rosmsg show -h

    七、复习

    rospack = ros+pack(age) : provides information related to ROS packages
    
    roscd = ros+cd : changes directory to a ROS package or stack
    
    rosls = ros+ls : lists files in a ROS package
    
    roscp = ros+cp : copies files from/to a ROS package
    
    rosmsg = ros+msg : provides information related to ROS message definitions
    
    rossrv = ros+srv : provides information related to ROS service definitions
    
    catkin_make : makes (compiles) a ROS package rosmake = ros+make : makes (compiles) a ROS package (if you're not using a catkin workspace) 
    
  • 相关阅读:
    前端笔试题----JavaScript部分
    前端笔试题----html,css部分
    JS基础--执行环境及作用域
    关于css3 flex布局
    Ceph万兆内网与系统万兆迁移
    从0开始的InfiniBand硬件踩坑过程
    Redis实战与分析
    ceph osd 自动挂载的N种情况
    集群IPtables转发与防火墙
    ceph 常见问题百科全书---luminous安装部署篇
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7243738.html
Copyright © 2020-2023  润新知