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
上面的示例.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>
请注意,在编译时,我们需要“ message_generation”,而在运行时,我们仅需要“ message_runtime”。
在您喜欢的文本编辑器中打开CMakeLists.txt
将message_generation依赖项添加到CMakeLists.txt中已经存在的find_package调用中,以便可以生成消息。您可以通过简单地将message_generation添加到COMPONENTS列表中来做到这一点,如下所示:
您可能会注意到,即使您没有使用所有依赖项调用find_package,有时您的项目也会正常运行。这是因为catkin将所有项目组合为一个,因此,如果较早的项目调用find_package,则您的项目将配置为相同的值。但是忘记调用意味着您的项目在隔离构建时很容易中断。
还要确保导出消息运行时依赖项。
查找以下代码块:
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
取消它通过删除#符号,然后更换.msg文件。使得它看起来是这样的:
通过手动添加.msg文件,我们确保在添加其他.msg文件之后CMake知道何时需要重新配置项目。
现在,我们必须确保调用了generate_messages()函数。
对于ROS Hydro和更高版本,您需要取消注释以下行:
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
现在您可以根据msg定义生成源文件了。
三、使用rosmsg
这就是创建msg所需要做的全部工作。让我们确保ROS可以使用rosmsg show命令看到它。
用法:
$ rosmsg show [message type]
例子:
$ rosmsg show beginner_tutorials/Num
在前面的示例中,消息类型由两部分组成:
- beginner_tutorials- 定义消息的包
- Num-消息Num的名称
如果您忘记了msg所在的功能包,则可以省略包名称。尝试:
$ rosmsg show Num
四、使用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文件替换为您的服务文件:
现在您可以根据服务定义生成源文件了。
4.2 使用rossrv
这就是创建srv所需要做的全部工作。让我们确保ROS可以使用rossrv show命令看到它。
用法:
$ rossrv show <service type>
例子:
$ rossrv show beginner_tutorials / AddTwoInts
与rosmsg相似,您可以在不指定包名称的情况下找到这样的服务文件:
在此显示了两个服务。第一个是您刚在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子命令的列表。
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所需的参数: