消息(msg)和服务(srv)总览
消息(msg)就是一个描述 ROS 中所使用的消息类型的简单文本,后缀以.msg
命名。
服务(srv)就是一个描述 ROS 服务数据的文本,后缀以.srv
命名。它包含两个部分:request
和
response
msg文件存放在 package 目录的 msg 目录下,srv 文件存放在 package 目录的 srv 目录下。
msg 文件实际上就是每行声明一个数据类型和变量名,它们可以使用的数据类型如下:
内置类型
原始类型
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
注意:
uint8
在Python中具有特殊含义。uint8[]被视为Python 的 bytes,因此它可以被其他面向 Python bytes 的 api 兼容。
当前不支持将 Unicode 字符串作为 ROS 的数据类型,utf-8 应该用于与 ROS 字符串序列化兼容。在 Python2中,这种编码对于 Unicode
是自动的,但是解码必须手动完成。在 Python3 中,当使用 str 时,在生成的消息代码中使用'utf-8'
进行编码和解码。
数组类型
原始数据
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
其他 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 文件分为 request
和 response
两部分,用---
分隔开。
1 2 3 4
int64 A int64 B --- int64 Sum
其中 A 和 B 是 request
部分,而 Sum是 response
部分
下面详细介绍两种消息类型的创建,你也可以直接到总结 中看两种消息的差异点
msg 消息
创建一个简单 msg 消息
首先来到 package
目录下,创建msg
目录
新建一个 Student.msg
文件
添加数据格式
配置 package.xml
文件,添加如下代码
1 2
<build_depend > message_generation</build_depend > <exec_depend > message_runtime</exec_depend >
配置 CMakeLists.txt
在 find_package
中添加 message_generation
1 2 3 4 5 6
find_package (catkin REQUIRED COMPONENTS roscpp rosmsg rospy message_generation )
添加 add_messgae_file
1 2 3 4 5
add_message_files( FILES Student.msg )
添加 generation_msg
1 2 3 4 5
generate_messages( DEPENDENCIES std_msgs )
在 catkin_package
中添加CATKIN_DEPENDS message_runtime
1 2 3 4 5 6 7 8 9
catkin_package( CATKIN_DEPENDS message_runtime )
来到 workspace
目录,使用命令 catkin_make
编译即可。
在 devel
的include
目录下,如果生成了头文件,则说明创建成功。
自定义 Obj 消息
步骤与简单消息大致相同,这里只列出不同的地方
新建 Team.msg 文件
1 2
string name Student leader
配置 CMakeLists.txt
添加 add_message_file
1 2 3 4 5 6 7
add_message_files( FILES Student.msg Team.msg )
引用第三方库的消息
修改 Team.msg
1 2 3
string name Student leader geometry_msgs/Twist location
修改 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 >
修改 CMakeLists.txt
在 find_package
中添加geometry_msgs
1 2 3 4 5 6 7
find_package (catkin REQUIRED COMPONENTS roscpp rosmsg rospy message_generation geometry_msgs )
在 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
终端打印为:
rosmsg
的更多用法在下面介绍
srv 消息
创建一个简单的
srv 消息
首先来到 package
目录下,创建 srv
目录
新建一个 NumOption.srv
文件
添加数据
1 2 3 4 5
float64 a float64 b string option --- float64 result
配置 package.xml
文件,添加如下代码
1 2
<build_depend > message_generation</build_depend > <exec_depend > message_runtime</exec_depend >
配置 CMakeLists.txt
在 find_package
中添加 message_generation
1 2 3 4 5 6
find_package (catkin REQUIRED COMPONENTS roscpp rosmsg rospy message_generation )
添加 add_service_files
1 2 3 4 5
add_service_files( FILES NumOption.srv )
添加 generation_msg
1 2 3 4 5
generate_messages( DEPENDENCIES std_msgs )
在 catkin_package
中添加CATKIN_DEPENDS message_runtime
1 2 3 4 5 6 7 8 9
catkin_package( CATKIN_DEPENDS message_runtime )
来到 workspace
目录,使用命令 catkin_make
编译即可。
在 devel
的include
目录下,如果生成了头文件,则说明创建成功。
自定义复杂类型
srv 消息
步骤与简单 srv 消息大致相同,这里只列出不同的地方
首先来到 package
目录下,创建 srv
目录
新建一个 FindTeam.srv
文件
添加数据
1 2 3
Student student --- Team team
配置 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 >
配置 CMakeLists.txt
在 find_package
中添加 message_generation
1 2 3 4 5 6 7
find_package (catkin REQUIRED COMPONENTS roscpp rosmsg rospy message_generation demo_msgs )
添加 add_service_files
1 2 3 4 5 6
add_service_files( FILES NumOption.srv FindTeam.srv )
添加 generation_msg
1 2 3 4 5 6
generate_messages( DEPENDENCIES std_msgs demo_msgs )
来到 workspace
目录,使用命令 catkin_make
编译即可。
在 devel
的include
目录下,如果生成了头文件,则说明创建成功。
使用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
的更多用法在下面介绍
总结
差别
msg
消息要放在package
的 msg
文件夹下,而srv
消息则放到package
的srv
文件夹下。
msg
消息的后缀是msg
,srv
消息的后缀是srv
。
msg
消息的内容无需使用---
分割,而srv
消息内容需要使用---
分割,上半部分是request
消息,而下半部分是response
消息
msg
消息需要添加到add_message_files
中,以Student.msg为例。
1 2 3 4 5
add_message_files( FILES ... Student.msg )
srv
消息需要添加到add_service_files
中,以NumOption.srv
为例
1 2 3 4 5 6
add_service_files( FILES ... NumOption.srv )
msg
消息使用rosmsg
查看数据,srv
消息使用rossrv
查看数据。
共同点
都需要在package.xml
中添加如下两行代码
1 2
<build_depend > message_generation</build_depend > <exec_depend > message_runtime</exec_depend >
引用其他package
中的消息都需要在package.xml和CMakeLists.txt中添加依赖,以下以Demo_msgs
为例
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 >
CMakeLists.txt
1 2 3 4 5 6 7 8 9 10
find_package (catkin REQUIRED COMPONENTS ... demo_msgs ) generate_messages( DEPENDENCIES ... demo_msgs )
都需要在CMakeLists.txt文件中添加message_generation
,CATKIN_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 )
生成的头文件都在对应的 devel
的 include
目录
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 is a command -line tool for displaying information about ROS Message types. Commands: rosmsg show Show message description rosmsg info Alias for rosmsg show rosmsg list List all messages rosmsg md5 Display message md5sum rosmsg package List messages in a package rosmsg packages List packages that contain messages 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 ---- Usage: rosmsg show [options] <message type > Options: -h, --help show this help message and exit -r, --raw show raw message text, including comments -b BAGFILE, --bag=BAGFILE show message from .bag file
Demo
1 2 3 4 5 6
$ rosmsg show -r turtle_actionlib/Velocity ---- 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
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 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
即可