建立一个ROS msg and srv

msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码。

srv文件描述一个服务,它由请求和响应两部分组成。

msg文件被存储在一个包的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的msg的例子:

  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是响应。


接下来我们在之前定义的包中定义一个新的消息

$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

当然我们能够增加多一些信息到这个消息文件中:

string first_name
string last_name
uint8 age
uint32 score

然后确保我们的消息文件能够转换成C++的源代码。需要做的是:

(1)打开package.xml,确保小面的两行在其中:

<build_depend>message_generation</build_depend>
 <run_depend>message_runtime</run_depend>

在构建的时候,我们需要“message_generation”在运行时我们需要”message_runtime”。

(2)打开CMakeLists.txt,可以使用我们前面学的rosed命令:

rosed beginner_tutorials CMakeLists.txt

添加message_generation依赖到find_package中,这样就能产生消息.

# 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
)

添加CATKIN_DEPENDS message_runtime,如下:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

找到下面的代码片:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

把它修改为:

add_message_files(
  FILES
  Num.msg
)

手动的加入这个.msg文件,我们就能让CMake知道什么时候需要重新配置我们的工程。

接下来我们必须确保generate_messages()函数被调用,我们要打开下面的代码:

generate_messages(
  DEPENDENCIES
  std_msgs
)

接下来我们就能从我们的消息定义中产生源码文件了。


不着急生产源码文件,先学习一些其他的命令,我们利用命令行工具rosmsg show来查看消息的详细信息:

$ rosmsg show [message type]

举个例子:

$ rosmsg show beginner_tutorials/Num

返回结果:

int64 num

这里我们看到一个消息的类型包括两个部分:

beginner_tutorials -- 消息被定义的包的名字

Num -- 消息Num的名字

当然如果你忘记了消息在哪个包里面了,也可以不用包的名字:

$ rosmsg show Num

它会显示出你的包的类型和详细信息。

[beginner_tutorials/Num]:
int64 num

看完了消息,我们再来看一下服务的相关内容:

创建一个srv的目录:

$ roscd beginner_tutorials
$ mkdir srv

我们这里从其他的工程中拷贝一个srv的定义。roscp这个命令行工具可以帮助我们从一个工程中拷贝文件到另一个工程中。

$ roscp [package_name] [file_to_copy_path] [copy_path]

接下来我们从rospy_tutorials这个包中拷贝一个服务。

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

roscp会在rospy_tutorials这个包中搜索AddTwoInts.srv文件。然后拷贝到指定的路径中去。

与前面的消息类似,服务文件也需要确保能够转换为C++或者其他语言的源代码。

(1)打开package.xml,确保小面的两行在其中:

<build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>

(2)打开CMakeLists.txt文件:

添加message_generation依赖到find_package中,其实前面我们已经配置过了,不管message_generation这个东东的名字怎样,它对msg和srv都起到作用。

add_service_files()修改成:

add_service_files(
  FILES
  AddTwoInts.srv
)

这样我们就能够从我们定义的服务中产生源码文件了。


下面还是先来看一下有关服务的一些命令行工具,如rossrv show命令行:

$ rossrv show <service type>

例如:

$ rossrv show beginner_tutorials/AddTwoInts

得到结果:

int64 a
int64 b
---
int64 sum

和rosmsg show 一样,如果忘记了包的名字,可以直接show服务的名字:

$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

会自动给出srv的类型和详细的信息。



上面的所有的文件的配置都设置好了,接下来我们看一下如何将上述的文件生成为ros支持的语言代码,打开CMakeLists.txt:

首先在CMakeLists.txt文件中找到下面的代码:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

对这段代码取消注释,如果用到了一些.msg的文件,那么就把包含这些文件的包增加为依赖。

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在我们增加了一些新的信息,然后就需要重新编译这些包:

# In your catkin workspace
$ cd ../..
$ catkin_make
$ cd –        //回到之前的目录

所有在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/

到现在为止,我们完成了消息和服务的一些任务,最后说一些有关于命令的东西,这些命令都有帮助的提示。

