7、创建ROS msg和srv

一、msg和srv介绍

msg: msg文件使用简单的文本格式声明一个ROS message的各个域。仅需要创建一个msg文件,就可以使用它来生成不同语言的message定义代码。

srv:srv文件则声明了一个服务,包括request(请求)和response(响应)。

msg文件和srv文件分别存储在包的msg目录和srv目录下。

1、msg文件

msgs是简单的txt文件,每行定义一个信息域,每行的格式为:

信息域的名称 信息域的类型

信息域的类型有以下几种:

 int8, int16, int32, int64 (plus uint*)
 float32, float64
 string
 time, duration
 other msg files
 variable-length array[] and fixed-length array[C] 

这里是一个示例,此例使用了一个Header类型,一个原始字符串类型,还有两个其他预定义好的其他类型:

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

2、srv文件

srv文件和msg文件类似,唯一不同的是它包含两个部分——request和response。两部分用---分隔:

int64 A
int64 B
---
int64 Sum

上面的示例中,A和B是request,Sum是response。

二、使用msg

1、创建一个msg

让我们在前面创建的包beginner_tutorials中使用msg文件定义一个msg,如果此包已被删除的话,请参考本系列的第一篇文章重新创建这个包。

首先进入包目录:

roscd beginner_tutorials

创建一个msg目录:

mkdir msg

然后使用以下方式创建Num.msg文件(你也可以自行创建,使用编辑器编辑后保存):

echo "int64 num" > msg/Num.msg

上面创建的文件仅包含一行,当然你也可以向其中添加更多的信息域,每个一行,例如:

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文件,在find_message调用中添加message_generation依赖,让你可以生成ROS信息。

如下所示,括号里添加一项message_generation即可:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

你也许注意到有时你构建项目的时候,即使你没有在CMakeLists.txt中调用find_package,仍然构建正常。这是因为catkin将你所有的项目集成到一起,只要你之前的项目调用了find_package,现在的项目就会被配置为相同的调用。但是这是存在隐患的,当你独立构建一个项目的时候,缺少find_package调用会导致构建失败。

然后同上面类似,确保你加入了message_runtime 依赖,如图所示:

然后找到如下代码段:

去掉注释,改为:

add_message_files(
  FILES
  Num.msg
)

然后,确保generate_messages()函数被调用:

去掉注释,修改为:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在所有的文件都准备好了,总结一下,大概有这么几个步骤:

  1. 在msg目录下使用msg文件语法定义一个msg
  2. 修改CmakeLists.txt,在find_package调用中,添加message_generation依赖
  3. 修改CmakeLists.txt,在catkin_message下添加message_runtime依赖
  4. 修改CmakeLists.txt,去掉add_message_files注释,添加我们自己定义的msg文件
  5. 修改CmakeLists.txt,去掉generate_messages()的注释

三、使用rosmsg

我们可以使用rosmsg命令查看我们定义的msg的详细信息,以确保它能被ROS正确识别:

rosmsg show beginner_tutorials/Num

会得到:

int64 num

如果你忘了msg位于哪个包中,你也可以省略包名:

rosmsg show Num

得到:

[beginner_tutorials/Num]:
int64 num

四、使用srv

1、创建一个srv

同样是先定义srv文件:

roscd beginner_tutorials
mkdir srv

避免手动创建的麻烦,我们可以使用roscp命令从其他包里拷贝一份srv文件出来,用法:

roscp [package_name] [file_to_copy_path] [copy_path]

在这里,我们从rospy_tutorials拷贝一份srv文件出来:

roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

同上面类似的,确保srv文件能够被转为代码,我们需要向package.xml中添加内容:

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

这里前一步创建msg的时候已经做过了,所以在这里我们可以省略这一步。

同样的,添加message_generation依赖,我们也做过了:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
 message_generation
)

接下来就是要将我们的srv文件添进项目了:

找到这段:

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

去掉注释且修改为:

add_service_files(
  FILES
  AddTwoInts.srv
)

可以发现,创建srv的流程同msg基本一致。

2、使用rossrv

我们可以使用rossrv命令查看我们创建的服务的信息,确保它被ROS正确识别:

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

五、使用msg和srv的基本流程

1、msg依赖

我们在前面已经做过这一步,修改CMakeLists.txt :

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

去掉注释,然后添加我们依赖的任何包:

generate_messages(
  DEPENDENCIES
  std_msgs
)

这里解释一下依赖的问题,像前面介绍的那样,我们在编写msg文件时,不止可以使用原生的int、string等类型,有时候也会用到其他包里预定义好的信息类型,比如前面的例子中的geometry_msgs/PoseWithCovariance pose,当我们需要用到其他包里定义好的信息时,我们就要声明对其他包的依赖,比如上面的例子里我们就要声明一个geometry_msgs的依赖。

