创造一个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相关推荐

  1. 商汤科技徐立:AI 将在10 年内创造一个印度和中国的总产值

    主讲老师 雷鸣 天使投资人 百度创始七剑客之一 酷我音乐创始人 清华大学海峡研究院大数据 AI 中心 专家委员 特邀讲者 徐立 商汤科技联合创始人 CEO 本科.博士分别毕业于上海交通大学和香港中文大 ...

  2. 全球互联正在创造一个知识极大丰富和隐私终结的时代

    来源:资本实验室 摘要:据预测,到2020年,全球物联网连接设备将超过500亿个,会产生600泽字节的信息.这么庞大的数据量,将如何影响并改变我们的生活和工作? 聚焦前沿科技创新与传统产业升级 据预测 ...

  3. Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界

    2019独角兽企业重金招聘Python工程师标准>>> 创造一个游戏世界 这章教会你如何通过内存中储存的信息创造一个游戏世界.介绍了基本类型和变量并且这些变量是如何储存和改变信息的. ...

  4. 用一年的时间,依靠SEO创造一个成功的网站

    以下内容是一位SEO前辈(站长世界的创始人Brett Tabke)写的,这篇文章在我最初学习SEO时,深刻得影响了我,给我了足够的自信.希望对你也有所帮助. a)准备工作和建立内容. 在你注册域名之前 ...

  5. 媒体报道|香港科大(广州)创校校长倪明选:“接下来的30年,我们希望再创造一个新的历史”...

    30年前,在香港科技大学创校的一批老师创造了奇迹,把香港科大打造成了世界一流的学校.接下来的30年,我们希望再创造一个新的历史. 5月17日下午,香港科技大学(广州)(下简称香港科大(广州))创校校长 ...

  6. 用计算机创造一个虚拟世界,人类世界或许是一个计算机虚拟世界,你意识到了吗?不敢去细想...

    本文参加百家号 #科学了不起# 系列征文赛. 生命已经在地球上繁衍了约38亿年,在如此漫长的生命史上,曾经出现了很多大型物种,作为智慧物种的人类只不过是万千物种中的一个,仅有几百万年发展史的人类只能算 ...

  7. 用计算机创造一个虚拟世界,希望是悖论:人类世界或许是一个计算机虚拟世界,你意识到了吗?...

    生命已经在地球上繁衍了约38亿年,在如此漫长的生命史上,曾经出现了很多大型物种,作为智慧物种的人类只不过是万千物种中的一个,仅有几百万年发展史的人类只能算是生命史中的一个"匆匆过客" ...

  8. 如何创造一个属于自己的springboot stater

    如何创造一个属于自己的springboot stater 什么是stater stater是怎么实现注入进来的 如何进行约定 基于上述理论的demo 实现功能 代码目录 核心实现 spring.fac ...

  9. 在UE5创造一个多山的松树森林场景学习教程

    UE5游戏场景设计制作视频教程 大小解压后:4.37G 1920X1080 mp4 语言:英语+中英字幕(机译)时长:5小时 20分 课程获取:在UE5创造一个多山的松树森林场景学习教程

最新文章

  1. OpenERP 源码安装一招鲜
  2. 11-Qt6 QByteArray字节数组类
  3. Java 对象和类的一些笔记总结
  4. 无限循环小数转化为分数形式
  5. .NET常用工具类集锦
  6. 糖豆人显示此服务器正在进行游戏,糖豆人服务器频繁崩溃,west滚石教技巧,蓝哥踢球做内鬼...
  7. docker学习记录 docker 脚本----redis,zookeeper,kafka(三)
  8. SaaSpace:2022年用于数据管理的15种最佳免费数据库软件
  9. MySQL性能优化(六):分区
  10. 软件系统设计-1-软件设计原则
  11. 【dgl学习】dgl的构图和使用
  12. Pytest+Unittest+Git+Jenkins企业级CICD自动化测试平台建设方案
  13. JAVA8元空间是什么?
  14. 【剑桥摄影协会】Photoshop中的USM算法(Unsharp Mask)
  15. 项目管理关键路径确定方法
  16. 小米平板4能装Linux系统吗,还在考虑小米平板4要不要入手?看完这十个问题你就有答案了...
  17. 2022电大国家开放大学网上形考任务-人体解剖生理学(本)非免费(非答案)
  18. 首次发布!《5G移动通信基站电磁辐射环境监测方法》征求意见
  19. ListView和CheckBox的混乱问题
  20. 编程实现古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

热门文章

  1. 最全SpringCloud面试题及答案,面试官被摩擦系列
  2. Smart200控制两台V90伺服,绝对定位和速度控制,有屏程序,PN通信
  3. 关于PVS-Studio如何在用于... PVS-Studio的库中发现错误的故事
  4. 关于利用7812和7912单电压转双电压的探讨
  5. Mysql面试必备知识点
  6. Android录音-SoundTouch移植到Android
  7. 神经切断是近视眼形成的根本原因
  8. 在android中如何调用系统的程序安装器来安装apk
  9. border绘制边框
  10. 如何架设安全的交换机系统