消息(msg)和服务(srv)总览

  • 消息(msg)就是一个描述 ROS 中所使用的消息类型的简单文本,后缀以.msg命名。
  • 服务(srv)就是一个描述 ROS 服务数据的文本,后缀以.srv 命名。它包含两个部分:requestresponse

msg文件存放在 package 目录的 msg 目录下,srv 文件存放在 package 目录的 srv 目录下。

msg 文件实际上就是每行声明一个数据类型和变量名,它们可以使用的数据类型如下:

  1. 内置类型
原始类型 c++ Python2 Python3
bool uint8_t bool bool
int8 int8_t int int
uint8 uint8_t int int
int16 int16_t int int
uint16 uint16_t int int
int32 int32_t int int
uint32 uint32_t int int
int64 int64_t long int
uint64 uint64_t long int
float32 float float float
float64 double float float
string std::string str bytes
time ros::Time rospy.Time rospy.Time
duration ros::Duration rospy::Duration rospy::Duration
  • 注意:
    1. uint8 在Python中具有特殊含义。uint8[]被视为Python 的 bytes,因此它可以被其他面向 Python bytes 的 api 兼容。
    2. 当前不支持将 Unicode 字符串作为 ROS 的数据类型,utf-8 应该用于与 ROS 字符串序列化兼容。在 Python2中,这种编码对于 Unicode 是自动的,但是解码必须手动完成。在 Python3 中,当使用 str 时,在生成的消息代码中使用'utf-8'进行编码和解码。
  1. 数组类型
原始数据 C++ Python2 Python3
定长数组 boost::array<T, length> tuple tuple
可变长数组 std::vector<T> tuple tuple
uint8[] std::vector<unit8_t> str bytes
bool[] std::vector<uint8_t> list of bool list of bool
  1. 其他 msg 文件类型

其他自定义类型,类似于系统中的std_msgs/String,或者自定义之前写好的类型,下面会做更详细的介绍。

在 ros 中还有一种特殊的数据类型Header,它含有时间戳和坐标系信息。在 msg 文件的第一行经常可以看到Header header的声明。

样例

msg 样例

下面是一个 msg 文件的样例,它使用了 Header、string 和两个自定义msg类型

1
2
3
4
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

srv样例

srv 文件分为 requestresponse 两部分,用---分隔开。

1
2
3
4
int64 A
int64 B
---
int64 Sum

其中 A 和 B 是 request 部分,而 Sum是 response 部分

下面详细介绍两种消息类型的创建,你也可以直接到总结中看两种消息的差异点

msg 消息

创建一个简单 msg 消息

  1. 首先来到 package 目录下,创建msg目录
  2. 新建一个 Student.msg 文件
  3. 添加数据格式
1
2
string name
int64 age
  1. 配置 package.xml 文件,添加如下代码
1
2
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  1. 配置 CMakeLists.txt

    1. find_package 中添加 message_generation
    1
    2
    3
    4
    5
    6
    find_package(catkin REQUIRED COMPONENTS
    roscpp
    rosmsg
    rospy
    message_generation
    )
    1. 添加 add_messgae_file
    1
    2
    3
    4
    5
    # 添加 msg 文件
    add_message_files(
    FILES
    Student.msg # 该名称就是你创建的 msg 文件的名称
    )
    1. 添加 generation_msg
    1
    2
    3
    4
    5
    # 用于添加生成消息所需的依赖
    generate_messages(
    DEPENDENCIES
    std_msgs # 默认添加 std_msgs
    )
    1. catkin_package中添加CATKIN_DEPENDS message_runtime
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # catkin 所需依赖
    catkin_package(
    # INCLUDE_DIRS include
    # LIBRARIES demo_msg
    # CATKIN_DEPENDS roscpp rosmsg rospy
    # DEPENDS system_lib
    # 为 catkin 添加 message_runtime 依赖
    CATKIN_DEPENDS message_runtime
    )
  2. 来到 workspace目录,使用命令 catkin_make 编译即可。

  3. develinclude目录下,如果生成了头文件,则说明创建成功。

自定义 Obj 消息

步骤与简单消息大致相同,这里只列出不同的地方

  1. 新建 Team.msg 文件
1
2
string name
Student leader
  1. 配置 CMakeLists.txt

    1. 添加 add_message_file
    1
    2
    3
    4
    5
    6
    7
    add_message_files(
    FILES
    Student.msg
    Team.msg
    )
    # Team.msg 为创建的自定义 obj 消息,文件必须在 msg 目录下
    # 由于 Team.msg 引用了 Student.msg,将 Student.msg 放在靠前的位置。

引用第三方库的消息

  1. 修改 Team.msg
1
2
3
string name
Student leader
geometry_msgs/Twist location
  1. 修改 package.xml 文件
1
2
3
<build_depend>geometry_msgs</build_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>

