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
)
如今全部的文件都准备好了。总结一下,大概有这么几个步骤:
- 在msg文件夹下使用msg文件语法定义一个msg
- 改动
CmakeLists.txt
。在find_package
调用中,加入message_generation
依赖 - 改动
CmakeLists.txt
,在catkin_message
下加入message_runtime
依赖 - 改动
CmakeLists.txt
,去掉add_message_files
凝视,加入我们自定义的msg文件 - 改动
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的更多相关文章
- ROS学习手记 - 7 创建ROS msg & srv
至此,我们初步学习了ROS的基本工具,接下来一步步理解ROS的各个工作部件的创建和工作原理. 本文的详细文档:http://wenku.baidu.com/view/623f41b3376baf1ff ...
- ROS学习笔记五:创建和使用ROS msg和srv
1 msg和srv简介 1.1 msg文件 msg文件就是一个简单的text文件,其中每行有一个类型和名称,可用的类型如下: int8, int16, int32, int64 (plus uint* ...
- 建立一个ROS msg and srv
msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码. srv文件描述一个服务,它由请求和响应两部分组成. msg文件被存储在一个包的msg目录下,srv文件被存储在 ...
- 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 ...
- ros msg和srv使用
在包文件中新建文件夹srv和msg,在这两个文件夹中新建test.msg,test.srv 修改apckage.xml 添加以下内容 <build_depend>:message_gene ...
- Ros中创建msg和srv遇到的问题
在创建msg和srv文件之后,使用srv和msg文件时候需要对xml文件进行修改,如下: <build_depend>message_generation</build_depend ...
- ROS学习(十一)—— msg srv
一.msg 和 srv介绍 1.定义 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本.它们会被用来生成不同语言的源代码 服务(srv): 一个srv文件描述一项服务.它包含两 ...
- ROS中msg和srv文件的区别
1.msg和srv究竟有什么区别?? msg只是单向的发送和接受. srv包含两个部分:请求和响应. 2.msg和srv简介 msg:msg文件是描述ROS消息字段的简单文本文件.它们用于为不同语言( ...
- 创建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 ...
随机推荐
- BZOJ-2330-[SCOI2011]糖果(差分约束)
Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- javascript 二维(多维)数组的复制问题
最近在项目中遇到一个动画暂停的效果,需要在动画停止的时候检测当前坐标和已经运行的时间,从而调节时间轴为再次运行时加速. 但是在数组保存方面折腾了半天. var orbitArray = [], lin ...
- Web桌面应用框架3:Web桌面应用开发的N种Style
研究Web桌面应用开发有一段时间了,总结了Web桌面应用开发的一些主流方式. 一.前端Style 这种方式的就是直接实现一个Web程序,再封装一个浏览器展示,相当粗暴和有效.著名的框架就是Electr ...
- WebService--jax-spring集成
如果使用javax.jws内容编写webservice,则只能通过将程序打成jar包的形式运行,如果要想通过web容器进行发布,则需要使用其他webservice框架.下面介绍jaxws与spring ...
- Python学习--字典
在Python中通过名字来引用值的数据结构称为映射(mapping).字典是Python中唯一内建(Python解释器本身支持,不需要import)的映射类型.字典中的值没有特殊的顺序,都存储在一个特 ...
- Socket网络编程之概述理解
今天主要讲讲什么是socket网络编程 socketde 英文原义是"孔"或者"插座".是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机 ...
- mysql数据库第一弹
mysql(一) sql语句 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要 ...
- 后端自动化版本管理,再也不用改URL了!
每次升级接口版本时,后端.前端.客户端都是痛苦的: 后端:要兼容旧版客户端,以前的接口不能动啊,又得写新接口.新文档了,唉! 前端:还好,就是版本号到处都是,改起来比较烦. Android:快点啊产品 ...
- android sdk manager 国内镜像
//东软信息学院 mirrors.neusoft.edu.cn 80 //北京化工大学 ubuntu.buct.edu.cn/ubuntu.buct.cn 80 //中国科学院开源协会 mir ...
- python学习笔记 tuple
1. ()去声明.与list类似,但是其元素不能改变. 2. 需要注意的是1中的不能改变是指()中的元素不能改变,如果其元素是一个list,那么list中的元素是可以改变的,不论是大小还是其他的. 3 ...