例如:

$ rosmsg -h

或者:

rosmsg show -h
时间: 2024-11-06 12:44:44

建立一个ROS msg and srv的相关文章

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, i

创建一个ROS msg

1. msg •msg:msg文件是简单的文本文件,用于描述ROS中消息(消息的各个参数项).用于为不同的编程语言生成有关消息的源代码. •srv:描述服务的文件,由两部分组成:请求和反馈: msg文件放置在功能包的msg目录下,srv文件放置在srv目录下. msgs只是一些每行带有类型和名字的文本文件,可以使用的类型如下:•        int8, int16, int32, int64 (plus uint*)•        float32, float64•        strin

ROS学习(十一)—— msg srv

一.msg 和 srv介绍 1.定义 p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本.它们会被用来生成不同语言的源代码 服务(srv): 一个srv文件描述一项服务.它包含两个部分:请求和响应. p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 2.存放位置 p { margin-botto

编写第一个ROS(创建工作空间workspace和功能包package)

刚接触ROS,学着写了第一个程序,怕以后忘记,就将其步骤记录下来.. 首先你必须保证你电脑已安装配置好ROS. 1.创建工作空间(workspace) 我们所创建功能包package,应该全部放到一个叫做工作空间(workspace)的目录中 .你可以把目录存储在你账号的任何位置例如,我所创建的工作空间的是路径/home,同时你可以用任何你喜欢的名字命名你的工作空间,我的工作空间名为 test,现在请使用标准的mkdir命令行去创建一个工作空间.我首先建立一个工作空间,名字为test, 此处创建

建立一个简易登录界面

#include<windows.h> LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; HFONT hfont, ohfont; static HWND hwndedit, hedit, hwndButton; switch(message) { case WM_CREATE: //应用程序建立一个窗口 hwnde

vue+nodejs+express+mysql 建立一个在线网盘程序

vue+nodejs+express+mysql 建立一个在线网盘程序 目录 vue+nodejs+express+mysql 建立一个在线网盘程序 第一章 开发环境准备 1.1 开发所用工具简介 1.2 安装 MySQL 1.2.1 下载安装 MySQL 1.2.2 可能出现的问题和解决方案 1.3 安装 vue-cli 1.4 安装 express 第二章 数据库设计和创建 2.1 数据库和表设计 2.2 user 表 2.3 file 表 2.4 创建数据库和表所用 sql 语句参考 第三

编写第一个ROS程序-发布器(Publisher)

在上一篇文章中我们安装好了ROS环境.本篇文章我们将熟悉ROS中的一些概念(Concept),并尝试使用C++来实现一个发布器(Publisher)和一个订阅器(Subscriber). 该文章是个人学习ROS的过程记录,参考的书是中文版<ROS机器人编程:原理与应用>,英文版为A Systematic Approach to Learning Robot Programming with ROS,该书代码托管在作者wsnewman的github上,感谢作者的辛苦付出. 该篇文章分为以下几个部

c语言:写一个函数建立一个有3名学生数据的单向动态链表

写一个函数建立一个有3名学生数据的单向动态链表. 解:程序: #include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Student) struct Student { long num; float score; struct Student *next; }; int n; struct Student *creat(void)//定义函数返回一个指向链表头的指针 { struct Student *head

如何建立一个GPU加速的研究计算集群(一)

世界上某些最快的计算机是集群组成的.集群是有多个计算机通过高速网络连接起来的一个计算系统.集群计算机比单台计算机可以达到更高的可用性,可靠性和伸缩性.随着对基于GPU的高性能计算采用越来越广,英伟达GPU逐渐成为世界上最厉害的超级计算集群的一部分.世界前500的超级计算机中,包括差不多50个采用了英伟达的的GPU,并且目前世界上最快的计算机泰坦,使用了大约18000个英伟达开普勒GPU. 在这个帖子中,我将会一步一步的介绍设计.部署和管理一个小型的GPU集群整个过程.我会介绍GPU集群的组成部分