1
<depend>geometry_msgs</depend>
  1. 修改 CMakeLists.txt

    1. find_package 中添加geometry_msgs
    1
    2
    3
    4
    5
    6
    7
    find_package(catkin REQUIRED COMPONENTS
    roscpp
    rosmsg
    rospy
    message_generation
    geometry_msgs
    )
    1. generate_messages中添加geometry_msgs
    1
    2
    3
    4
    5
    generate_messages(
    DEPENDENCIES
    std_msgs
    geometry_msgs
    )

使用rosmsg

在终端使用:

1
rosmsg show (package_name)/(msg_name)
  • package_name:对应的包名称
  • msg_name:对应的消息名称

当前的例子使用的命令为:

1
rosmsg show demo_msgs/Student

终端打印为:

1
2
string name
int64 age

rosmsg的更多用法在下面介绍

srv 消息

创建一个简单的 srv 消息

  1. 首先来到 package 目录下,创建 srv 目录
  2. 新建一个 NumOption.srv 文件
  3. 添加数据
1
2
3
4
5
float64 a
float64 b
string option
---
float64 result
  1. 配置 package.xml 文件,添加如下代码
1
2
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  1. 配置 CMakeLists.txt

    1. find_package 中添加 message_generation
    1
    2
    3
    4
    5
    6
    find_package(catkin REQUIRED COMPONENTS
    roscpp
    rosmsg
    rospy
    message_generation
    )
    1. 添加 add_service_files
    1
    2
    3
    4
    5
    # 添加 srv 文件
    add_service_files(
    FILES
    NumOption.srv # 该名称就是你创建的 srv 文件的名称
    )
    1. 添加 generation_msg
    1
    2
    3
    4
    5
    # 用于添加生成消息所需的依赖
    generate_messages(
    DEPENDENCIES
    std_msgs # 默认添加 std_msgs
    )
    1. catkin_package中添加CATKIN_DEPENDS message_runtime
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # catkin 所需依赖
    catkin_package(
    # INCLUDE_DIRS include
    # LIBRARIES demo_msg
    # CATKIN_DEPENDS roscpp rosmsg rospy
    # DEPENDS system_lib
    # 为 catkin 添加 message_runtime 依赖
    CATKIN_DEPENDS message_runtime
    )
  2. 来到 workspace目录,使用命令 catkin_make 编译即可。

  3. develinclude目录下,如果生成了头文件,则说明创建成功。

自定义复杂类型 srv 消息

步骤与简单 srv 消息大致相同,这里只列出不同的地方

  1. 首先来到 package 目录下,创建 srv 目录
  2. 新建一个 FindTeam.srv 文件
  3. 添加数据
1
2
3
Student student
---
Team team
  1. 配置 package.xml 文件,添加如下代码
1
2
3
4
5
6
<build_depend>demo_msgs</build_depend>
<build_export_depend>demo_msgs</build_export_depend>
<exec_depend>demo_msgs</exec_depend>

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

1
2
3
4
<depend>demo_msgs</depend>

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  1. 配置 CMakeLists.txt

    1. find_package 中添加 message_generation
    1
    2
    3
    4
    5
    6
    7
    find_package(catkin REQUIRED COMPONENTS
    roscpp
    rosmsg
    rospy
    message_generation
    demo_msgs
    )
    1. 添加 add_service_files
    1
    2
    3
    4
    5
    6
    # 添加 srv 文件
    add_service_files(
    FILES
    NumOption.srv # 该名称就是你创建的 srv 文件的名称
    FindTeam.srv
    )
    1. 添加 generation_msg
    1
    2
    3
    4
    5
    6
    # 用于添加生成消息所需的依赖
    generate_messages(
    DEPENDENCIES
    std_msgs # 默认添加 std_msgs
    demo_msgs
    )
  2. 来到 workspace目录,使用命令 catkin_make 编译即可。

  3. develinclude目录下,如果生成了头文件,则说明创建成功。

使用rossrv

在终端使用:

1
rosmsg show (package_name)/(srv_name)
  • package_name:对应的包名称
  • srv_name:对应的消息名称

当前的例子使用的命令为:

1
rossrv show demo_srvs/NumOption

终端打印为:

1
2
3
4
5
float64 a
float64 b
string option
---
float64 result

rossrv的更多用法在下面介绍

总结

差别

  1. msg 消息要放在packagemsg 文件夹下,而srv消息则放到packagesrv文件夹下。
  2. msg消息的后缀是msgsrv消息的后缀是srv
  3. msg消息的内容无需使用---分割,而srv消息内容需要使用---分割,上半部分是request消息,而下半部分是response消息
  4. msg消息需要添加到add_message_files中,以Student.msg为例。
1
2
3
4
5
add_message_files(
FILES
... # 这里是你的其他消息
Student.msg # 该名称就是你创建的 msg 文件的名称
)
  1. srv消息需要添加到add_service_files中,以NumOption.srv为例
