ROS入门教程-1.1.10 创建ROS消息和ROS服务
消息(msg)和服务(srv)介绍
-
msg文件存放在package的msg目录下,srv文件则存放在srv目录下。
-
在ROS中有一个特殊的数据类型:Header,它含有时间戳和坐标系信息。
-
下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息类型。
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
- srv文件分为请求和响应两部分,由'---'分隔。其中A和B是请求, 而Sum是响应。下面是srv的一个样例:
int64 A
int64 B
---
int64 Sum
一. 创建自定义的ROS消息 :(msg)
1.下面,我们将在之前创建的package里定义新的消息。
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
- 上面是最简单的例子——在.msg文件中只有一行数据。当然,你可以仿造上面的形式多增加几行以得到更为复杂的消息:
string first_name
string last_name
uint8 age
uint32 score
2.接下来,还有关键的一步:我们要确保msg文件被转换成为C++,Python和其他语言的源代码:
- 查看package.xml, 确保它包含一下两条语句:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
-
如果没有,添加进去。
-
注意:在构建的时候,我们只需要"message_generation"。然而,在运行的时候,我们只需要"message_runtime"。
-
打开
package.xml
文件 :
将上的两代码添加到这个 package.xml
文件里,如下图所示:
3.编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 find_packag() 函数,增加对 message_generation 的依赖,这样就可以生成消息了。
-
打开
CMakeLists.txt
文件:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
4.继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 catkin_package() 函数, 添加运行依赖:message_runtime , roscpp , rospy , std_msgs
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES beginner_tutorials
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
5.继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 add_message_files()函数:添加新创建的消息文件: Num.msg
add_message_files(
FILES
# Message1.msg
# Message2.msg
Num.msg
)
6.继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 。通过上一步手动添加完 .msg 文件后,我们要确保 CMake 知道在什么时候重新配置我们的 project 。 确保添加了如下代码: 添加包含 msgs 的软件包依赖
generate_messages(
DEPENDENCIES
std_msgs
)
- 继续编写 beginner_tutorials 程序包中的 CMakeLists.txt,并为下边这行代码去掉#:
# rosbuild_genmsg()
接下来,编译,就可以生成自己的消息源代码了。
二. 编译工作空间:
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
三. 编译工作空间:
-
下面通过rosmsg show命令,检查ROS是否能够识消息。$ rosmsg show [message type]
$ rosmsg show beginner_tutorials/Num
- 你将会看到:
int64 num
- 在上边的样例中,消息类型包含两部分: 消息所在的package Num 和 消息名Num
-
如果你忘记了消息所在的package,你也可以省略掉package名。输入:
$ rosmsg show Num
- 你将会看到:
[beginner_tutorials/Num]:
int64 num
四. 创建srv:
1:现在 beginner_tutorials 软件包中创建一个 srv 文件夹,用来存放我们下面要创建的服务文件:
$ roscd beginner_tutorials
$ mkdir srv
-
这次,不自己写服务文件了, 我们直接复制已有的文件:(
roscp
是一个很实用的命令行工具,它实现了将文件从一个 package 复制到另外一个 package 的功能。)
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
- 还有很关键的一步:我们要确保srv文件被转换成C++,Python和其他语言的源代码。
-
我们打开这个
AddTwoInts.srv
文件看看里面有什么:
gedit srv/AddTwoInts.srv
下面就是编写 package.xml
文件 和 CMakeLists.txt
文件了。跟创建消息的步骤类似:(目的:确保 srv 文件被转换成为 C++
, Python
和其他语言的源代码)
2:查看 beginner_tutorials 程序包中的 package.xml
, 确保它包含一下两条语句: (上面创建的 msg 消息的时候就可以添加了,所以这次就不需要添加了)
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
3:编写 beginner_tutorials 程序包中的 CMakeList.txt
文件中的 find_packag()
函数,增加对 message_generation
的依赖:(上面创建 msg
消息的时候已经添加了,所以现在就不需要添加了。可以跳过这个步骤)
(你发现了吧, message_generation
对 msg 和 srv 都起作用)
4:继续编写 beginner_tutorials 程序包中的 CMakeLists.txt
中的 add_service_files()
函数:添加新创建的服务文件 :
add_service_files(
FILES
# Service1.srv
# Service2.srv
AddTwoInts.srv
)
5:继续编写 beginner_turtorials 程序包中的 CMakeLists.txt
文件中的 generate_messages()
函数:添加包含 msgs 的软件包依赖: (在创建 msg 消息的时候,就已经添加了,所以现在可以跳过这个步骤)
(你发现了吧, generate_messages()
函数 对msg和srv 都起作用)
四. 编译工作空间:
现在我们回到主工作空间路径来编译一下:
$ cd ~/catkin_ws
$ catkin_make
五. 使用srv:
- 下面通过rossrv show命令,检查ROS是否能够识该服务。
$ rossrv show beginner_tutorials/AddTwoInts
- 你将会看到:
int64 a
int64 b
---
int64 sum
- 跟rosmsg类似, 你也可以不指定具体的package名来查找服务文件:
$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum