7.创建ROS消息和ROS服务

消息(msg)和服务(srv)介绍

消息(msg):msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
服务(srv):一个srv文件描述一项服务。它包含两个部分:请求和响应。
msg文件存放在package的msg目录下,srv文件则存放在srv目录下。

使用msg

创建一个msg

1
2
3
cd ~/catkin_ws/src/beginner_tutorials
mkdir msg
echo "int64 num" > msg/Num.msg

查看package.xml, 确保它包含一下两条语句:

1
2
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。 你可以直接在COMPONENTS的列表里增加message_generation,就像这样:

1
2
# 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)

同样,你需要确保你设置了运行依赖:

1
2
3
4
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)

用你的.msg文件替代Message*.msg,就像下边这样:

1
2
3
4
add_message_files(
FILES
Num.msg
)

手动添加.msg文件后,我们要确保CMake知道在什么时候重新配置我们的project。 确保添加了如下代码:

1
generate_messages()

使用 rosmsg

下面通过rosmsg show命令,检查ROS是否能够识消息。

1
rosmsg show beginner_tutorials/Num

使用srv

创建一个srv

roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能。

1
2
3
roscd beginner_tutorials
mkdir srv
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

你也需要在CMakeLists.txt文件中做一些修改。
用你自己的srv文件名替换掉那些Service*.srv文件:

1
2
3
4
add_service_files(
FILES
AddTwoInts.srv
)

使用 rossrv

下面通过rosmsg show命令,检查ROS是否能够识该服务。

1
rossrv show beginner_tutorials/AddTwoInts

msg和srv都需要的步骤

去掉注释并附加上所有你消息文件所依赖的那些含有.msg文件的package(这个例子是依赖std_msgs,不要添加roscpp,rospy),结果如下:

1
2
3
4
generate_messages(
DEPENDENCIES
std_msgs
)

由于增加了新的消息,所以我们需要重新编译我们的package:

1
2
3
4
# In your catkin workspace
cd ../..
catkin_make
cd -

所有在msg路径下的.msg文件都将转换为ROS所支持语言的源代码。生成的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/ 路径下.

获得帮助

接触到不少的ROS工具了。有时候很难记住他们所需要的参数。还好大多数ROS工具都提供了帮助。
输入:

1
rosmsg -h

返回:

1
2
3
4
5
6
Commands:
rosmsg show Show message description
rosmsg users Find files that use message
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages

同样你也可以获得子命令的帮助:

1
rosmsg show -h

回顾

  • rospack = ros+pack(age) : provides information related to ROS packages
  • rosstack = ros+stack : provides information related to ROS stacks
  • roscd = ros+cd : changes directory to a ROS package or stack
  • rosls = ros+ls : lists files in a ROS package
  • roscp = ros+cp : copies files from/to a ROS package
  • rosmsg = ros+msg : provides information related to ROS message definitions
  • rossrv = ros+srv : provides information related to ROS service definitions
  • rosmake = ros+make : makes (compiles) a ROS package