目录

  • ROS msg和srv的介绍
  • 使用msg
    • 创建一个msg
    • 使用rosmsg命令
  • 使用srv
    • 创建一个srv
    • 使用rossrv命令
  • msg和srv的通用步骤
  • 使用Help
  • 简要总结回顾

ROS msg和srv的介绍

  • msg:msg文件是一个描述ROS消息字段的简单文本文件。它们用于为消息生成不同语言的源代码。
  • srv:一个srv文件描述了一个service。其由两个部分组成,包括一个请求和一个响应。

msg文件存储在package包中的msg文件夹,srv文件存储在srv文件夹。

msg文件只是一个简单的文本文件,每一行包括一个字段类型和一个字段名称。字段可以使用下述类型:
i

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 headerstring child_frame_idgeometry_msgs/PoseWithCovariance posegeometry_msgs/TwistWithCovariance twist

srv文件就像msg文件一样,但它包括两个部分:一个请求和一个响应。这两个部分通过一行 ‘—’ 线进行区分,这里有一个srv文件的例子:

int64 A
int64 B
---
int64 Sum

即A和B是请求,而Sum是响应。

使用msg

创建一个msg

首先,在前述博客:ROS学习-创建一个Package包创建的beginner_tutorials包中定义一个新的msg。命令如下:

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

切换到beginner_tutorials文件夹,然后创建msg文件夹,输入"int64 num"内容到msg文件夹的Num.msg文件。
上述创建的Num.msg文件只有一行内容,当然我们也可以加入多行内容,比如说加入:

string first_name
string last_name
uint8 age
uint32 score

不过,还有一步操作,我们需要确保msg文件转换成C++源码、Python源码,或者其他语言格式。
打开beginner_tutorials包中的package.xml文件,确保下述两行内容没有被注释掉:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

注意:上述内容是我们在编译期间是需要 “message_generation”,在运行期间,我们仅需要"message_runtime"。

打开CMakeLists.txt文件,在其中的find_package中加入message_generation依赖,简单修改为如下形式:

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)

我们可能会注意到,有时即使没有调用find_package中所有依赖项的包,我们的项目也可以正常构建。这是因为catkin把我们所有的项目集中到一个中,所以如果一个之前的项目使用了find_package,且你在其中配置了相同的值,就不会出现错误。但是项目中忘记了添加对应的依赖在独立构建的过程中很容易出现中断。

同时,确保导出了message runtime 的依赖。

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorialsCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

同时,找到下述内容:

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去除其注释,并修改为下述形式:

add_message_files(FILESNum.msg
)

通过手工添加.msg文件,我们能够确保CMake能够知道何时在你添加其他.msg文件之后重新配置项目。

现在,我们必须确保generate_messages()函数被调用了,找到下述内容并去除注释:

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

现在我们已经准备好能够从msg定义中生成源文件,如果我们想要现在去这样做可以直接跳到: msg和srv的通用步骤 中进行处理。

使用rosmsg命令

上述就是在ROS中创建一个msg所需要的全部操作,接下来,我们需要确保在ROS中能够通过rosmsg命令看到他们,命令用法如下:

$ rosmsg show [message type]

比如,对于我们创建的 beginner_tutorials中名称为Num的msg。命令变为下述形式:

$ rosmsg show beginner_tutorials/Num

输出结果为:

int64 num
string first_name
string last_name
uint8 age
uint32 score

此外,如果我们忘了哪个包Package中包含这个msg,那么我们可以直接留空Package的名字,直接使用下述命令。

$ rosmsg show Num

可以得到下述信息:

[beginner_tutorials/Num]:
int64 num
string first_name
string last_name
uint8 age
uint32 score

使用srv

创建一个srv

使用下述命令,创建一个新的srv文件夹。

$ roscd beginner_tutorials
$ mkdir srv

与前述手工创建一个msg文件并输入相关内容不同的是,在这里我们从其他package包中复制一个已有的srv文件。
这里,使用一个roscp命令来进行从其他包中复制到当前的beginner_tutorials的srv文件夹中。roscp命令的用法如下:

