ros学习之消息和服务

摘要:
1msg和srv简介msg:msg文件是描述ROS消息字段的简单文本文件。它们用于生成不同语言(c++或python等)的消息源代码。Srv:Srv文件用于描述服务。它由两部分组成:请求和响应。msg文件存储在包的msg目录中,而srv文件存储在srv目录中。Msg只是一个简单的文本文件。每行都有一个字段类型和字段名。可以使用的字段类型是(因为c++定义了变量

1 msg和srv简介

  • msg:msg文件是描述ROS消息字段的简单文本文件。它们用于为不同语言(c++或者python等)的消息生成源代码。

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

msg文件存储在msg目录中,而srv文件存储在srv目录中。

msg只是简单的文本文件,每行有一个字段类型和字段名称。您可以使用的字段类型有(如同c++定义变量int x 中的int):

  • int8,int16,int32,int64(plus uint *)
  • float32,float64
  • string
  • time,duration
  • 其他msg文件
  • 可变长度数组array[]和固定长度数组array[C]

在ROS中还有一种特殊类型:Header,它包含在ROS中常用的时间戳和坐标系信息。你会经常看到一个msg文件中的第一行有Header header

下面是一个使用Header,字符串基元和另外两个msg的msg示例:

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

srv文件和msg文件相似,除了它包含两个部分:请求和响应。这两部分用“---”线分隔。下面是一个srv文件的示例:

int64 A
int64 B
---
int64 Sum

在上面的例子中,AB是请求,Sum是响应。

2 使用msg

2.1创建msg

让我们在上一个教程中创建的包中定义一个新的msg。

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

上面的.msg文件示例只包含1行。当然,您可以通过添加多个元素(每行一个)来创建更复杂的文件,如下所示:

string first_name
string last_name
uint8 age
uint32 score

还有一步,我们要保证msg文件转换成c++、python或其它语言的源文件。

打开package.xml,并确保这两行都在其中并取消注释

  <build_depend> message_generation </ build_depend>
  <run_depend> message_runtime </ run_depend>

注意,在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

用你喜欢的文本编辑器打开CMakeLists.txt(前面教程中的rosed是一个不错的选择)。

CMakeLists.txt中添加message_generation依赖于find_package中,这样就可以生成消息。您可以通过简单地增加做message_generation到列表组件,使得它看起来是这样的:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

您可能会注意到,有时您的项目构建良好,即使您没有调用find_package所有依赖项。这是因为catkin将所有的项目合并为一个,所以如果一个早期的项目调用find_package,你的配置使用相同的值。但是忘记调用意味着你的项目可以在孤立构建时轻松打破。

还要确保导出消息运行时依赖关系。

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

找到以下代码块:

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

通过删除取消它符号,替换为你的消息文件,使得它看起来是这样的:

add_message_files(
  FILES
  Num.msg
)

通过手动添加.msg文件,我们确保CMake知道在添加其他.msg文件后它必须重新配置项目。

现在我们必须确保generate_messages()函数被调用。

对于ROS Hydro及更高版本,您需要取消注释以下行:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )
  • 所以它看起来像:
    generate_messages(
      DEPENDENCIES
      std_msgs
    )

在早期版本中,您可能只需要取消注释一行:

generate_messages()

现在你可以从你的msg定义生成源文件。如果你现在想这样做,跳过msg和srv的通用步骤的下一节

3 使用rosmsg

这是所有你需要做的创建一个msg。让我们确保ROS可以使用rosmsg show命令看到它

用法:

$ rosmsg show [message type]

例如:

$ rosmsg show beginner_tutorials/Num

你会看见:

  • int64 num

在上一个示例中,消息类型由两部分组成:

  • beginner_tutorials - 定义消息的包

  • Num - msg的名称Num

如果你不记得msg所在的包,你可以省略包名。尝试:

 $ rosmsg show Num

你会看见:

  • [beginner_tutorials / Num]:
    int64 num

4 使用srv

创建srv

让我们使用刚创建的包来创建srv:

$ roscd beginner_tutorials
$ mkdir srv

我们不会手动创建新的srv定义,而是从另一个包中复制现有的srv定义。

为此,roscp是一个有用的命令行工具,用于将文件从一个包复制到另一个。

用法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

现在我们可以从rospy_tutorials复制一个服务

$ roscp rospy_tutorials AddTwoInts.srv srv / AddTwoInts.srv

还有一步。我们需要确保srv文件转换为C ++,Python和其他语言的源代码。

除非你已经这样做,打开package.xml,并确保这两行在其中并取消注释

  <build_depend> message_generation </ build_depend>
  <run_depend> message_runtime </ run_depend>

和前面一样,注意在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

除非已对上一步中的消息执行此操作,否则添加message_generation依赖关系以在CMakeLists.txt中生成消息

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
 message_generation
)

(尽管它这样的名字,但是message_generation适用于msgsrv。)

此外,您需要对消息的服务的package.xml进行相同的更改,因此请查看上面所需的其他依赖项。

移除以取消以下行的注释:

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

并替换您的服务文件的占位符Service * .srv文件:

