创建ROS程序包

一个catkin程序包由什么组成?

一个程序包要想称为catkin程序包必须符合以下要求:

该程序包必须包含catkin compliant package.xml文件这个package.xml文件提供有关程序包的元信息。 程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。
每个目录下只能有一个程序包。这意味着在同一个目录下不能有嵌套的或者多个程序包存在。 

最简单的程序包也许看起来就像这样:

my_package/CMakeLists.txtpackage.xml

在catkin工作空间中的程序包

开发catkin程序包的一个推荐方法是使用catkin工作空间,但是你也可以单独开发(standalone)catkin 软件包。一个简单的工作空间也许看起来像这样:

workspace_folder/        -- WORKSPACEsrc/                   -- SOURCE SPACECMakeLists.txt       -- 'Toplevel' CMake file, provided by catkinpackage_1/CMakeLists.txt     -- CMakeLists.txt file for package_1package.xml        -- Package manifest for package_1...package_n/CMakeLists.txt     -- CMakeLists.txt file for package_npackage.xml        -- Package manifest for package_n

在继续本教程之前请先按照创建catkin工作空间教程创建一个空白的catkin工作空间。

创建一个catkin程序包
本部分教程将演示如何使用catkin_create_pkg命令来创建一个新的catkin程序包以及创建之后都能做些什么。

首先切换到之前通过创建catkin工作空间教程创建的catkin工作空间中的src目录下:

cd ~/catkin_ws/src

现在使用catkin_create_pkg命令来创建一个名为’beginner_tutorials’的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:

catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

这将会创建一个名为beginner_tutorials的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经自动包含了部分你在执行catkin_create_pkg命令时提供的信息。
catkin_create_pkg命令会要求你输入package_name,如果有需要你还可以在后面添加一些需要依赖的其它程序包:

# 这是一个示例,请勿尝试运行
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

catkin_create_pkg命令也有更多的高级功能,这些功能在catkin/commands/catkin_create_pkg中有描述

程序包依赖关系

1、一级依赖
之前在使用catkin_create_pkg命令时提供了几个程序包作为依赖包,现在我们可以使用rospack命令工具来查看一级依赖包。

rospack depends1 beginner_tutorialsstd_msgs
rospy
roscpp

就像你看到的,rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包,这些依赖包随后保存在package.xml文件中。

roscd beginner_tutorials
cat package.xml执行命令后可以看到:
<package>
...<buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend>
...
</package>

2、间接依赖

在很多情况中,一个依赖包还会有它自己的依赖包,比如,rospy还有其它依赖包。

rospack depends1 rospygenpy
rosgraph
rosgraph_msgs
roslib
std_msgs

一个程序包还可以有好几个间接的依赖包,幸运的是使用rospack可以递归检测出所有的依赖包

rospack depends beginner_tutorialscpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
catkin
rospack
roslib
rospy

自定义你的程序包
本部分教程将剖析catkin_create_pkg命令生成的每个文件并详细描述这些文件的组成部分以及如何自定义这些文件。

1、自定义 package.xml
自动生成的package.xml文件应该在你的新程序包中。现在让我们一起来看看新生成的package.xml文件以及每一个需要你注意的标签元素。
1.1、描述标签

首先更新描述标签:

   5   <description>The beginner_tutorials package</description>

将描述信息修改为任何你喜欢的内容,但是按照约定第一句话应该简短一些,因为它覆盖了程序包的范围。如果用一句话难以描述完全那就需要换行了。
1.2、维护者标签

接下来是维护者标签:

   7   <!-- One maintainer tag required, multiple allowed, one person per tag --> 8   <!-- Example:  -->9   <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->10   <maintainer email="user@todo.todo">user</maintainer>

这是package.xml中要求填写的一个重要标签,因为它能够让其他人联系到程序包的相关人员。至少需要填写一个维护者名称,但如果有需要的话你可以添加多个。除了在标签里面填写维护者的名称外,还应该在标签的email属性中填写邮箱地址:

   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>

1.3、许可标签

再接下来是许可标签,同样的也需要:

  12   <!-- One license tag required, multiple allowed, one license per tag -->13   <!-- Commonly used license strings: -->14   <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->15   <license>TODO</license>

你应该选择一种许可协议并将它填写到这里。一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。你可以在Open Source Initiative中阅读其中的若干个许可协议的相关信息。对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议:

   8   <license>BSD</license>

