学习大纲:
1. msg 和 srv
- msg 文件是描述 ROS 消息字段的简单文本文件。它们用于为不同语言生成消息的源代码。
- srv 文件则描述了一个服务,包括两部分:请求和响应。Srv 文件用于生成服务的源代码。
- msg 文件存储在包的 msg 目录中。
- srv 文件存储在包的 srv 目录中。
- msg 文件的格式简单,包含每行一个字段的类型和名称。支持的字段类型包括:
- 基本类型:int8, int16, int32, int64(及其无符号版本)
- 浮点数类型:float32, float64
- 字符串:string
- 时间类型:time, duration
- 其他 msg 文件
- 数组:可变长度 [] 和固定长度 [C]
另外,ROS 中有一个特殊类型:Header,它通常包含时间戳和坐标框架信息。常见的消息格式中,第一行通常是 Header header。
示例:msg 文件
示例:srv 文件
在此示例中,A 和 B 是请求字段,Sum 是响应字段。
2. 使用 msg
创建 msg
让我们在之前创建的包中定义一个新消息。
$ cd /opt/ros/noetic/share/ros
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
也可以通过添加多个字段来创建更复杂的 msg 文件。例如:
接下来,需要确保 msg 文件能够被编译为 C++、Python 等语言的源代码。
编辑 package.xml 文件,确保添加并取消注释以下内容:
编辑 CMakeLists.txt 文件,找到 find_package 调用并确保添加 message_generation 依赖项:
在 CMakeLists.txt 中取消注释 add_message_files 和 generate_messages:
使用 然后可以使用 rosmsg show 命令查看消息定义。
$ rosmsg show beginner_tutorials/Num
输出结果:int64 num
3. 使用 srv
创建 srv
我们可以在现有包中创建一个服务文件。
$ cd /opt/ros/noetic/share/ros
$ mkdir srv
使用 roscp 从其他包中复制现有的服务文件:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
如创建消息时一样,需要更新 package.xml 和 CMakeLists.txt 文件。
在 package.xml 中确保依赖项 message_generation 和 message_runtime 存在:
在 CMakeLists.txt中添加message_generation并取消注释add_service_files和generate_messages:
使用 rossrv:使用 rossrv show 查看服务定义。
$ rossrv show beginner_tutorials/AddTwoInts
输出结果:
int64 a
int64 b
---
int64 sum
4. msg 和 srv 的共同步骤
最后,确保在 CMakeLists.txt 中调用 generate_messages 并指定依赖项:
重新编译你的包:
$ cd /opt/ros/noetic/share/ros
$ cd ../..
$ catkin_make
5. 获取帮助
ROS 提供了多种命令行工具,你可以随时通过 -h 参数查看命令的帮助。例如:
$ rosmsg -h
可以看到 rosmsg 工具的子命令说明。