add_service_files(
  FILES
  AddTwoInts.srv

现在,您可以从服务定义生成源文件。如果你现在想这样做,跳过msg和srv的通用步骤的下一节

4.2 使用rossrv

这就是创建srv所需要做的。让我们确保ROS可以使用rossrv show命令查看它

用法: 

$ rossrv show <service type>

例:

$ rossrv show beginner_tutorials / AddTwoInts

你会看见:

  • int64 a
    int64 b
    --- ---
    int64 sum

类似于rosmsg,你可以找到像这样的服务文件,而不指定包名:

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

这里,示出了两个服务。第一个是你刚刚在beginner_tutorials包中创建的,第二个是从rospy_tutorials包中预先存在的一个。

 

5 msg和srv的常见步骤 

除非您已在之前的步骤中完成此操作,请更改CMakeLists.txt

#generate_messages(
#依赖
##std_msgs#或其他包含msgs的软件包
#)

取消注释它并添加您依赖的任何包含您的消息使用的.msg文件(在本例中为std_msgs)的包,如下所示:

generate_messages(
  相关性
  std_msgs

现在我们已经做了一些新的消息,我们需要再次使我们的包:

#在您的catkin工作区中
$ roscd beginner_tutorials
$ cd ../ ..
$ catkin_make install
$ 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'文件夹。

消息格式的完整规范在消息描述语言页面提供。

如果您正在构建使用新消息的C ++节点,则还需要声明节点和消息之间的依赖关系,如catkin msg / srv构建文档中所述

 获得帮助

我们已经看到了很多ROS工具。可能难以跟踪每个命令需要的参数。幸运的是,大多数ROS工具提供自己的帮助。

尝试:

$ rosmsg -h
  • 您应该看到不同的rosmsg 命令的列表

    命令:
      rosmsg show显示消息的描述
      rosmsg list列出所有消息
      rosmsg md5显示消息md5sum
      rosmsg package列出包中的消息
      rosmsg软件包列出包含消息的软件包

您还可以获取有关子命令的帮助

$ rosmsg show -h
  • 这显示了rosmsg显示所需的参数:
    用法:rosmsg show [options] <message type>
    
    选项:
      -h,--help显示此帮助消息并退出
      -r,--raw显示原始消息文本,包括注释

评论

让我们只列出一些我们目前使用的命令:

  • rospack = ros + pack(age):提供与ROS包相关的信息
  • roscd = ROS + CD:Changes lirectory到ROS包或堆

  • rosls = ROS + LS:LIST 文件在ROS文件包

  • roscp = ROS + CP:copy文件从/到一个ROS包

  • rosmsg = ros + msg:提供与ROS消息定义相关的信息
  • rossrv = ros + srv:提供与ROS服务定义相关的信息
  • catkin_make:make(编译)一个ROS包
    • rosmake = ros + make:make(编译)一个ROS包(如果你不使用catkin工作区)

总结:

消息与服务

Header header
string child_frame_id geometry_msgs/PoseWithCovariance pose
geometry_msgs
/TwistWithCovariance twist
int64 A
int64 B
---
int64 Sum

创建消息:

1 包中建立msg文件夹,在文件夹中创建*.msg

2 编辑.msg,定义类型和域名

3 package.xml中添加

  <build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>

4 CMakeLists.txt中添加

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
add_message_files(
  FILES
  Num.msg
)
generate_messages(
  DEPENDENCIES
  std_msgs
)

5 编译

创建服务:

1 创建srv文件夹,创建.srv文件

2 编辑.srv文件

3 .xml文件

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

4  CMakeLists.txt中添加

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
 message_generation
)

add_service_files(
  FILES
  AddTwoInts.srv
)

5 编译

注意:.xml中的内容必须填写,否则编译有错误

免责声明:文章转载自《ros学习之消息和服务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇比较两个数组,根据id删除相同的对象5G网络(接入网+承载网+核心网)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ROS学习之日志消息

ROS学习之日志消息 ROS日志系统的核心思想,就是使程序生成一些简短的文本字符流,这些字符流便是日志消息。 0.1严重级别        ROS中,日志消息分为五个不同的严重级别,也可简称为严重性或者级别。按照严重性程度递增,这些级别有       DEBUG       INFO       WARN       ERROR       FATAL 0...

Web Service学习之八:Soap消息详解

一、区别概念   WSDL是网络服务描述语言,是XML文档;它包含一系列描述某个web service的定义或者说是规则。尤其是定义了传输Sope消息的结构   Soap:简单对象访问协议,是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息,应用程序通过 HTTP 来交换信息。在Web Servi...

翻译:如何在Ubuntu16.04上安装Mosquitto这个MQTT消息服务器并对其进行安全配置

原文地址: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-ubuntu-16-04 简介 MQTT是一个在机器和机器之间传递消息的协议,为实现物联网设备间轻量级的发布/订阅通信...

MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场...

云原生时代消息中间件的演进路线

引言 本文以一张云进化历史图开场,来谈谈云原生时代消息中间件的演进路线,但本文绝对不是“开局一张图,内容全靠编”。 从虚拟化技术诞生以来,IaaS/PaaS/SaaS概念陆续被提了出来,各种容器技术层出不穷。到2015年,Cloud Native概念应运而生,一时间,各种云厂商,云服务以及云应用都加上了“云原生”前缀。 我们也一直在思考,传统的消息中间件...

使用云开发数据库构建更生动的小程序

长连接服务被广泛应用在消息提醒、即时通讯、推送、直播弹幕、游戏等场景。本篇文章将介绍云开发数据库的长连接服务 - 实时数据推送,使用它来构建更生动的小程序。 什么是实时数据推送 通过云开发数据库的实时数据推送能力,小程序端可实时监听数据库变更,即它支持根据开发者给定的查询语句进行监听,每当查询语句的结果发生变化时,小程序端就会收到包含更新内容的推送,并对实...