1.4、依赖项标签
接下来的标签用来描述程序包的各种依赖项,这些依赖项分为build_depend、buildtool_depend、run_depend、test_depend。关于这些标签的更详细介绍请参考Catkin Dependencies相关的文档。在之前的操作中,因为我们将 std_msgs、 roscpp、 和 rospy作为catkin_create_pkg命令的参数,所以生成的依赖项看起来如下:

  27   <!-- The *_depend tags are used to specify dependencies -->28   <!-- Dependencies can be catkin packages or system dependencies -->29   <!-- Examples: -->30   <!-- Use build_depend for packages you need at compile time: -->31   <!--   <build_depend>genmsg</build_depend> -->32   <!-- Use buildtool_depend for build tool packages: -->33   <!--   <buildtool_depend>catkin</buildtool_depend> -->34   <!-- Use exec_depend for packages you need at runtime: -->35   <!--   <exec_depend>python-yaml</exec_depend> -->36   <!-- Use test_depend for packages you need only for testing: -->37   <!--   <test_depend>gtest</test_depend> -->38   <buildtool_depend>catkin</buildtool_depend>39   <build_depend>roscpp</build_depend>40   <build_depend>rospy</build_depend>41   <build_depend>std_msgs</build_depend>

除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。在本例中,因为在编译和运行时我们需要用到所有指定的依赖包,因此还需要将每一个依赖包分别添加到run_depend标签中:

 12   <buildtool_depend>catkin</buildtool_depend>13 14   <build_depend>roscpp</build_depend>15   <build_depend>rospy</build_depend>16   <build_depend>std_msgs</build_depend>17 18   <exec_depend>roscpp</exec_depend>19   <exec_depend>rospy</exec_depend>20   <exec_depend>std_msgs</exec_depend>

1.5、最后完成的 package.xml
现在看下面最后去掉了注释和未使用标签后的package.xml文件就显得更加简洁了:

  1 <?xml version="1.0"?>2 <package format="2">3   <name>beginner_tutorials</name>4   <version>0.1.0</version>5   <description>The beginner_tutorials package</description>6 7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>8   <license>BSD</license>9   <url type="website">http://wiki.ros.org/beginner_tutorials</url>10   <author email="you@yourdomain.tld">Jane Doe</author>11 12   <buildtool_depend>catkin</buildtool_depend>13 14   <build_depend>roscpp</build_depend>15   <build_depend>rospy</build_depend>16   <build_depend>std_msgs</build_depend>17 18   <exec_depend>roscpp</exec_depend>19   <exec_depend>rospy</exec_depend>20   <exec_depend>std_msgs</exec_depend>21 22 </package>

自定义 CMakeLists.txt

到此,这个包含程序包元信息的package.xml文件已经按照需要完成了裁剪整理,现在你可以继续下面的教程了。catkin_create_pkg命令生成的CMakeLists.txt文件将在后续关于编译ROS程序代码的教程中讲述。

现在你已经创建了一个新的ROS程序包,接下来我们开始编译这个程序包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些有用的js插件

getfuelux.com 一系列插件合集 Ion.RangeSlider 超级牛的范围选择控件 Ion.CheckRadio Ion.Tabs Ion.Calendar Ion.ImageSlider Ion.Zoom www.ngwidgets.com Advanced UI Widgets for AngularJS http://www.jq22.com/ jQuery 插件库 http://jvectormap.com/ 地图插件 X-…

C# FTP操作类库

class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP; #region 连接/// <summary>/// 连接FtpWebRequest/// </summary>/// <param name"path"></param>private void Connect(String path)/…

安装并配置ROS环境

参考该网址内容&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment

Cropper – 简单的 jQuery 图片裁剪插件

Cropper 是一个简单的 jQuery 图像裁剪插件。它支持选项&#xff0c;方法&#xff0c;事件&#xff0c;触摸&#xff08;移动&#xff09;&#xff0c;缩放&#xff0c;旋转。输出的裁剪数据基于原始图像大小&#xff0c;这样你就可以用它们来直接裁剪图像。 如果你尝试裁剪跨域…

C# JSON格式数据用法

JSON简介JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。JSON采用完全独立于语言的文本格式&#xff0c;可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单&#xff0c;易于人阅读和编写&#xff0c;同…

Ros命令及功能

运行小乌龟代码&#xff1a; roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key一些命令及作用 ros 加tap //查看电脑中以ros开头的命令 rqt_graph //将系统内的主要资源以可视化的形式展现出来 rosnode list //列出系统节点 命令 --help //查看命…

数据库——环境初建改端口和密码(转)

一、修改APACHE的监听端口 2、在界面中选apache&#xff0c;弹出隐藏菜单选项&#xff0c;打开配置文件httpd.conf; 2、找到Listen 80 和 ServerName localhost:80; 3、将80改成801&#xff08;当然自己也可以设定别的不使用的端口&#xff0c;例如8000等&#xff09;; 4、保存…

