创建ROS消息(msg)和服务(srv)

一、msg和srv介绍

  • msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。

  • srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。

msg文件存放在软件包的msg目录下,srv文件则存放在srv目录下。

msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。
可以使用的类型为:

  • int8, int16, int32, int64 (以及 uint*)
  • float32, float64
  • string
  • time, duration
  • 其他msg文件
  • variable-length array[] 和 fixed-length array[C]

       ROS中还有一个特殊的数据类型:Header,它含有时间戳和ROS中广泛使用的坐标帧信息。在msg文件的第一行经常可以看到Header header。
       下面是一个使用了Header、字符串原语和其他两个消息的示例: 下面是一个msg文件的样例,它使用了Header,string和其他另外两个消息的类型。

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是响应。

二、创建功能包

catkin_create_pkg msg_srv roscpp rospy std_msgs

我们看一下所有的文件:
创建ROS消息(msg)和服务(srv)_第1张图片

这样我们就创建了一个叫做msg_srv的功能包,以及我们在其子目录下创建了msg、srv两个文件夹用来存放需要的文件。

三、使用msg

1.创建.msg文件

在msg文件夹下创建Person.msg,内容如下:

string name
uint8 sex
uint8 age
uint32 score
uint8 male = 1
uint8 female = 2

2.在package.xml中添加功能包依赖

<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>

我们要确保msg文件能被转换为C++、Python和其他语言的源代码。
在构建时,其实只需要message_generation,而在运行时,我们只需要message_runtime。

3.在CMakeLists.txt添加编译选项

       在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:
创建ROS消息(msg)和服务(srv)_第2张图片
       有时即使没有使用全部依赖项调用find_package,项目也可以构建。这是因为catkin把你所有的项目整合在了一起,因此如果之前的项目调用了find_package,你的依赖关系也被配置成了一样的值。但是,忘记调用意味着你的项目在单独构建时很容易崩溃。

还要确保导出消息的运行时依赖关系:
创建ROS消息(msg)和服务(srv)_第3张图片
找到如下代码块:
在这里插入图片描述
手动添加.msg文件后,我们要确保CMake知道何时需要重新配置项目。
现在必须确保generate_messages()函数被调用:
在这里插入图片描述
最终大概是这个样子:
创建ROS消息(msg)和服务(srv)_第4张图片

3.编译以及source环境

4.测试

创建ROS消息(msg)和服务(srv)_第5张图片

四、使用srv

       在srv文件夹下创建Personn.srv(注意不能用和上面一样的Person.srv,因为编译之后它们在同一个文件夹生成的源文件一样

string name
uint8  age
uint8  sex

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

---
string result

CMakeLists.txt文件修改:
创建ROS消息(msg)和服务(srv)_第6张图片
测试:
创建ROS消息(msg)和服务(srv)_第7张图片
       msg目录中的任何.msg文件都将生成所有支持语言的代码。
       C++消息的头文件将生成在…/devel/include/msg_srv/。Python脚本将创在…/devel/lib/python2.7/dist-packages/msg_srv/msg。而Lisp文件则出现在…/devel/share/common-lisp/ros/msg_srv/msg/。

       类似地,srv目录中的任何.srv文件都将生成支持语言的代码。对于C++,头文件将生成在消息的头文件的同一目录中(这就是你不能在同一功能包下定义Person.msg和Person.srv的原因)。对于Python和Lisp,会在msg目录旁边的srv目录中。

本文内容参考:
ROS官方wiki:http://wiki.ros.org
古月——ROS入门21讲

如有错误或者不足之处,欢迎大家留言指正!

你可能感兴趣的:(ROS-Melodic,ROS,消息(msg),服务(srv))