0.概念相关
Nodes:节点,一个节点其实只不过是ROS程序包中的一个可执行文件。ROS节点可以使用ROS客户库与其他节点通信。节点可以发布或接收一个话题(向话题发布消息或者订阅话题以接收消息)。节点也可以提供或使用某种服务。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Servicce:服务,服务是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)。
Msg:描述ROS messages内容的简单text文件,它们用来生成不同语言的messages源码。
Srv:一个srv文件描述一个服务,它由两部分组成:一个请求和一个回应。 msg文件存放在一个软件包的msg目录中,而srv文件则存放在srv目录中。
0.1msg和srv究竟干什么用
- msg:msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
- srv:一个srv文件描述一项服务。它包含两个部分:请求和响应。所以srv文件具体描述的就是一个服务中请求和响应分别要求的消息格式。
1.该如何定义msg和srv?
要定义这两个东西,那就需要.msg和.srv文件。那么得有个地方来放置这两个文件,总不能随便找个地儿放着就指望着它起作用吧。
那么,它们应该被放在哪里呢?.msg:这个文件应该被放在package目录下的msg文件夹里.srv:这个文件应该被放在package目录下的srv文件夹里
什么?你说没有这两个文件夹?
没有那就新建啊!
比如我的工作空间名叫catkin_ws,package名叫demo,那么:
cd catkin_ws/src/demo
mkdir msg
mkdir srv
在终端中这样操作不就行了。
1.0.msg文件的定义:
ROS消息由每个ROS包的msg目录中的消息定义文件说明。这些文件会被编译成与编程语言有关的的实现版本,这样你才能在写代码的时候使用这些消息结构。这意味着及时你使用的是一种解释型的编程语言,例如Python。你依然需要运行catkin_make编译一次消息定义文件。否则将无法生成可用的实现文件,Python将找不到你自定义的消息类型。
同样的道理,如果你修改完消息定义文件以后,忘记重新编译的话,那么你使用的消息依旧是老版本。
虽然这种机制听起来好像很麻烦,但是这其实是一种一劳永逸的方法,因为我们只需要定义一次消息,接着在所以ROS支持的编程语言中我们都可以使用这种消息。
ROS消息定义文件通常十分简短易懂,都是每一行一个类型名加一个变量名的格式。类型名是ROS的基础类型,或者来自其他包里定义的类型,或者是像Header这样的特殊类型。
像下面这样子的,就形成了一个简单的.msg文件。
int32 data1
string data2
1.1.srv文件的定义:
创建一个新服务的第一步是要定义服务调用的输入和输出。那么.srv文件的用武之地就来了。我们通过编辑.srv文件及服务定义文件来完成对server调用的I/O的定义。.srv有着跟消息定义文件相同的结构,但是由于server既有输入又有输出,所以要比消息定义稍微复杂一丢丢。
那么.srv文件究竟如何编写呢?
很简单:
#part1
input information
---
#part2
output information
--- 上面是request 下面是response
就这么简单?没错就是这么简单!
具体例子:
int32 a
int32 b
---
int32 sum
.具体例子
2、简单的主题发布者和订阅者
2.1 主题发布者节点
在package下创建src/talker.cpp,在cpp文件下输入如下程序:
//ros/ros.h是一个实用的头文件,它引用了ROS系统中大部分常用的头文件,使用它会使得编程很简便。
#include "ros/ros.h"
//这引用了ros_test/my_msg 消息, 它存放在ros_test package里,是由my_msg.msg文件自动生成的头文件。
#include<ros_test/my_msg.h>
#include <sstream&g
ROS中msg和srv的定义与使用

本文围绕ROS展开,介绍了Nodes、Messages、Topics、Servicce等概念,阐述了msg和srv的用途。详细说明了msg和srv文件的定义及存放位置,还给出了简单主题发布者和订阅者、服务器和客户端的编写步骤,以及msg和srv文件的编译依赖配置。
最低0.47元/天 解锁文章
683

被折叠的 条评论
为什么被折叠?