文件系统认知

什么是文件系统 常规认知是&#xff1a;linux根目录那些东西 百科&#xff1a;文件系统是操作系统用于明确存储设备组织文件的方法&#xff0c;操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统。 以上说的方法&#xff1a;就是文件管理…

何谓悲观锁与乐观锁

乐观锁对应于生活中乐观的人总是想着事情往好的方向发展&#xff0c;悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点&#xff0c;不能不以场景而定说一种人好于另外一种人。 悲观锁 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别人会…

寒哥细谈之AutoLayout全解

看到群中好多朋友还停留在Frame布局的痛苦时代&#xff0c;以及有些开发者接手别人的就项目发现布局一团乱。而且没有启动图的时候并不是真正真正适配iPhone 6(S)、iPhone6(S) Plus等设备 。寒哥准备尽可能详细的讲一讲我所掌握的AutoLayout 。AutoLayout很难&#xff1f;我觉得…

最难学的5种编程语言排行

每个程序员都熟悉许多编程语言。许多编程语言都是高级的&#xff0c;它们的语法是人类可读的。然而&#xff0c;也有一些低级语言&#xff0c;对于一个人来说&#xff0c;读起来很困难&#xff0c;但是可以理解。然而&#xff0c;您是否遇到过一种既不可读又不可理解的编程语言…

[小北De编程手记] : Lesson 02 - Selenium For C# 之 核心对象

从这一篇开始&#xff0c;开始正式的介绍Selenium 以及相关的组件&#xff0c;本文的将讨论如下问题&#xff1a; Selenium基本的概念以及在企业化测试框架中的位置Selenium核心对象&#xff08;浏览器驱动&#xff09; Web DriverSelenium核心对象&#xff08;Dom元素&#xf…

Java中HashMap的entrySet()你会用了吗

Map中存放的元素均为键值对&#xff0c;故每一个键值对必然存在一个映射关系。 Map中采用Entry内部类来表示一个映射项&#xff0c;映射项包含Key和Value Map.Entry里面包含getKey()和getValue()方法 Set<Entry<T,V>> entrySet() 该方法返回值就是这个map中各个键…

JS获取请求URL相关参数

今天在找获取当前网址除去参数的js方式&#xff0c;结果自己会的竟然只有window.location.href 先看一个示例 用javascript获取url网址信息 <script type"text/javascript"> document.write("location.host"location.host"<br>"); d…

wiki语法大全

Wiki语法大全 编辑一个维客页面十分容易。只要点击页面上方的“编辑本页”或右侧的[编辑]链接即可修改该页&#xff0c;或点击“讨论本页”然后再点击“编辑页面”来讨论该页面。点击后您就会看到一个包含那个Wiki页面的可编辑的文字区域。 先将文字复制到您最喜欢的文字编辑器…

驱动认知

用户态 App&#xff1a;cp指令&#xff0c;ftp的项目等等这就是App的开发。 App开发需要C的基础和C库&#xff0c;C库讲到文件&#xff0c;进程&#xff0c;进程间通信&#xff0c;线程&#xff0c;网络&#xff0c;界面&#xff08;GTk&#xff09;。 C库&#xff08;是linux标…

TreeMap实现排序

TreeMap TreeMap实现SortMap接口&#xff0c;能够把它保存的记录根据键排序&#xff0c;默认是按键值的升序排序&#xff0c;也可以指定排序的比较器。当用Iterator遍历TreeMap时&#xff0c;得到的记录是排过序的。 TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或…

图解分布式架构的演进过程!

一、什么是分布式架构分布式系统&#xff08;distributed system&#xff09; 是建立在网络之上的软件系统。内聚性&#xff1a;是指每一个数据库分布节点高度自治&#xff0c;有本地的数据库管理系统。透明性&#xff1a;是指每一个数据库分布节点对用户的应用来说都是透明的&…

CSS 布局实例系列(四)如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?...

Hello&#xff0c;小朋友们&#xff0c;还记得我是谁吗&#xff1f;对了&#xff0c;我就是~超威~好啦&#xff0c;言归正传&#xff0c;今天的布局实例是&#xff1a; 实现一个浮动布局&#xff0c;红色容器中每一行的蓝色容器数量随着浏览器宽度的变化而变化&#xff0c;就如…

基于框架编写驱动代码

操作驱动的上层代码&#xff08;pin4test&#xff09; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>void main() {int fd,data;fd open("/dev/pin4",O_RDWR);if(fd<0){printf("open fail…