10.创造一个ROSmsg和srv
创造一个ROSmsg和srv(rawmeat:http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv)
注意:本教程翻译于2018.9.19,英文原版教程来自于wiki.ros.org,,内容有可能更新,请以英文原版教程为准。
描述:这个教程将会展现如何创造与构建msg和srv文件,还有rosmsg,rossrv和roscp命令行工具
教程等级:初学者
下一个教程:写一个简单的发布器与订阅器 (python)(c++)
内容 (本教程将只会介绍使用catkin的实例)
1.mag与srv的介绍
2.使用msg
1.创造一个msg
3.使用rosmsg
4.使用srv
1.创造一个srv
2.使用rossrv
5.msg与srv的通常步骤
6.获得帮助
7.复习回顾
8.下一个教程
1. 对于msg和srv的介绍
- msg: msg文件是简单的文本文件,描述了ROS消息的领域,它们被用来产生不同语言中的消息的源代码。
- srv:一个srv文件描述一个服务。由两个部分组成:一个请求和一个回应。
Msg文件被储存在一个package的msg目录里,srv文件被储存在srv目录里。
Msg文件只是简单的文本文件,每一行有一个域类型和域名。你可以使用的域类型有:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
ROS中有一种特殊的类型:Header,header包含了时间戳和坐标系信息,都是ROS中常用的。你将会经常看见一个msg文件中的第一行有Header header。
这儿有一个使用Header的msgs例子,一个字符串原型和两个其他的msgs:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
Srv文件就像是msg文件,但是它们有两个部分:一个请求和一个回应。这两个部分被“—”分开。这儿是一个srv文件的例子:
int64 A
int64 B
—
int64 Sum
在上述的例子中,A和B是请求,sum是回应。
2.使用msg
2.1创造一个msg
让我们在之前的教程中创造的package中定义一个新的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>
<exec_depend>message_runtime</exec_depend>
注意到在构建的时间,我们需要“message_generation”,而在运行的时间,我们只需要"message_runtime"。
在你最喜欢的文档编辑器(从先前的教程中rosed是一个好选择)打开CMakeLists.txt。
增加 message_generation依赖文件到find_package召唤,已经存在在你的CMakeList.txt了,所以你可以产生消息了。你可以做这个简单地增加message_generation到COMPONENTS的名单,使之看起来像这样:
# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
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
# )
通过移除#去掉注释,用你的.msg文件替代Message*.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定义中产生源文件。如果现在就想这样做,省略下一步直接到
Common step for msg and srv
3.使用rosmsg
这是你创造一个msg所需要做的。让我们确保ROS可以看见它,使用rosmsg show命令。
用法:
$ rosmsg show [message type]
例子:
$ rosmsg show beginner_tutorials/Num
你将会看见:
int64 num
在之前的例子中,消息类型包括两个部分:
- beginner_tutorials–消息被定义的package
- Num-- msg Num的名字
如果你不能记住一个msg在哪个package中,你可以留下一个package名.尝试:
$ rosmsg show Num
你将会看见:
[beginner_tutorials/Num]:
int64 num
4. 使用srv
4.1创造一个srv
让我们使用我们刚刚创建的package创造一个srv:
$ roscd beginner_tutorials
$ mkdir srv
我们从另外一个package复制一个已经存在的srv定义,而不是创造一个新的。
对于这个,roscp是一个有用的命令行工具,可以把文件从一个package复制到另一个package。
用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
现在我们可以从roapy_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>
像之前一样,注意到在构建的时候我们使用"message_generation",在运行的时候,我们只使用”message_runtime“。
除非你已经在之前的步骤中对消息使用了这些步骤,在CMakeLists.txt中增加 message_generation依赖文件来产生消息:
# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
(除了它的名字,message_generation对msg和srv同样有作用)
同样地,对于消息的服务,需要对package.xml进行相同的更改,所以查看上面所需的附加依赖项。
移除#为下面的行消除注释:
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
为你的服务文件替换占位符文件Service*.srv:
add_service_files(
FILES
AddTwoInts.srv
)
现在你已经准备从你的服务定义中产生源文件。如果你想要现在就做这个,跳过下一节直接到Common step for msg and srv。
4.2使用 rossrv
这就是你需要做全部来创造一个srv了。让我们确保使用rosssrv show命令,ROS可以看见它。
用法:
$ rossrv show
例子:
$ rossrv show beginner_tutorials/AddTwoInts
你将会看见:
int64 a
int64 b
—
int64 sum
与rosmsg相似,你可以找到像这样的service文件而不用明确的package名称:
$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
—
int64 sum
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
—
int64 sum
这儿,展示了两个服务,第一个是你在beginner_tutorials package中刚刚创建的,第二个是从 rospy_tutorials package已经存在的。
5. 对于msg和srv常用的步骤
除非你已经在之前的步骤中做过了,在CMakeLists.txt中改变:
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
消除注释,增加你依赖的,你的消息使用的(这种情况下std_msgs),含有.msg文件的package,使得看起来如下:
generate_messages(
DEPENDENCIES
std_msgs
)
既然我们已经创造了一些新的消息,我们需要再次创造我们的package:
# In your catkin workspace
$ roscd beginner_tutorials
$ cd …/…
$ catkin_make install
$ cd -
任何在msg的目录的.msg文件将会产生在所有支持的语言中的代码。C++消息Header文件将会产生在~/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,这儿将会有一个”srv“文件夹在”msg“文件夹边上。
在消息描述语言页上可获得消息格式的完整规范。
如果你正在构建使用你新消息的C++节点,你将会也需要声明你的消息与节点之间的依赖关系,正如catkin msg/srv build documentation描述的。
6. 得到帮助
我们已经看见了许多ROS工具。但是记住每个命令需要的参数可能会很困难。幸运的是,大多数Ros工具提供帮助。
尝试:
$ rosmsg -h
你应该会看见一个不同rosmsg的子命令:
Commands:
rosmsg show Show message description
rosmsg list List all messages
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages
你也可以得到子命令的帮助
$ rosmsg show -h
这个展示了rosmsg show需要的参数:
Usage: rosmsg show [options]
Options:
-h, --help show this help message and exit
-r, --raw show raw message text, including comments
7. 复习
让我们列举一下到目前为止我们用到的命令:
rospack = ros+pack(age) :提供和ROS packages相关的信息。
roscd = ros+cd : 改变通往ROS package 或 stack的路径
rosls = ros+ls : 列举一个ROS package中的文件
roscp = ros+cp : 从/向一个ROS package中复制文件
rosmsg = ros+msg : 提供与ROS消息定义相关的信息
rossrv = ros+srv : 提供与ROS服务定义相关的信息
catkin_make : 制作 (编译)一个ROS package
○ rosmake = ros+make : 制作 (编译)一个ROS package (如果你没有在使用一个catkin workspace)
8. 下一个教程
既然你已经制作了一个新的ROS msg和srv,让我们看看写一个简单的发布和接受(python)(C++).
10.创造一个ROSmsg和srv相关推荐
- 商汤科技徐立:AI 将在10 年内创造一个印度和中国的总产值
主讲老师 雷鸣 天使投资人 百度创始七剑客之一 酷我音乐创始人 清华大学海峡研究院大数据 AI 中心 专家委员 特邀讲者 徐立 商汤科技联合创始人 CEO 本科.博士分别毕业于上海交通大学和香港中文大 ...
- 全球互联正在创造一个知识极大丰富和隐私终结的时代
来源:资本实验室 摘要:据预测,到2020年,全球物联网连接设备将超过500亿个,会产生600泽字节的信息.这么庞大的数据量,将如何影响并改变我们的生活和工作? 聚焦前沿科技创新与传统产业升级 据预测 ...
- Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界
2019独角兽企业重金招聘Python工程师标准>>> 创造一个游戏世界 这章教会你如何通过内存中储存的信息创造一个游戏世界.介绍了基本类型和变量并且这些变量是如何储存和改变信息的. ...
- 用一年的时间,依靠SEO创造一个成功的网站
以下内容是一位SEO前辈(站长世界的创始人Brett Tabke)写的,这篇文章在我最初学习SEO时,深刻得影响了我,给我了足够的自信.希望对你也有所帮助. a)准备工作和建立内容. 在你注册域名之前 ...
- 媒体报道|香港科大(广州)创校校长倪明选:“接下来的30年,我们希望再创造一个新的历史”...
30年前,在香港科技大学创校的一批老师创造了奇迹,把香港科大打造成了世界一流的学校.接下来的30年,我们希望再创造一个新的历史. 5月17日下午,香港科技大学(广州)(下简称香港科大(广州))创校校长 ...
- 用计算机创造一个虚拟世界,人类世界或许是一个计算机虚拟世界,你意识到了吗?不敢去细想...
本文参加百家号 #科学了不起# 系列征文赛. 生命已经在地球上繁衍了约38亿年,在如此漫长的生命史上,曾经出现了很多大型物种,作为智慧物种的人类只不过是万千物种中的一个,仅有几百万年发展史的人类只能算 ...
- 用计算机创造一个虚拟世界,希望是悖论:人类世界或许是一个计算机虚拟世界,你意识到了吗?...
生命已经在地球上繁衍了约38亿年,在如此漫长的生命史上,曾经出现了很多大型物种,作为智慧物种的人类只不过是万千物种中的一个,仅有几百万年发展史的人类只能算是生命史中的一个"匆匆过客" ...
- 如何创造一个属于自己的springboot stater
如何创造一个属于自己的springboot stater 什么是stater stater是怎么实现注入进来的 如何进行约定 基于上述理论的demo 实现功能 代码目录 核心实现 spring.fac ...
- 在UE5创造一个多山的松树森林场景学习教程
UE5游戏场景设计制作视频教程 大小解压后:4.37G 1920X1080 mp4 语言:英语+中英字幕(机译)时长:5小时 20分 课程获取:在UE5创造一个多山的松树森林场景学习教程
最新文章
- OpenERP 源码安装一招鲜
- 11-Qt6 QByteArray字节数组类
- Java 对象和类的一些笔记总结
- 无限循环小数转化为分数形式
- .NET常用工具类集锦
- 糖豆人显示此服务器正在进行游戏,糖豆人服务器频繁崩溃,west滚石教技巧,蓝哥踢球做内鬼...
- docker学习记录 docker 脚本----redis,zookeeper,kafka(三)
- SaaSpace:2022年用于数据管理的15种最佳免费数据库软件
- MySQL性能优化(六):分区
- 软件系统设计-1-软件设计原则
- 【dgl学习】dgl的构图和使用
- Pytest+Unittest+Git+Jenkins企业级CICD自动化测试平台建设方案
- JAVA8元空间是什么?
- 【剑桥摄影协会】Photoshop中的USM算法(Unsharp Mask)
- 项目管理关键路径确定方法
- 小米平板4能装Linux系统吗,还在考虑小米平板4要不要入手?看完这十个问题你就有答案了...
- 2022电大国家开放大学网上形考任务-人体解剖生理学(本)非免费(非答案)
- 首次发布!《5G移动通信基站电磁辐射环境监测方法》征求意见
- ListView和CheckBox的混乱问题
- 编程实现古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?