ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务

我使用的虚拟机软件:VMware Workstation 11

使用的Ubuntu系统:Ubuntu 14.04.4 LTS

ROS 版本:ROS Indigo


一. 创建自定义的ROS消息 :(msg

下面我们来介绍具体步骤:

1:现在beginner_tutorials软件包中创建一个 msg 文件夹,用来存放我们下面要创建的消息文件:

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

我们来看看上面的命令执行完后得到了什么:

$ ls msg/
Num.msg

打开这个 Num.msg 文件,看看:打开这个 Num.msg 文件,看看:

$ gedit gedit msg/Num.msg 

这样就简单的创建了一个消息文件。

我们具体介绍一下消息( msg ) : msg 文件就是一个描述 ROS 中所有 消息类型 的简单文本。它们可以用来生成不同语言的源代码。

所以下一步:我们要确保 msg 文件被转换成为 C++Python 或者 其他语言的源代码:

2:所以,我们要 确保 package.xml 包含一下两条语句。如果没有的话,就添加上这2句话 (完整的 package.xml 文件)

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

打开 package.xml 文件 :

aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ ls
CMakeLists.txt include launch msg package.xml scripts src
aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ gedit package.xml

将上的两代码添加到这个 package.xml 文件里,如下图所示:

解释:

message_generation ” 是构建时需要的。

message_runtime ” 是运行的时候需要的。

3:编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 find_packag() 函数,增加对 message_generation 的依赖,这样就可以生成消息了。

打开 CMakeLists.txt 文件:

aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ ls
CMakeLists.txt include launch msg package.xml scripts src
aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ gedit CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)

4:继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 catkin_package() 函数, 添加运行依赖:message_runtime , roscpp , rospy , std_msgs

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

5: 继续编写 beginner_tutorials 程序包中的CMakeLists.txt 中的 add_message_files()函数:添加新创建的消息文件: Num.msg

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

6:继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 。通过上一步手动添加完 .msg 文件后,我们要确保 CMake 知道在什么时候重新配置我们的 project 。 确保添加了如下代码: 添加包含 msgs 的软件包依赖

 generate_messages(
DEPENDENCIES
std_msgs
)

现在,CMakeLists.txt 文件就编写完了。以上 1~6 就是创建消息的所有步骤。

接下来,编译,就可以生成自己的消息源代码了。


二. 编译工作空间:

$ cd ~/catkin_ws
$ catkin_make

如何检测创建成果呢:通过 rosmsg show 命令,检查 ROS 是否能够识别消息:

$ rosmsg show beginner_tutorials/Num
int64 num

看样子已经成功创建了一个简单的消息。

所有在 msg 路径下的 .msg 文件都将转换为 ROS 所支持语言的源代码。那么,编译生成的 .msg 消息文件生成的 C++Python 的文件存放在哪个路径里呢:

生成的 C++ 头文件将会放置在 : ~/catkin_ws/devel/include/beginner_tutorials/

aobosir@ubuntu:~/catkin_ws/devel/include/beginner_tutorials$ ls
Num.h

Python 脚本语言会在 : ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg 目录下创建。

aobosir@ubuntu:~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg$ ls
__init__.py _Num.py

lisp 文件会出现在 : ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/ 路径下.

aobosir@ubuntu:~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg$ ls
beginner_tutorials-msg.asd Num.lisp _package.lisp _package_Num.lisp

