ROS学习--6.msg和srv

1.msg和srv的说明

  • msg:msg文件是描述ROS消息字段的简单文本文件。它们用于生成不同语言的消息的源代码。

    msg文件存储在软件包的msg目录中

    消息只是简单的文本文件,每行具有字段类型和字段名称。可以使用的字段类型为:

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

    ROS中还有一种特殊的类型:Header,标头包含时间戳和ROS中常用的坐标帧信息。您会经常看到msg文件的第一行具有Header标头。

    • 这是一个使用Header,string和另外两个msg的示例:
     Header header
     string child_frame_id
     geometry_msgs/PoseWithCovariance pose
     geometry_msgs/TwistWithCovariance twist
    
  • srv:一个srv文件描述一项服务。它由两部分组成:请求和响应。

    srv文件存储在srv目录中

    • srv文件类似于msg文件,但它们包含两个部分:请求和响应。这两个部分之间用“ ---”线隔开。这是一个srv文件的示例:
    int64 A
    int64 B
    ---
    int64 Sum
    

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

2.msg

2.1创建一个msg

  1. 让我们在上一个教程中创建的包中定义一个新的msg
roscd beginner_tutorials
mkdir msg
echo "int64 num" > msg/Num.msg
  • 上面的示例.msg文件仅包含1行。当然,您可以通过添加多个元素(每行一个)来创建更复杂的文件,如下所示:
string first_name
string last_name
uint8 age
uint32 score
  1. 我们需要确保将msg文件转换为C ++,Python和其他语言的源代码:
  message_generation
  message_runtime

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

  1. 将message_generation依赖项添加到CMakeLists.txt中已经存在的find_package调用中,以便可以生成消息。您只需将message_generation添加到COMPONENTS列表中即可,如下所示:
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
  1. 另外,请确保导出消息运行时依赖项。
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
  1. 查找以下代码块:
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )
  • 通过删除#符号来取消注释,然后用.msg文件替换Message * .msg文件中的支架,使其看起来像这样:
add_message_files(
  FILES
  Num.msg
)
  1. 现在,我们必须确保调用了generate_messages()函数
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )
  • 只需取消注释即可
generate_messages(
  DEPENDENCIES
  std_msgs
)

到此msg文件创建完成

2.2使用rosmsg

  • 最后,我们确保ROS可以使用rosmsg show命令看到它。
rosmsg show beginner_tutorials/Num

输出:
int64 num
  • 如果您忘记了msg所在的软件包,则可以省略软件包名称。尝试:
rosmsg show Num

输出:
[beginner_tutorials/Num]:
int64 num

3.srv

3.1创建一个srv

  1. 让我们使用刚刚创建的包来创建srv:
roscd beginner_tutorials
mkdir srv
  1. 这里我们从另一个软件包中复制一个现有的srv定义。 为此,roscp是一个有用的命令行工具,用于将文件从一个软件包复制到另一个软件包
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
  • 查看一下我们复制的srv的内容:
cat srv/AddTwoInts.srv

输出:
int64 a
int64 b
---
int64 sum
  1. 我们需要确保将srv文件转换为C ++,Python和其他语言的源代码。
message_generation
message_runtime

和以前一样,请注意,在构建时,我们需要“ message_generation”,而在运行时,我们只需要“ message_runtime”。

  1. 除非在上一步中已经对消息进行了此操作,否则请添加message_generation依赖项以在CMakeLists.txt中生成消息:
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
  1. 删除#以取消注释以下行:
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )
  • 并将Service * .srv文件替换为您的服务文件
add_service_files(
  FILES
  AddTwoInts.srv
)
  1. 现在,我们必须确保调用了generate_messages()函数
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )
  • 只需取消注释即可
generate_messages(
  DEPENDENCIES
  std_msgs
)

到此srv文件创建完成

3.2使用rossrv

  • 最后,我们确保ROS可以使用rossrv show命令看到它。
rossrv show beginner_tutorials/AddTwoInts

输出:
int64 a
int64 b
---
int64 sum
  • 与rosmsg相似,您可以在不指定包名称的情况下找到这样的服务文件:
ossrv show AddTwoInts

输出:
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

​ > 在此显示了两个服务。因为我们是复制的srv文件,所以,第一个是您刚在beginner_tutorials包中创建的一个,第二个是rospy_tutorials包中预先存在的一个。

4.编译

  • 现在,我们已经发出了一些新消息,我们需要再次制作软件包:
roscd beginner_tutorials
cd ../..
catkin_make install
cd -

msg目录中的任何.msg文件都将生成用于所有受支持语言的代码。 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 /中。

同样,srv目录中的任何.srv文件都将以受支持的语言生成代码。对于C ++,这将在与消息头文件相同的目录中生成头文件。对于Python和Lisp,在“ msg”文件夹旁边将有一个“ srv”文件夹。

5.获取帮助

  • 我们已经看到了很多ROS工具。跟踪每个命令需要哪些参数可能很困难。幸运的是,大多数ROS工具都提供了自己的帮助。
rosmsg -h

输出:
  rosmsg show               显示讯息说明
  rosmsg list                    列出所有讯息
  rosmsg md5                 显示消息md5sum
  rosmsg package         列出包裹中的消息
  rosmsg packages       列出包含消息的软件包
  • 您还可以获取有关子命令的帮助
rosmsg show -h

输出:
Usage: rosmsg show [options] 

Options:
  -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

让我们只列出到目前为止使用的一些命令:

rospack = ros + pack(age):提供与ROS软件包有关的信息 
roscd = ros + cd:将目录更改为ROS软件包或堆栈 
rosls = ros + ls:列出ROS包中的文件 
roscp = ros + cp:从ROS包复制文件到ROS包 
rosmsg = ros + msg:提供与ROS消息定义有关的信息 
rossrv = ros + srv:提供与ROS服务定义有关的信息 
catkin_make:制作(编译)ROS程序包    
                    rosmake = ros + make:使(编译)一个ROS包(如果您不使用catkin工作区)

你可能感兴趣的:(ROS学习--6.msg和srv)