一、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)

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

  1. ROS学习手记 - 7 创建ROS msg & srv

    至此,我们初步学习了ROS的基本工具,接下来一步步理解ROS的各个工作部件的创建和工作原理. 本文的详细文档:http://wenku.baidu.com/view/623f41b3376baf1ff ...

  2. ROS学习笔记五:创建和使用ROS msg和srv

    1 msg和srv简介 1.1 msg文件 msg文件就是一个简单的text文件,其中每行有一个类型和名称,可用的类型如下: int8, int16, int32, int64 (plus uint* ...

  3. 建立一个ROS msg and srv

    msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码. srv文件描述一个服务,它由请求和响应两部分组成. msg文件被存储在一个包的msg目录下,srv文件被存储在 ...

  4. Creating a ROS msg and srv

    msg: msg files are simple text files that describe the fields of a ROS message. They are used to gen ...

  5. ros msg和srv使用

    在包文件中新建文件夹srv和msg,在这两个文件夹中新建test.msg,test.srv 修改apckage.xml 添加以下内容 <build_depend>:message_gene ...

  6. Ros中创建msg和srv遇到的问题

    在创建msg和srv文件之后,使用srv和msg文件时候需要对xml文件进行修改,如下: <build_depend>message_generation</build_depend ...

  7. ROS学习(十一)—— msg srv

    一.msg 和 srv介绍 1.定义 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本.它们会被用来生成不同语言的源代码 服务(srv): 一个srv文件描述一项服务.它包含两 ...

  8. ROS中msg和srv文件的区别

    1.msg和srv究竟有什么区别?? msg只是单向的发送和接受. srv包含两个部分:请求和响应. 2.msg和srv简介 msg:msg文件是描述ROS消息字段的简单文本文件.它们用于为不同语言( ...

  9. 创建ros消息时出现:Unable to load msg [planning/Num]: Cannot locate message [Num]: unknown pack.....

    创建ros消息可参考创建ROS消息和ROS服务. 按照这个教程进行创建的过程中出现了如下错误: Unable to load msg [msgs/locate]: Cannot locate mess ...

随机推荐

  1. Icon font font face

    font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6:   ...

  2. Visual formatting model 可视化格式模型

    在可视化格式模型里,每个元素都是由一个或者多个盒子组成,这些盒子的布局由下面规则控制: box dimensions and type.(块元素和行内元素) positioning scheme (n ...

  3. 02.JSP内置对象

    一.内置对象:不再由用户进行实例化而可以直接使用的对象,一共九种,一定要清楚的记住每种内置对象的类型,以方便查询文档. 二.四种属性保存范围 1,  属性保存范围:指一个设置的对象,可以经过多少个其他 ...

  4. Vue.js用法详解(一)更新中~

      前  言 前段时间为了一个数据查询的项目自学了Vue,感觉这款框架还是很不错的,今天就整理整理这个框架如何使用,希望对正在学这个框架的小伙伴有所帮助~ 首先,我们先来了解一下Vue: Vue.js ...

  5. Maven2的配置文件settings.xml

    简介: 概览 当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置.这包含 ...

  6. css基础-选择器

    CSS选择符(选择器) 一.各类选择器 选择符表示要定义样式的对象,可以是元素本身,也可以是一类元素或者制定名称的元素. 常用的选择符有十种左右 类型选择符,id选择符,class选择符,通配符,群组 ...

  7. CCLuaObjcBridge - Lua 与 Objective-C 互操作的简单解决方案

    http://dualface.github.io/blog/2013/01/27/call-objectivec-from-lua/ 月初的时候,发了一篇关于 Lua 与 Java 互操作的文章,里 ...

  8. HTML5学习指导路线

    HTML5是现在热门的技术,经过8年的艰苦努力,该标准规范终于制定完成,在这里为想要学习HTML5初级程序员详细划分一下学习内容和步骤,让大家清楚的知道HTML5需要学什么?能够快速掌握HTML5开发 ...

  9. 十五、Hadoop学习笔记————Zookeeper客户端的使用

    timeout表示会话超时时间,zookeeper靠与客户的心跳来判断会话是否有效(单位毫秒), -r为只读,表示zookeeper如果与半数以上服务器失去连接则会停止服务,如果有-r参数,则会继续保 ...

  10. iphone6 plus导入联系人或者通讯录

    iphone6 plus快速导入联系人或者通讯录(使用QQ同步助手,真的很简单) 最近换了部手机,由于之前的手机保存联系人都是保存在手机,没有备份在sim卡,由于sim卡被我剪小了,不能插回原来的手机 ...