ROS学习(八)创建ROS msg和srv

ROS学习(八)创建ROS msg和srv

一、msg和srv的介绍

  • msg:msg文件是描述ROS消息字段的简单文本文件。它们用于为不同语言的消息生成源代码。
  • srv:srv文件描述服务。它由两部分组成:请求和响应。
    msg文件存储在软件包的msg目录中,而srv文件存储在srv目录中。
    msgs只是简单的文本文件,每行都有一个字段类型和字段名称。可以使用的字段类型为:
  • int8,int16,int32,int64(加上uint *)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
    ROS中还有一种特殊类型:Header,标头包含时间戳和ROS中常用的坐标帧信息。您会经常看到msg文件的第一行具有Header标头。

这是一个使用Header,string primitive和另外两个msg的msg的示例:

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

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

int64 A
int64 B
---
int64 Sum

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

二、使用msg

创建一个msg

让我们在之前创建的包中定义一个新的msg。

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

ROS学习(八)创建ROS msg和srv
上面的示例.msg文件仅包含1行。当然,您可以通过添加多个元素(每行一个)来创建更复杂的文件,如下所示:

string first_name
string last_name
uint8 age
uint32 score

不过,还有一步。我们需要确保将msg文件转换为C ++,Python和其他语言的源代码:

打开package.xml,确保其中两行都没有注释:

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

ROS学习(八)创建ROS msg和srv
请注意,在编译时,我们需要“ message_generation”,而在运行时,我们仅需要“ message_runtime”。

在您喜欢的文本编辑器中打开CMakeLists.txt
将message_generation依赖项添加到CMakeLists.txt中已经存在的find_package调用中,以便可以生成消息。您可以通过简单地将message_generation添加到COMPONENTS列表中来做到这一点,如下所示:
ROS学习(八)创建ROS msg和srv

您可能会注意到,即使您没有使用所有依赖项调用find_package,有时您的项目也会正常运行。这是因为catkin将所有项目组合为一个,因此,如果较早的项目调用find_package,则您的项目将配置为相同的值。但是忘记调用意味着您的项目在隔离构建时很容易中断。

还要确保导出消息运行时依赖项。
ROS学习(八)创建ROS msg和srv
查找以下代码块:

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

取消它通过删除#符号,然后更换.msg文件。使得它看起来是这样的:
ROS学习(八)创建ROS msg和srv
通过手动添加.msg文件,我们确保在添加其他.msg文件之后CMake知道何时需要重新配置项目。

现在,我们必须确保调用了generate_messages()函数。

对于ROS Hydro和更高版本,您需要取消注释以下行:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

ROS学习(八)创建ROS msg和srv
现在您可以根据msg定义生成源文件了。

三、使用rosmsg

这就是创建msg所需要做的全部工作。让我们确保ROS可以使用rosmsg show命令看到它。
用法:

$ rosmsg show [message type]

例子:

$ rosmsg show beginner_tutorials/Num

ROS学习(八)创建ROS msg和srv
在前面的示例中,消息类型由两部分组成:

  • beginner_tutorials- 定义消息的包
  • Num-消息Num的名称

如果您忘记了msg所在的功能包,则可以省略包名称。尝试:

$ rosmsg show Num

ROS学习(八)创建ROS msg和srv

四、使用srv

4.1 创建一个srv

让我们使用之前创建的包创建一个srv:

$ roscd beginner_tutorials
$ mkdir srv

与其手动创建新的srv定义,不如从另一个软件包中复制现有的srv定义。为此,roscp是一个有用的命令行工具,用于将文件从一个软件包复制到另一个软件包。

用法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

现在我们可以从rospy_tutorials包中复制服务:

$ roscp rospy_tutorials AddTwoInts.srv srv / AddTwoInts.srv

不过,还有一步。我们需要确保将srv文件转换为C ++,Python和其他语言的源代码。
除非已经这样做,否则请打开package.xml,并确保其中两行都没有注释:

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

和以前一样,请注意,在构建时,我们需要“ message_generation”,而在运行时,我们只需要“ message_runtime”。
除非在上一步中已对消息进行了此操作,否则请添加message_generation依赖项以在CMakeLists.txt中生成消息:

# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

(message_generation对msg和srv都适用)
另外,您需要对服务的package.xml和消息进行相同的更改,因此请在上方查看所需的其他依赖项。

删除#以取消注释以下行:

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

并将占位符Service * .srv文件替换为您的服务文件:
ROS学习(八)创建ROS msg和srv
现在您可以根据服务定义生成源文件了。

4.2 使用rossrv

这就是创建srv所需要做的全部工作。让我们确保ROS可以使用rossrv show命令看到它。

用法:

$ rossrv show <service type>

例子:

$ rossrv show beginner_tutorials / AddTwoInts

ROS学习(八)创建ROS msg和srv
与rosmsg相似,您可以在不指定包名称的情况下找到这样的服务文件:
ROS学习(八)创建ROS msg和srv
在此显示了两个服务。第一个是您刚在beginner_tutorials包中创建的一个,第二个是rospy_tutorials包中已存在的一个。

五、msg和srv的通用步骤

现在,我们已经发出了一些新消息,我们需要再次制作软件包:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make
$ 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”文件夹。

六、 获得帮助

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

$ rosmsg -h

您应该看到不同的rosmsg子命令的列表。
ROS学习(八)创建ROS msg和srv

Commands:
  rosmsg show     Show message description
                                    显示消息说明
  rosmsg list     List all messages
                              列出所有消息
  rosmsg md5      Display message md5sum
                                   显示消息md5sum
  rosmsg package  List messages in a package
                                     列出功能包中的消息
  rosmsg packages List packages that contain messages
                                      列出包含消息的功能包

您还可以获取有关子命令的帮助:

$ rosmsg show -h

这显示了rosmsg show所需的参数:
ROS学习(八)创建ROS msg和srv

上一篇:Linux驱动学习记录-8.Linux并发与竞争


下一篇:Maven Tutorials I