$ roscp [package_name] [file_to_copy_path] [copy_path]

例如,我们从rospy_tutorials包中复制AddTwoInts.srv文件到当前包的srv文件夹。命令变为下述形式:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

这里也还有一个更多的步骤,即我们需要把srv文件转换成C++, Python或者其他语言。

首先,打开beginner_tutorials包中的package.xml文件,确保下述两行内容没有被注释掉(与上述的msg过程类似):

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

如前所述的,在编译期间,我们需要message_generation,而在运行期间,我们使用message_runtime。
接着,在CMakeLists.txt文件,找到其中的find_package并在其中加入message_generation依赖,简单修改为如下形式(如果在之前的msg介绍中已经添加则不用处理了):

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)

注意:不用管这个message_generation的名字,它对于msg和srv都起作用。

同样,我们还需要在package.xml文件中进行同样的操作,来对services进行处理,类似于messages去除下述代码的注释,来增加需要的依赖。

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

并修改为如下形式,替换Service2.srv为我们自己的AddTwoInts.srv文件:

add_service_files(FILESAddTwoInts.srv
)

使用rossrv命令

上述就是在ROS中创建一个srv所需要的全部操作,接下来,我们需要确保在ROS中能够通过rossrv命令看到他们,命令用法如下:

$ rossrv show <service type>

例如,我们通过下述命令来查看beginner_tutorials/AddTwoInts中的内容。

$ rossrv show beginner_tutorials/AddTwoInts

返回输出值:

int64 a
int64 b
---
int64 sum

当然,我们也可以使用类似与rosmsg命令的用法,省略package包的名字,而直接用srv的名字。命令如下:

$ rossrv show AddTwoInts

返回下述内容:

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

说明我们在beginner_tutorials包中以及rospy_tutorials包中都找到了这个文件,内容为两个int64的请求,和一个int64 sum的相应。

msg和srv的通用步骤

去除CMakeLists.txt文件中的下述内容注释(如果上述步骤中我们已经做过,则可以跳过)。

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

去除之后变成下述形式:

generate_messages(DEPENDENCIESstd_msgs
)

如果我们在.msg文件中所依赖的包,这里我们依赖了std_msgs包。

现在,我们需要重新编译一下beginner_tutorials这个包,来生成新的messages。

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make

在msg文件夹中的任意.msg文件都将生成所有支持语言的源码。
C++ message的头文件将生成在: ~/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语言,存放在对应的文件夹中。

使用Help

我们已经看到了很多ROS工具,但是记住每个命令需要的参数可能很困难。幸运的是,大多数ROS工具都提供了自己的帮助。
例如,对于我们上述所使用的rosmsg命令:

$ rosmsg -h

返回如下值:

rosmsg is a command-line tool for displaying information about ROS Message types.Commands:rosmsg show    Show message descriptionrosmsg info Alias for rosmsg showrosmsg list    List all messagesrosmsg md5 Display message md5sumrosmsg package    List messages in a packagerosmsg packages   List packages that contain messagesType rosmsg <command> -h for more detailed usage

当然,我们还可以得到关于子命令的帮助。例如第一个rosmsg show。使用命令:

$ rosmsg show -h

返回如下值:

Usage: rosmsg show [options] <message type>Options:-h, --help            show this help message and exit-r, --raw             show raw message text, including comments-b BAGFILE, --bag=BAGFILEshow message from .bag file

简要总结回顾

我们在上述内容中使用了多个ROS命令,对这些命令进行简单总结:

rospack = ros+pack(age) : 返回ROS包的相关信息
roscd = ros+cd : 切换到ROS包或堆栈所在的路径

rosls = ros+ls : 列出ROS包中的所有文件

roscp = ros+cp : 从ROS包中复制指定的文件

rosmsg = ros+msg : 提供ROS包message定义的相关信息
rossrv = ros+srv : 提供ROS包service定义的相关信息
catkin_make : 编译工作空间中的ROS包
rosmake = 如果不在catkin工作空间中,使用这个命令进行编译ROS包。

