0.msg和srv究竟干什么用
- msg:msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
- srv:一个srv文件描述一项服务。它包含两个部分:请求和响应。所以srv文件具体描述的就是一个服务中请求和响应分别要求的消息格式。
1.该如何定义msg和srv?
要定义这两个东西,那就需要.msg
和.srv
文件。那么得有个地方来放置这两个文件,总不能随便找个地儿放着就指望着它起作用吧。
那么,它们应该被放在哪里呢?
.msg
:这个文件应该被放在package目录下的msg文件夹里
.srv
:这个文件应该被放在package目录下的srv文件夹里
什么?你说没有这两个文件夹?
没有那就新建啊!
比如我的工作空间名叫catkin_ws,package名叫demo,那么:
cd catkin_ws/src/demo
mkdir msg
mkdir srv
在终端中这样操作不就行了。
1.0.msg
文件的定义:
ROS消息由每个ROS包的msg目录中的消息定义文件说明。这些文件会被编译成与编程语言有关的的实现版本,这样你才能在写代码的时候使用这些消息结构。这意味着及时你使用的是一种解释型的编程语言,例如Python。你依然需要运行catkin_make编译一次消息定义文件。否则将无法生成可用的实现文件,Python将找不到你自定义的消息类型。
同样的道理,如果你修改完消息定义文件以后,忘记重新编译的话,那么你使用的消息依旧是老版本。
虽然这种机制听起来好像很麻烦,但是这其实是一种一劳永逸的方法,因为我们只需要定义一次消息,接着在所以ROS支持的编程语言中我们都可以使用这种消息。
ROS消息定义文件通常十分简短易懂,都是每一行一个类型名加一个变量名的格式。类型名是ROS的基础类型,或者来自其他包里定义的类型,或者是像Header这样的特殊类型。
像下面这样子的,就形成了一个简单的.msg
文件。
int8 demo1
int32 demo2
float32 demo3
1.1.srv
文件的定义:
创建一个新服务的第一步是要定义服务调用的输入和输出。那么.srv
文件的用武之地就来了。我们通过编辑.srv
文件及服务定义文件来完成对server调用的I/O的定义。.srv
有着跟消息定义文件相同的结构,但是由于server既有输入又有输出,所以要比消息定义稍微复杂一丢丢。
那么.srv
文件究竟如何编写呢?
很简单:
#part1
input information
---
#part2
output information
就这么简单?没错就是这么简单!
1.2题外话:.action
文件的定义:
.action
文件顾名思义就是action的定义文件。
至于这部分,我有另外一篇博文专门讲了action,有兴趣可以去看一下。
ROS入门之——action