1
2
3
4
5
6
# 添加 srv 文件
add_service_files(
FILES
... # 这里是你的其他消息
NumOption.srv # 该名称就是你创建的 srv 文件的名称
)
  1. msg消息使用rosmsg查看数据,srv消息使用rossrv查看数据。

共同点

  1. 都需要在package.xml中添加如下两行代码
1
2
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  1. 引用其他package中的消息都需要在package.xml和CMakeLists.txt中添加依赖,以下以Demo_msgs为例

    1. package.xml
    1
    2
    3
    <build_depend>demo_msgs</build_depend>
    <build_export_depend>demo_msgs</build_export_depend>
    <exec_depend>demo_msgs</exec_depend>
    1. CMakeLists.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    find_package(catkin REQUIRED COMPONENTS
    ... # 这里是你其他的依赖
    demo_msgs
    )

    generate_messages(
    DEPENDENCIES
    ... # 这里是你其他的依赖
    demo_msgs
    )
  2. 都需要在CMakeLists.txt文件中添加message_generationCATKIN_DEPENDS message_runtime

1
2
3
4
5
6
7
8
9
find_package(catkin REQUIRED COMPONENTS
... # 这里是你其他的依赖
message_generation
)

catkin_package(
... # 这里是你其他的依赖
CATKIN_DEPENDS message_runtime
)
  1. 生成的头文件都在对应的 develinclude 目录

msg 和 srv 调试工具

rosmsg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ rosmsg -h
----
# rosmsg 是一个用来显示 ROS 消息类型的命令行工具
rosmsg is a command-line tool for displaying information about ROS Message types.
# 命令
Commands:
# rosmsg show: 显示消息描述
rosmsg show Show message description
# rosmsg info: show 的别名
rosmsg info Alias for rosmsg show
# rosmsg list: 所有消息列表
rosmsg list List all messages
# rosmsg md5: 显示消息 md5 值
rosmsg md5 Display message md5sum
# rosmsg package: 包中的消息列表
rosmsg package List messages in a package
# rosmsg packages: 显示所有 msg 的包名
rosmsg packages List packages that contain messages
# 使用 rosmsg <command> -h 获取更多的帮助
Type rosmsg <command> -h for more detailed usage

show/info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ rosmsg show -h
----
# 使用方法:rosmsg show [options] <message type>
Usage: rosmsg show [options] <message type>

# 可选参数
Options:
# -h, --help 显示帮助消息,并退出
-h, --help show this help message and exit
# -r, --raw 显示原始消息文本,包括注释。
-r, --raw show raw message text, including comments
# -b BAGFILE, --bag=BAGFILE
-b BAGFILE, --bag=BAGFILE
# 从.bag 文件中显示消息
show message from .bag file
Demo
1
2
3
4
5
6
$ rosmsg show -r turtle_actionlib/Velocity
----
# Copied from turtlesim https://github.com/ros/ros_tutorials/blob/f7da7779e82dcc3977b2c220a843cd86dd269832/turtlesim/msg/Velocity.msg. We had to copy this into this package since it has been replaced with geometry_msgs/Twist there and comforming to Twist requires to change code, which I doubt worth time it takes. So if you think it is, please go ahead make a patch.

float32 linear
float32 angular
1
2
3
4
$ rosmsg show turtle_actionlib/Velocity
----
float32 linear
float32 angular

list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ rosmsg list
----
# 选取最后几行的数据
turtlesim/Color
turtlesim/Pose
visualization_msgs/ImageMarker
visualization_msgs/InteractiveMarker
visualization_msgs/InteractiveMarkerControl
visualization_msgs/InteractiveMarkerFeedback
visualization_msgs/InteractiveMarkerInit
visualization_msgs/InteractiveMarkerPose
visualization_msgs/InteractiveMarkerUpdate
visualization_msgs/Marker
visualization_msgs/MarkerArray
visualization_msgs/MenuEntry

md5

1
2
# 使用方式 rosmsg md5 <message type>
Usage: rosmsg md5 <message type>
Demo
1
2
3
$ rosmsg md5 std_msgs/String
----
992ce8a1687cec8c8bd883ec73ca41d1

package

1
2
3
4
5
6
7
8
$ rosmsg package -h
---
Usage: rosmsg package <package>

Options:
-h, --help show this help message and exit
# -s 所有的消息都显示在一行
-s list all msgs on a single line
Demo
1
2
3
$ rosmsg package -s turtlesim
---
turtlesim/Color turtlesim/Pose
1
2
3
4
$ rosmsg package turtlesim
---
turtlesim/Color
turtlesim/Pose

packages

1
2
3
4
5
6
7
8
9
10
$ rosmsg packages
---
# 选取了最后几行数据
tf
tf2_msgs
theora_image_transport
trajectory_msgs
turtle_actionlib
turtlesim
visualization_msgs

rossrv

rossrv 的命令和 rosmsg 的命令除了显示的数据是 srv 以外其他都是一模一样的,参考上方的 rosmsg 即可

评论