ROS学习-创建一个ROS msg和一个srv相关推荐

  1. ROS学习笔记(十)——ROS试用练习(一)

    ROS学习笔记(十)--ROS试用练习 在此说明:之前使用的ROS是indigo,前两天电脑"炸"了,所以换了kinetic. 一.ROS文件系统导览 1.1如果你想找到turtl ...

  2. ROS学习笔记三:编写第一个ROS节点程序

    在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package). 一.创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次性创 ...

  3. ROS学习总结一ROS组织框架与几个关键词

    本人一个ROS学习初学者,在经过三天的学习基础教程,对ROS有了一个基本的了解,在此,笔者就自己的学习的理解做一个总结,如有错误还请各位指出. 一.组织框架 catkin_ws() --build - ...

  4. ROS学习(four): the ros topics how to work

    turtle keyboard teleoperation: 乌龟键盘操纵 rosrun turtlesim turtlesim_noderosrun turtlesim turtle_teleop_ ...

  5. 【ros学习】14.urdf、xacro机器人建模与rviz、gazebo仿真详解

    一.起因 学校的这学期课程是ros机器人开发实战,我们学习小组也要搞一个自己的机器人模型,我们组又叫葫芦组,所以我就做了个葫芦形状的机器人,虽说有点丑,本来想用maya建模再导入的,奈何不太懂maya ...

  6. ROS学习汇总(3D摄像头)

    1.ros-摄像头usb_cam以及rviz显示 https://developer.orbbec.com.cn/forum_plate_module_details.html?id=1461 2.R ...

  7. ROS学习笔记10(创建一个ROS消息和服务)

    这篇教程主要介绍怎样创建和编译一个msg消息和srv服务文件,同时介绍rosmsg,rossrv,roscp等命令工具. 文章目录 1 msg和srv文件长什么样 2 msg使用 2.1 创建一个ms ...

  8. ROS学习笔记八:创建ROS msg和srv

    ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...

  9. ROS学习笔记11(用C++写一个简单的消息发布和消息订阅)

    文章目录 1 写一个消息发布节点 2 写一个消息订阅节点 3 构建节点 1 写一个消息发布节点 首先切换到工作目录: roscd beginner_tutorials 接着,创建src/talker. ...

最新文章

  1. 如何理解 RESTful 的幂等性
  2. 计算机视觉经典任务分类
  3. 人工智能历经风雨二十载 AI专用芯片成蓝海
  4. 中国枳实提取物市场营销模式建议与竞争格局展望报告2022年
  5. git服务器与客户端的安装与使用
  6. 深度解读NLP文本情感分析Pipeline
  7. php中延迟绑定,PHP静态延迟绑定
  8. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task3特征工程
  9. No tag datetimepicker defined in tag library imported with prefix s解决
  10. SpringBoot +Lombok注解精华篇
  11. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1...
  12. Emacs学习笔记(8): 使用emacs浏览网页
  13. php会员代码大全,PHP在线获取VIP会员账号API接口代码
  14. CleanMyMac X下载Mac系统清理优化工具
  15. 双机热备份VRRP原理详解(附实验)
  16. react-custom-scrollbars滚动组件
  17. 河北关于加快新型建筑工业化发展的实施意见发布
  18. python生成热力图_pyHeatMap生成热力图
  19. 免费版医疗器械计算机软件,医疗器械软件描述.docx
  20. 基于微信小程序的房屋租赁小程序设计与实现-计算机毕业设计源码+LW文档

热门文章

  1. 评分卡:WOE、IV、PSI计算及ROC和KS曲线
  2. 2018-2019年世界将会出现一场经济危机,危机过后中国将会崛起!
  3. DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras论文阅读笔记
  4. MDI窗体(多文档界面)
  5. sqlite程序实现
  6. 解决需求变更难题的8大方案
  7. #Windows server 2019将辅助域控升级为主域控
  8. ibm p740做虚拟服务器,POWER740 主机板的拆除与安装图文说明
  9. Grbl v1.1版本的编译方法
  10. PACS(CT、CR、DR、MR、DSA、RF医院影像管理系统源码)