ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
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.hPython 脚本语言会在 :
~/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.pylisp 文件会出现在 :
~/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_generation
对 msg 和 srv 都起作用)
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()
函数 对msg和srv 都起作用)
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服务的更多相关文章
- C++ GUI Qt4编程-创建自定义窗口部件
C++ GUI Qt4编程-创建自定义窗口部件 Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...
- sharepoint2010 创建自定义列表
转:http://boke.25k5.com/kan77298.html 如何创建自定义列表 首先了解创建自定义列表中涉及到的几个名词:栏.内容类型. ①栏:栏即列.字段(Field),MSDN中给出 ...
- 【UiPath 中文教程】02 - 创建自定义 Activity
在 UiPath Studio 中,活动 (Activity) 是流程自动化的基石,是构成自动化程序的最小模块.它们被包含在一个个 NuGet 包中. UiPath Studio 中有 3 类包: 官 ...
- tensorflow创建自定义 Estimator
https://www.tensorflow.org/guide/custom_estimators?hl=zh-cn 创建自定义 Estimator 本文档介绍了自定义 Estimator.具体而言 ...
- 创建自定义 Estimator
ref 本文档介绍了自定义 Estimator.具体而言,本文档介绍了如何创建自定义 Estimator 来模拟预创建的 Estimator DNNClassifier 在解决鸢尾花问题时的行为.要详 ...
- 在vue中创建自定义指令
原文:https://dev.to/ratracegrad/creating-custom-directives-in-vue-58hh 翻译:心上有杨 指令是带有 v- 前缀的特殊属性.指令的作用是 ...
- ASP.NET MVC随想录——创建自定义的Middleware中间件
经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...
- 带你走近AngularJS - 创建自定义指令
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- [转]maven创建自定义的archetype
创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...
随机推荐
- luogu 3375 KMP模板题
#include<bits/stdc++.h> using namespace std; ,M = ; int next[N]; void getNext(char s[]) //找nex ...
- charles mock数据时解决乱码问题
1.新建文件,不要后缀名 2.下载Notepad++ 软件,使用该软件打开文件:设置:格式---->以UTF-8无BOM格式编码 3.正常在文件中写入数据,maplocal 就可以了
- C++中声明和定义的区别
声明 这有一个与这个名字相关的东西,并且它是这个类型的,告诉编译器我要使用它,并期待它定义在某一个地方. 定义 定义是指提供所有必要的信息(占用内存大小),使其能够创建整个实体. 我们必须明白的: 一 ...
- Centos 7 安装 Python3.7
目录 下载Python Python安装 遇到问题 错误: configure: error: no acceptable C compiler found in $PATH 错误: can't de ...
- 【javascript常见面试题】常见前端面试题及答案
转自:http://www.cnblogs.com/syfwhu/p/4434132.html 前言 本文是在GitHub上看到一个大牛总结的前端常见面试题,很多问题问的都很好,很经典.很有代表性.上 ...
- Nexus安装以及2,3比较
解压缩之后, 进入nexus-3.6.2-01/bin文件夹中,执行: ./nexus start 如果使用root将会得到一个告警:Detected execution as "root& ...
- 关于打包后提示无法连接到mongodb的情况
昨天晚上要和前端联调. 打完jar包后发现无法连接到测试环境的数据库. 就很尴尬,最后发现问题在于mongodb的URI写错了: 正确的URI格式:mongodb://url:port/dbName ...
- python3 之 格式化json
import json json_string = None with open("json_file.json") as f: json_string = f.read() tr ...
- laravel 多个where的连接使用
在查询的时候需要用到多个where条件来查询 1.直接多个where连接 ->where()->where() 2.把查询条件 放到where数组$where中 然后 ->where ...
- HDU1272(并查集判图连通)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...