msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
msg文件存放在软件包的msg目录下,srv文件则存放在srv目录下。
msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。
可以使用的类型为:
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
这样我们就创建了一个叫做msg_srv的功能包,以及我们在其子目录下创建了msg、srv两个文件夹用来存放需要的文件。
在msg文件夹下创建Person.msg,内容如下:
string name
uint8 sex
uint8 age
uint32 score
uint8 male = 1
uint8 female = 2
<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>
我们要确保msg文件能被转换为C++、Python和其他语言的源代码。
在构建时,其实只需要message_generation,而在运行时,我们只需要message_runtime。
在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:
有时即使没有使用全部依赖项调用find_package,项目也可以构建。这是因为catkin把你所有的项目整合在了一起,因此如果之前的项目调用了find_package,你的依赖关系也被配置成了一样的值。但是,忘记调用意味着你的项目在单独构建时很容易崩溃。
还要确保导出消息的运行时依赖关系:
找到如下代码块:
手动添加.msg文件后,我们要确保CMake知道何时需要重新配置项目。
现在必须确保generate_messages()函数被调用:
最终大概是这个样子:
在srv文件夹下创建Personn.srv(注意不能用和上面一样的Person.srv,因为编译之后它们在同一个文件夹生成的源文件一样)
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result
CMakeLists.txt文件修改:
测试:
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讲
如有错误或者不足之处,欢迎大家留言指正!