而在前面的例子中,我们的msg文件中只有这一行:

int64 num

仅仅使用了原生的int类型,所以我们只需要声明std_msgs依赖即可。

2、开始构建

所有的msg和srv文件已定义好,CmakeLists.txt文件也已经修改好,现在我们就可以构建我们的beginner_tutorial包了。

现在我们位于beginner_tutorial包的目录下,执行以下命令进入工作空间的顶层目录:

cd ../..

执行:

catkin_make install

现在,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/ 里。

同msg的位置类似,C++的srv头文件与msg头文件位于同一目录下,而python和lisp在msg目录之外存在一个srv目录存放srv文件生成的代码。

六、获取帮助

我们已经学习了很多ROS命令,记住每个命令的参数和用法是很困难的,我们可以使用帮助查看具体用法。

例如:

rosmsg -h

或者:

rosmsg show -h

七、复习

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)
时间: 2024-11-05 13:27:58

7、创建ROS msg和srv的相关文章

建立一个ROS msg and srv

msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码. srv文件描述一个服务,它由请求和响应两部分组成. msg文件被存储在一个包的msg目录下,srv文件被存储在srv目录下.msg是简单的文本文件,它的每一行由一个字段的类型和字段的名称组成. 你可以使用的字段的类型有: int8, int16, int32, int64 (plus uint*) float32, float64 string time, duration other msg files

ROS学习(十一)—— msg srv

一.msg 和 srv介绍 1.定义 p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本.它们会被用来生成不同语言的源代码 服务(srv): 一个srv文件描述一项服务.它包含两个部分:请求和响应. p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 2.存放位置 p { margin-botto

创建ros的程序包--3

创建ros的程序包(原创博文,转载请标明出处--周学伟) 1.一个catkin程序包由什么组成? 一个程序包要想称为catkin程序包必须符合以下要求: 该程序包必须包含catkin compliant package.xml文件 这个package.xml文件提供有关程序包的元信息. 程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用. 每个目录下只能有一个程序包. 这意味着在同一

创建ROS工程結構

图像化显示目录工程结构:tree $ sudo apt install tree 创建ROS工作空间 $ mkdir -p catkin_ws/src # Create mutil-level directory $ cd catkin_ws/ $ catkin_make #Initialization $ catkin_create_pkg package_name #create a package $ catkin_create_pkg package_name Dependency_na

创建一个ROS msg

1. msg •msg:msg文件是简单的文本文件,用于描述ROS中消息(消息的各个参数项).用于为不同的编程语言生成有关消息的源代码. •srv:描述服务的文件,由两部分组成:请求和反馈: msg文件放置在功能包的msg目录下,srv文件放置在srv目录下. msgs只是一些每行带有类型和名字的文本文件,可以使用的类型如下:•        int8, int16, int32, int64 (plus uint*)•        float32, float64•        strin

创建ROS工作空间和包

一.创建工作空间 mkdir -p ~/openni_ws/src cd ~/openni_ws catkin_make        //在catkin工作空间(openni_ws)下catkin_make,结果产生build和devel文件夹 source devel/setup.bash 二.创建package(包) cd ~/openni_ws/src            //所有package都放在src下,src/package1,package2,package3... catk

创建ROS的Package(功能包)

本文讲如何用catkin创建一个ROS的package 1. catkin package的组成:一定要包含CMakeLists.txt及package.xml文件 my_package/ CMakeLists.txt package.xml 此外,每个package必须要有他自己的文件夹. 2. 推荐使用catkin workspace来处理catkin package workspace_folder/ -- WORKSPACE src/ -- SOURCE SPACE CMakeLists

创建ROS功能包(四)

为了方便直接用ROS的create-pkg命令行工具 roscreate-pkg chapter2_tutorials std_msgs rospy roscpp std_msgs 包含了常见的消息类型,表示基本数据类型和其他的基本的消息构造,如多维数组. rospy 一个ROS的纯Python客户端库. roscpp 使用c++实现ROS的各种功能. 如果所有步骤正确执行,显示结果 编译功能包 rosmake chapter2_tutorials 几秒后,你会看见: 如果没有错误信息提示,说明

ros wiki翻译之创建消息和服务

描述:本教程介绍如何创建和构建msg和srv文件以及rosmsg,rossrv和roscp命令行工具. 1 msg和srv简介 msg:msg文件是描述ROS消息字段的简单文本文件.它们用于为不同语言(c++或者python等)的消息生成源代码. srv:srv文件用来描述服务.它由两部分组成:请求(request)和响应(response). msg文件存储在包的msg目录中,而srv文件存储在srv目录中. msg只是简单的文本文件,每行有一个字段类型和字段名称.您可以使用的字段类型有(如同