ROS msg 和 srv

msg与srv

  • msg:msg 文件是描述 ROS 消息字段的简单文本文件。它们用于生成不同语言消息的源代码。
  • srv:srv 文件描述服务。它由两部分组成:请求和响应。
  • msg 文件存放在包的 msg 目录下,srv 文件存放在 srv 目录下。
    srv 文件就像 msg 文件一样,只不过它们包含两部分:请求和响应。这两个部分由一条“---”线隔开。

在软件包里定义新的消息

使用以下代码

roscd xxx
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>

在构建时,只需要message_generation,在运行时,只需要message_runtime
在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:

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
)

手动添加.msg文件后,要确保CMake知道何时需要重新配置项目。
必须确保generate_messages()函数被调用:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

取消掉注释,即删掉所有的#
创建好消息后使用

rosmsg show [message type]

来看看ROS是否可以识别创建好的消息

使用srv

roscd beginner_tutorials
mkdir srv

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

roscp [package_name] [file_to_copy_path] [copy_path]

要确定可以被转换为其他语言的源代码的方法和msg相同,不同点是在cmakelist里的操作

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

删除#符号来取消注释,然后将Service*.srv替换为你的.srv文件名
就创建好了服务,使用

rossrv show <service type>

来查看ROS是否可以识别

使用

由于上面更新了消息,所以我们要对软件包重新编译

# In your workspace
$ roscd xxx
$ 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/

posted @ 2023-11-04 18:14  不想要名字  阅读(83)  评论(0编辑  收藏  举报