zoukankan      html  css  js  c++  java
  • ROS中msg和srv文件的区别

    1、msg和srv究竟有什么区别??

    msg只是单向的发送和接受。

    srv包含两个部分:请求和响应。

    2、msg和srv简介

    • msg:msg文件是描述ROS消息字段的简单文本文件。它们用于为不同语言(c++或者python等)的消息生成源代码。
    • srv:srv文件用来描述服务。它由两部分组成:请求(request)和响应(response)。

    msg文件存储在包的msg目录中,而srv文件存储在srv目录中。

    msg和srv文件的定义格式:

    msg只是简单的文本文件,每行有一个字段类型和字段名称。您可以使用的字段类型有(如同c++定义变量int x 中的int):

    1 int8,int16,int32,int64(plus uint *)
    2 float32,float64
    3 string
    4 time,duration
    5 其他msg文件
    6 可变长度数组array[]和固定长度数组array[C]

     srv文件和msg文件相似,除了它包含两个部分:请求和响应。这两部分用“---”线分隔。下面是一个srv文件的示例:

    1 int64 A
    2 int64 B
    3 ---
    4 int64 Sum

    在上面的例子中,A和B是请求,Sum是响应。

    在ROS中还有一种特殊类型:Header,它包含在ROS中常用的时间戳和坐标系信息。你会经常看到一个msg文件中的第一行有Header header。
    下面是一个使用Header,字符串基元和另外两个msg的msg示例:

    1 Header header
    2 string child_frame_id
    3 geometry_msgs/PoseWithCovariance pose
    4 geometry_msgs/TwistWithCovariance twist

    3、使用msg

    • 定义一个新的msg。
    • 打开package.xml,并确保这两行都在其中并取消注释:
    1 <build_depend> message_generation </ build_depend>
    2 <run_depend> message_runtime </ run_depend>

    注意,在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

    • CMakeLists.txt中添加message_generation依赖于find_package中,这样就可以生成消息,使得它看起来是这样的:
    1 find_package(catkin REQUIRED COMPONENTS
    2 roscpp
    3 rospy
    4 std_msgs
    5 message_generation
    6 )
    • 还要确保导出消息运行时依赖关系。
    1 catkin_package(
    2 ...
    3 CATKIN_DEPENDS message_runtime ...
    4 ...)
    • 找到以下代码块:
    1 # add_message_files(
    2 # FILES
    3 # Message1.msg
    4 # Message2.msg
    5 # )
    • 通过删除取消它#符号,替换为你的消息文件,使得它看起来是这样的:
    1 add_message_files(
    2 FILES
    3 Num.msg
    4 )
    • 对于ROS Hydro及更高版本(也就是从 Ubuntu 12.04 LTS 之后都需要),您需要取消注释以下行:
    1 # generate_messages(
    2 # DEPENDENCIES
    3 # std_msgs
    4 # )
    • 所以它看起来像:
    1 generate_messages(
    2 DEPENDENCIES
    3 std_msgs
    4 

    4、使用rosmsg

    用法:
    $ rosmsg show [message type]
    例如:
    $ rosmsg show beginner_tutorials/Num
    如果你不记得msg所在的包,你可以省略包名。尝试:
    $ rosmsg show Num

    5、使用srv

    在使用srv之前我们介绍一个命令:roscp,roscp是一个有用的命令行工具,用于将文件从一个包复制到另一个。
    用法:
    $ roscp [package_name] [file_to_copy_path] [copy_path]

    • 现在我们可以从rospy_tutorials包复制一个服务:
      • $ roscp rospy_tutorials AddTwoInts.srv srv / AddTwoInts.srv
      • //roscp [包名] [复制的服务名字] [复制的地址]
    • 还有一步。我们需要确保srv文件转换为C ++,Python和其他语言的源代码。
      • 打开package.xml,并确保这两行在其中并取消注释:
    1 <build_depend> message_generation </ build_depend>
    2 <run_depend> message_runtime </ run_depend>
    • 添加message_generation依赖关系以在CMakeLists.txt中生成消息:
    1 find_package(catkin REQUIRED COMPONENTS
    2 roscpp
    3 rospy
    4 std_msgs
    5 message_generation
    6 )

      (尽管它这样的名字,但是message_generation适用于msg和srv。)

    • 此外,您需要对消息的服务的package.xml进行相同的更改,因此请查看上面所需的其他依赖项。
      • 替换您的服务文件的占位符Service * .srv文件:
    1 add_service_files(
    2 FILES
    3 AddTwoInts.srv
    4 

    6、使用rossrv

    用法:
    $ rossrv show <service type>
    例:
    $ rossrv show beginner_tutorials / AddTwoInts
    类似于rosmsg,你可以找到像这样的服务文件,而不指定包名:
    $ rossrv show AddTwoInts

    7、总结 

    1. 创建消息(一共5步):

    • 包中建立msg文件夹,在文件夹中创建*.msg
    • 编辑.msg,定义类型和域名
    • package.xml中添加
    1 <build_depend>message_generation</build_depend>
    2 <run_depend>message_runtime</run_depend>
    • CMakeLists.txt中添加
     1 find_package(catkin REQUIRED COMPONENTS
     2 roscpp
     3 rospy
     4 std_msgs
     5 message_generation
     6 )
     7 //---------------------------------------
     8 add_message_files(
     9 FILES
    10 Num.msg
    11 ) 
    • 编译

    2. 创建服务(一共5步):

    • 创建srv文件夹,创建.srv文件
    • 编辑.srv文件
    • .xml文件
    1 <build_depend>message_generation</build_depend>
    2 <run_depend>message_runtime</run_depend>
    • CMakeLists.txt中添加
     1 find_package(catkin REQUIRED COMPONENTS
     2 roscpp
     3 rospy
     4 std_msgs
     5 message_generation
     6 )
     7 //---------------------------------------
     8 add_service_files(
     9 FILES
    10 AddTwoInts.srv
    11 )    
    • 编译
  • 相关阅读:
    简洁的Python
    python docker
    django-rest-framework笔记-类视图篇
    itertools库
    python 内置库
    python 数据分类
    python元组
    django-rest-framework笔记-请求与响应篇
    Centos 安装.NET CORE 3.1
    api接口签名验证
  • 原文地址:https://www.cnblogs.com/lisongzzx/p/13652602.html
Copyright © 2011-2022 走看看