5、创建ROS服务和消息

  • msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。

  • srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。

5.1、使用msg

5.1.1、创建msg

下面,我们将在之前创建的软件包里定义一个新的消息:

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

我们要确保msg文件能被转换为C++、Python和其他语言的源代码。
打开package.xml, 确保它包含以下两行且没有被注释。如果没有,添加进去:

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

打开CMakeLists.txt文件,为已经存在里面的find_package调用添加message_generation依赖项,如下所示:

# 不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

确保导出消息的运行时依赖关系:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

找到如下代码块:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

删除#符号来取消注释,然后将Message*.msg替换为你的.msg文件名,就像下边这样:

add_message_files(
  FILES
  Num.msg
)

在ROS Hydro及更新版本中,你需要取消下面几行的注释:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

像这样:

generate_messages(
  DEPENDENCIES
  std_msgs
)

在ROS Groovy及早期版本中,只需要取消这一行的注释:

generate_messages()

现在,你可以从msg文件定义中生成源代码文件了。如果现在就想这样做,请直接跳到msg和srv的一般步骤。这里不建议跳过,看此教程也不允许跳过,后面还会执行上述操作,没有快多少!!!

5.1.2、使用msg

可以通过下面方法判断ROS是否识别
用法:

$ rosmsg show [message type]

这里是:

$ rosmsg show beginner_tutorials/Num

可以看到:

int64 num

如果不记得msg在哪个包中,也可以省略包名称。尝试:

$ rosmsg show Num

可以看到

[beginner_tutorials/Num]:
int64 num

5.2、使用srv

5.2.1、创建srv

让我们使用之前创建的包再来创建服务:

$ roscd beginner_tutorials
$ mkdir srv

我们将从另一个包复制现有的srv定义,而不是手动创建新的srv。roscp是一个实用的命令行工具,用于将文件从一个包复制到另一个包。
代码公式用法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

在这里我们是使用:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

确保msg文件能被转换为C++、Python和其他语言的源代码。
如果没做过上面的教程,请先打开package.xml,确保它包含以下两行且没有被注释。如果没有,添加进去:

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

如果没做过上面的教程,在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:

# 不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

(别被名字迷惑,message_generation对msg和srv都适用)其实就是我们前面同样的操作,所以不建议跳过。
此外,你也需要像之前对消息那样在package.xml中修改服务字段,因此请看上面描述的所需附加依赖项。

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

删除#符号来取消注释,然后将Service*.srv替换为你的.srv文件名,就像下边这样:

add_service_files(
  FILES
  AddTwoInts.srv
)

现在,你可以从srv文件定义中生成源代码文件了。

5.2.2、使用srv

以上就是创建服务的所有步骤。让我们通过rossrv show命令看看ROS能否识别它。
公式

$ rossrv show <service type>

这里使用

$ rossrv show beginner_tutorials/AddTwoInts

效果:

int64 a
int64 b
---
int64 sum

int64 sum
跟rosmsg类似, 你也可以在不指定包名的情况下找到这样的服务:

$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

5.3、msg和srv的一般步骤

如果没做过上面的教程,即均跳过,请先修改下CMakeLists.txt:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

取消注释,然后添加任意你的消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:

generate_messages(
  DEPENDENCIES
  std_msgs
)

)
现在我们已经创建了一些新消息,所以需要重新make一下软件包:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make
$ cd -

msg目录中的任何.msg文件都将生成所有支持语言的代码。
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/。

srv目录中的任何.srv文件都将生成支持语言的代码。对于C++,头文件将生成在消息的头文件的同一目录中。对于Python和Lisp,会在msg目录旁边的srv目录中。

5.4、复习命令:

rospack = ros+pack(age) : provides information related to ROS packages
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
catkin_make : makes (compiles) a ROS package
rosmake = ros+make : makes (compiles) a ROS package (if you're not using a catkin workspace)
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