三. 创建自定义的 ROS 服务 :( srv

1:现在 beginner_tutorials 软件包中创建一个 srv 文件夹,用来存放我们下面要创建的服务文件:

$ roscd beginner_tutorials
$ mkdir srv

这次,不自己写服务文件了, 我们直接复制已有的文件:( roscp 是一个很实用的命令行工具,它实现了将文件从一个 package (程序包)复制到另外一个 package (程序包)的功能。) ( package : 程序包或者叫软件包 )

$ roscp  rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

我们打开这个 AddTwoInts.srv 文件看看里面有什么:

gedit srv/AddTwoInts.srv

简单吧,就这玩意。下面就是编写 package.xml 文件 和 CMakeLists.txt 文件了。跟创建消息的步骤类似:(目的:确保 srv 文件被转换成为 C++Python 和其他语言的源代码)

2:查看 beginner_tutorials 程序包中的 package.xml , 确保它包含一下两条语句: (上面创建的 msg 消息的时候就可以添加了,所以这次就不需要添加了)

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

3:编写 beginner_tutorials 程序包中的 CMakeList.txt 文件中的 find_packag() 函数,增加对 message_generation 的依赖:(上面创建 msg 消息的时候已经添加了,所以现在就不需要添加了。可以跳过这个步骤)

(你发现了吧, message_generationmsgsrv 都起作用)

4:继续编写 beginner_tutorials 程序包中的 CMakeLists.txt 中的 add_service_files() 函数:添加新创建的服务文件 :

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

5:继续编写 beginner_turtorials 程序包中的 CMakeLists.txt 文件中的 generate_messages() 函数:添加包含 msgs 的软件包依赖: (在创建 msg 消息的时候,就已经添加了,所以现在可以跳过这个步骤)

(你发现了吧, generate_messages() 函数 对msgsrv 都起作用)

OK 完成 1~5 的步骤你的服务文件就已经创建完成了。

四. 编译工作空间:

那么到这里,一切步骤全部搞定,现在我们回到主工作空间路径来编译一下:

$ cd ~/catkin_ws
$ catkin_make

OK, 编译完成。



总结:

我们现在已经学会了如何创建ROS消息和服务,它们是ROS节点间相互通讯的除ROS话题外的另一种方式。

下一节,我就来使用刚刚创建的ROS消息和ROS服务,编写ROS服务版的 Hello World 程序。(使用ROS服务进行通信的Hello World程序)

ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务的更多相关文章

  1. C++ GUI Qt4编程-创建自定义窗口部件

    C++ GUI Qt4编程-创建自定义窗口部件   Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...

  2. sharepoint2010 创建自定义列表

    转:http://boke.25k5.com/kan77298.html 如何创建自定义列表 首先了解创建自定义列表中涉及到的几个名词:栏.内容类型. ①栏:栏即列.字段(Field),MSDN中给出 ...

  3. 【UiPath 中文教程】02 - 创建自定义 Activity

    在 UiPath Studio 中,活动 (Activity) 是流程自动化的基石,是构成自动化程序的最小模块.它们被包含在一个个 NuGet 包中. UiPath Studio 中有 3 类包: 官 ...

  4. tensorflow创建自定义 Estimator

    https://www.tensorflow.org/guide/custom_estimators?hl=zh-cn 创建自定义 Estimator 本文档介绍了自定义 Estimator.具体而言 ...

  5. 创建自定义 Estimator

    ref 本文档介绍了自定义 Estimator.具体而言,本文档介绍了如何创建自定义 Estimator 来模拟预创建的 Estimator DNNClassifier 在解决鸢尾花问题时的行为.要详 ...

  6. 在vue中创建自定义指令

    原文:https://dev.to/ratracegrad/creating-custom-directives-in-vue-58hh 翻译:心上有杨 指令是带有 v- 前缀的特殊属性.指令的作用是 ...

  7. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  8. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  9. [转]maven创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

随机推荐

  1. mysql 完整约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  2. 服务器端使用DeferredResult异步推送技术

    注意1: org.springframework.web.context.request.async.DeferredResult; 是Spring4.0以后的版本才有的,注意Spring版本,然后添 ...

  3. New Concept English three (54)

    打字练习: 27w/m 45errors We have been brought up to fear insects. We regard them as unnecessary creature ...

  4. HTTP协议 与 Requests库

    HTTP协议 与 Requests库: 1  HTTP协议: 2 URL作为网络定位的标识: >>>> 用户通过url来定位资源 >>>> 然后通过 g ...

  5. [独孤九剑]Oracle知识点梳理(三)导入、导出

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  6. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  7. Mxgraph使用总结一

    一.Mxgraph介绍: mxGraph 是一个 JS 绘图组件适用于需要在网页中设计/编辑 Workflow/BPM流程图.图表.网络图和普通图形的 Web 应用程序.mxgraph 下载包中包括j ...

  8. bzoj 3629 [JLOI2014]聪明的燕姿——约数和定理+dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3629 如果要搜索,肯定得质因数分解吧:就应该朝这个方向想. **约数和定理: 对于任意一个大 ...

  9. 存储过程错误异常处理例子 --> DECLARE EXIT HANDLER FOR SQLEXCEPTION (转)

    刚才一个朋友问到:  mysql  有类似 mssql 退出执行的方法不? 比如我执行到某个条件,下面就终止执行了.  想起以前写的存储过程,找了好久才找到,就发给他,希望对他有所帮助,贴在这里,留作 ...

  10. Angular5学习笔记 - 配置Http(七)

    一.引入Http模块 编辑\src\app\app.module.ts文件 import { HttpModule } from '@angular/http'; /* 注册模块 */ imports ...