創建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.pswp.cn/news/272418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272418.shtml
英文地址,請注明出處:http://en.pswp.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…