关于ros的msg和srv教程

本文详细介绍了ROS中msg和srv文件的创建与使用过程,包括如何定义消息字段、服务请求与响应,以及如何将这些文件转换为源代码。通过实际操作指导,帮助读者掌握ROS消息和服务的基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于msg文件和srv文件教程:

参考官网地址:http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv
msg:msg文件是描述ROS消息字段的简单文本文件。它们用于生成不同语言的消息的源代码。

srv:srv文件描述服务。它由两部分组成:请求和响应。

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

msgs只是简单的文本文件,每行有一个字段类型和字段名称。您可以使用的字段类型是:

int8,int16,int32,int64(加上uint *)
float32,float64

时间,持续时间
其他的msg文件
变长数组[]和定长数组[C]
ROS中还有一种特殊类型:标题,标题包含ROS中常用的时间戳和坐标框架信息。您经常会看到msg文件中的第一行有Header头。

以下是使用Header,字符串原语和其他两个消息的msg的示例:

> Header header   string child_frame_id  
> geometry_msgs/PoseWithCovariance pose		//其他的msg文件  
> geometry_msgs/TwistWithCovariance twist	//其他的msg文件

srv文件就像msg文件一样,除了它们包含两部分:请求和响应。这两部分用’—'线分开。以下是srv文件的示例:

int64 A
int64 B
— (此处为三个-)
int64 Sum

在上面的例子中,A和B是请求,Sum是响应。

msg文件的编写:
首先创建msg文件夹存放msg文件:
gedit filename.msg
按照上面有的类型写入信息:例如:

int64 num
string first_name
string last_name
uint8 age
uint32 score

不过还有一个步骤。我们需要确保将msg文件转换为C ++,Python和其他语言的源代码
打开package.xml文件,确保这两行都在并取消注释:

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

请注意,在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。
将message_generation依赖项添加到您的CMakeLists.txt中已存在的find_package调用,以便您可以生成消息。你可以通过简单地将message_generation添加到COMPONENTS列表来实现这一点,使它看起来像这样:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

您可能会注意到,即使您没有使用所有依赖项调用find_package,您的项目也可以正常构建。这是因为catkin将所有项目合并为一个,因此如果早期项目调用find_package,则会为您配置相同的值。但是忘记调用意味着你的项目在隔离构建时很容易破坏。
还要确保导出消息运行时依赖项。(…省略号表示的是其他的文件)

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

在教程中为:

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES beginner_tutorials
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
  DEPENDS system_lib
)

找到以下代码块:

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

通过删除取消它#符号,然后重新装上FILES和您的msg文件。使得它看起来是这样的:

add_message_files(
  FILES
  Num.msg
)

通过手动添加.msg文件,我们确保CMake知道在添加其他.msg文件后何时必须重新配置项目。
现在我们必须确保调用generate_messages()函数。
对于kinetic版本,您需要取消注释这些行:

#geneal_messages(
#DEDENDENCIES
#std_msgs
#)

它看起来像:

generate_messages(
  DEPENDENCIES
  std_msgs
)

srv文件的编写:

首先创建一个srv的专属文件夹:

$ mkdir 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>
<exec_depend>message_runtime</exec_depend>

#不要只将此行添加到CMakeLists.txt,修改现有行(前文对msg文件操作已经做过)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

此外,您需要对package.xml进行与msg相同的更改,因此请查看上面所需的其他依赖项。
删除#以取消注释以下行:

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

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

add_service_files(
  FILES
  AddTwoInts.srv			//这个是你自己的srv文件
)

如此,您便已准备好从服务定义生成源文件。
回到catikin_ws工作空间,输入

$ catkin_make install

就可以了

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’文件夹。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值