ROS入門筆記(七):詳解ROS文件系統
01 Catkin編譯系統
1.1 Catkin特點
1.2 Catkin工作原理
1.3 使用catkin_make進行編譯
02 Catkin工作空間
2.1 創建catkin工作空間
2.2 編譯工作空間
2.3 設置環境變量
2.4 檢查環境變量
03 catkin結構介紹
小結
04 Package軟件包
4.1 package結構
4.2 package的創建
4.3 package相關命令
4.3.1 rospack
4.3.2 roscd
4.3.3 rosls
4.3.4 rosdep
05 CMakeLists.txt
5.1 CMakeLists.txt作用
5.2 CMakeLists.txt寫法
5.3 CMakeLists例子
06 package.xml
6.1 package.xml作用
6.2 package.xml寫法
6.3 pacakge.xml例子
07 Metapackage
7.1 Metapackage介紹
7.2 Metapackage寫法
08 其他常見文件類型
8.1 launch文件
8.2 msg/srv/action文件
8.3 urdf/xacro文件
8.4 yaml文件
8.5 dae/stl文件
8.6 rviz文件
本章主要介紹了ROS的工程結構,也就是ROS的文件系統結構。要學會建立一個ROS工程,首先要認識一個ROS工程,了解它們的組織架構,從根本上熟悉ROS項目的組織形式,了解各個文件的功能和作用,才能正確的進行開發和編程。
本章的主要內容有,介紹catkin的編譯系統,catkin工作空間的創建和結構,package軟件包的創建和結構,介紹CMakeLists.txt文件,package.xml以及其他常見文件。從而系統的梳理了ROS文件空間的結構,對於我們ROS學習和開發有着重要的作用。
01 Catkin編譯系統
對於源代碼包,我們只有編譯才能在系統上運行。而Linux下的編譯器有gcc、g++,隨着源文件的增加,直接用gcc/g++命令的方式顯得效率低下,人們開始用Makefile來進行編譯。然而隨着工程體量的增大,Makefile也不能滿足需求,於是便出現了Cmake工具。CMake是對make工具的生成器,是更高層的工具,它簡化了編譯構建過程,能夠管理大型項目,具有良好的擴展性。對於ROS這樣大體量的平台來說,就采用的是CMake,並且ROS對CMake進行了擴展,於是便有了Catkin編譯系統。

早期的ROS編譯系統是rosbuild,但隨着ROS的不斷發展,rosbuild逐漸暴露出許多缺點,不能很好滿足系統需要。在Groovy版本面世后,Catkin作為rosbuild的替代品被正式投入使用。Catkin操作更加簡化且工作效率更高,可移植性更好,而且支持交叉編譯和更加合理的功能包分配。目前的ROS同時支持着rosbuild和Catkin兩種編譯系統,但ROS的核心軟件包也已經全部轉換為Catkin。rosbuild已經被逐步淘汰,所以建議初學者直接上手Catkin。
本節我們主要來介紹catkin的編譯系統。
1.1 Catkin特點
Catkin是基於CMake的編譯構建系統,具有以下特點:
- Catkin沿用了包管理的傳統像 find_package()基礎結構,pkg-config
-
擴展了CMake,例如
- 軟件包編譯后無需安裝就可使用
- 自動生成find_package()代碼,pkg-config文件
- 解決了多個軟件包構建順序問題
一個Catkin的軟件包(package)必須要包括兩個文件:
-
package.xml: 包括了package的描述信息
- name, description, version, maintainer(s), license
- opt. authors, url's, dependencies, plugins, etc...
-
CMakeLists.txt: 構建package所需的CMake文件
- 調用Catkin的函數/宏
- 解析package.xml
- 找到其他依賴的catkin軟件包
- 將本軟件包添加到環境變量
1.2 Catkin工作原理
catkin編譯的工作流程如下:
- 首先在工作空間catkin_ws/src/下遞歸的查找其中每一個ROS的package。
- package中會有package.xml和CMakeLists.txt文件,Catkin(CMake)編譯系統依據CMakeLists.txt文件,從而生成makefiles(放在catkin_ws/build/)。
- 然后make剛剛生成的makefiles等文件,編譯鏈接生成可執行文件(放在catkin_ws/devel)。
也就是說,Catkin就是將cmake與make指令做了一個封裝從而完成整個編譯過程的工具。catkin有比較突出的優點,主要是:
- 操作更加簡單
- 一次配置,多次使用
- 跨依賴項目編譯
1.3 使用catkin_make進行編譯
要用catkin編譯一個工程或軟件包,只需要用catkin_make指令。一般當我們寫完代碼,執行一次catkin_make進行編譯,調用系統自動完成編譯和鏈接過程,構建生成目標文件。編譯的一般性流程如下:
$ cd ~/catkin_ws #回到工作空間,catkin_make必須在工作空間下執行
$ catkin_make #開始編譯
$ source ~/catkin_ws/devel/setup.bash #刷新壞境
注意: catkin編譯之前需要回到工作空間目錄,catkin_make在其他路徑下編譯不會成功。編譯完成后,如果有新的目標文件產生(原來沒有),那么一般緊跟着要source刷新環境,使得系統能夠找到剛才編譯生成的ROS可執行文件。這個細節比較容易遺漏,致使后面出現可執行文件無法打開等錯誤。
catkin_make命令也有一些可選參數,例如:
catkin_make [args] -h, --help 幫助信息 -C DIRECTORY, --directory DIRECTORY 工作空間的路徑 (默認為 '.') --source SOURCE src的路徑 (默認為'workspace_base/src') --build BUILD build的路徑 (默認為'workspace_base/build') --use-ninja 用ninja取代make --use-nmake 用nmake取'make --force-cmake 強制cmake,即使已經cmake過 --no-color 禁止彩色輸出(只對catkin_make和CMake生效) --pkg PKG [PKG ...] 只對某個PKG進行make --only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...] 將指定的package列入白名單CATKIN_WHITELIST_PACKAGES, 之編譯白名單里的package。該環境變量存在於CMakeCache.txt。 --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]] 傳給CMake的參數 --make-args [MAKE_ARGS [MAKE_ARGS ...]] 傳給Make的參數 --override-build-tool-check 用來覆蓋由於不同編譯工具產生的錯誤
02 Catkin工作空間
Catkin工作空間是創建、修改、編譯catkin軟件包的目錄。catkin的工作空間,直觀的形容就是一個倉庫,里面裝載着ROS的各種項目工程,便於系統組織管理調用。在可視化圖形界面里是一個文件夾。我們自己寫的ROS代碼通常就放在工作空間中,本節就來介紹catkin工作空間的結構。
2.1 創建catkin工作空間
創建一個 catkin 工作空間:
$ mkdir -p ~/catkin_ws/src # 創建了第二層級的文件夾src,這是放ROS軟件包的地方 $ cd ~/catkin_ws/src # 進入工作空間,catkin_make必須在工作空間這個路徑上執行 $ catkin_init_workspace # 初始化src目錄,生成的CMakeLists.txt為功能包編譯配置
2.2 編譯工作空間
$ cd ~/catkin_ws # 回到工作空間,catkin_make必須在工作空間下執行;
$ catkin_make # 開始編譯,調用系統自動完成編譯和鏈接過程,構建生成目標文件
注意: catkin編譯之前需要回到工作空間目錄,catkin_make在其他路徑下編譯不會成功。
編譯完成后,如果有新的目標文件產生(原來沒有),那么一般緊跟着要source刷新環境,使得系統能夠找到剛才編譯生成的ROS可執行文件。這個細節比較容易遺漏,致使后面出現可執行文件無法打開等錯誤。
catkin_make命令也有一些可選參數,例如:
catkin_make [args] -h, --help 幫助信息 -C DIRECTORY, --directory DIRECTORY 工作空間的路徑 (默認為 '.') --source SOURCE src的路徑 (默認為'workspace_base/src') --build BUILD build的路徑 (默認為'workspace_base/build') --use-ninja 用ninja取代make --use-nmake 用nmake取'make --force-cmake 強制cmake,即使已經cmake過 --no-color 禁止彩色輸出(只對catkin_make和CMake生效) --pkg PKG [PKG ...] 只對某個PKG進行make --only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...] 將指定的package列入白名單CATKIN_WHITELIST_PACKAGES, 之編譯白名單里的package。該環境變量存在於CMakeCache.txt。 --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]] 傳給CMake的參數 --make-args [MAKE_ARGS [MAKE_ARGS ...]] 傳給Make的參數 --override-build-tool-check 用來覆蓋由於不同編譯工具產生的錯誤
注意, 對於 Python 3 用戶,在一個空的 catkin 工作空間中第一次運行 catkin_make的命令應為:
$ catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
這將會配置 catkin_make 使用 Python 3.你可以在隨后的構建中只使用 catkin_make。
2.3 設置環境變量
另外,如果你查看一下當前目錄應該能看到 'build' 和 'devel' 這兩個文件夾。在 'devel' 文件夾里面你可以看到幾個 setup.*sh 文件。source 這些文件中的任何一個都可以將當前工作空間設置在ROS工作環境的最頂層。接下來首先 source 一下新生成的 setup.*sh 文件:
$ source devel/setup.bash # 刷新壞境
2.4 檢查環境變量
要想保證工作空間已配置正確,需確保ROS_PACKAGE_PATH環境變量包含你的工作空間目錄,采用以下命令查看:
$ echo $ROS_PACKAGE_PATH # 出現 /home/<youruser>/catkin_ws/src:/opt/ros/kinetic/share
到此你的工作環境已經搭建完成。
03 catkin結構介紹
catkin的結構十分清晰,具體的catkin工作空間結構圖如下。初看起來catkin工作空間看起來極其復雜,其實不然,catkin工作空間的結構其實非常清晰。
在工作空間下用tree命令,顯示文件結構。
$ cd ~/catkin_ws $ sudo apt install tree $ tree

結果為:
─ build │ ├── catkin │ │ └── catkin_generated │ │ └── version │ │ └── package.cmake │ ├── ...... │ ├── catkin_make.cache │ ├── CMakeCache.txt │ ├── CMakeFiles │ │ ├── ...... ├── devel │ ├── env.sh │ ├── lib │ ├── setup.bash │ ├── setup.sh │ ├── _setup_util.py │ └── setup.zsh └── src └── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
通過tree命令可以看到catkin工作空間的結構,它包括了src、build、devel三個路徑,在有些編譯選項下也可能包括其他。但這三個文件夾是catkin編譯系統默認的。它們的具體作用如下:
- src/: ROS的catkin軟件包(源代碼包)
- build/: catkin(CMake)的緩存信息和中間文件
- devel/: 生成的目標文件(包括頭文件,動態鏈接庫,靜態鏈接庫,可執行文件等)、環境變量
在編譯過程中,它們的工作流程如圖:

后兩個路徑由catkin系統自動生成、管理,我們日常的開發一般不會去涉及,而主要用到的是src文件夾,我們寫的ROS程序、網上下載的ROS源代碼包都存放在這里。
在編譯時,catkin編譯系統會遞歸的查找和編譯src/下的每一個源代碼包。因此你也可以把幾個源代碼包放到同一個文件夾下,如下圖所示:

小結
catkin工作空間基本就是以上的結構,package是catkin工作空間的基本單元,我們在ROS開發時,寫好代碼,然后catkin_make,系統就會完成所有編譯構建的工作。至於更詳細的package內容,我們將在下節繼續介紹。
04 Package軟件包
- ROS程序只有組成package才能編譯;
- package是ROS源代碼存放的地方;
- ROS的代碼無論是C++還是Python都要放到package中,這樣才能正常的編譯和運行;
- 一個package可以編譯出來多個目標文件(ROS可執行程序、動態靜態庫、頭文件等等)。
4.1 package結構
一個package下常見的文件、路徑有:
├── CMakeLists.txt #package的編譯規則(必須);定義package的包名、依賴、源文件等 ├── package.xml #package的描述信息(必須);描述package的包名、版本號、作者、依賴等 ├── src/ #存放ROS源代碼文件;包括C++的源碼和(.cpp)以及Python的module(.py) ├── include/ #存放C++源碼對應頭文件 ├── scripts/ #可執行腳本;例如shell腳本(.sh)、Python腳本(.py) ├── msg/ #自定義消息;存放自定義格式的消息(.msg) ├── srv/ #自定義服務;存放自定義格式的服務(.srv) ├── models/ #3D模型文件;存放機器人或仿真場景的3D模型(.sda, .stl, .dae等) ├── urdf/ #urdf文件;存放機器人的模型描述(.urdf或.xacro) ├── launch/ #launch文件;存放launch文件(.launch或.xml)
- 其中定義package的是CMakeLists.txt和package.xml,這兩個文件是package中必不可少的。catkin編譯系統在編譯前,首先就要解析這兩個文件。這兩個文件就定義了一個package。
- 通常ROS文件組織都是按照以上的形式,這是約定俗成的命名習慣,建議遵守。以上路徑中,只有CMakeLists.txt和package.xml是必須的,其余路徑根據軟件包是否需要來決定。
4.2 package的創建
創建一個package需要在catkin_ws/src下,用到catkin_create_pkg命令,用法是:
catkin_create_pkg package depends
其中package是包名,depends是依賴的包名,可以依賴多個軟件包。
例如,新建一個package叫做test_pkg,依賴roscpp、rospy、std_msgs(常用依賴)。
$ catkin_create_pkg test_pkg roscpp rospy std_msgs
這樣就會在當前路徑下新建test_pkg軟件包,包括:
├── CMakeLists.txt
├── include
│ └── test_pkg
├── package.xml
└── src
catkin_create_pkg幫你完成了軟件包的初始化,填充好了CMakeLists.txt和package.xml,並且將依賴項填進了這兩個文件中。
4.3 package相關命令
4.3.1 rospack
rospack是對package管理的工具,命令的用法如下:
| rostopic命令 |
作用 |
| rospack help |
顯示rospack的用法 |
| rospack list |
列出本機所有package |
| rospack depends [package] |
顯示package的依賴包 |
| rospack find [package] |
定位某個package |
| rospack profile |
刷新所有package的位置記錄 |
以上命令如果package缺省,則默認為當前目錄(如果當前目錄包含package.xml)
4.3.2 roscd
roscd命令類似與Linux系統的cd,改進之處在於roscd可以直接cd到ROS的軟件包。
| rostopic命令 |
作用 |
| roscd [pacakge] |
cd到ROS package所在路徑 |
4.3.3 rosls
rosls也可以視為Linux指令ls的改進版,可以直接lsROS軟件包的內容。
| rosls命令 |
作用 |
| rosls [pacakge] |
列出pacakge下的文件 |
4.3.4 rosdep
rosdep是用於管理ROS package依賴項的命令行工具,用法如下:
| rosdep命令 |
作用 |
| rosdep check [pacakge] |
檢查package的依賴是否滿足 |
| rosdep install [pacakge] |
安裝pacakge的依賴 |
| rosdep db |
生成和顯示依賴數據庫 |
| rosdep init |
初始化/etc/ros/rosdep中的源 |
| rosdep keys |
檢查package的依賴是否滿足 |
| rosdep update |
更新本地的rosdep數據庫 |
一個較常使用的命令是:
rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y #用於安裝工作空間中`src`路徑下所有package的依賴項(由pacakge.xml文件指定)
05 CMakeLists.txt
5.1 CMakeLists.txt作用
CMakeLists.txt原本是Cmake編譯系統的規則文件,而Catkin編譯系統基本沿用了CMake的編譯風格,只是針對ROS工程添加了一些宏定義。所以在寫法上,catkin的CMakeLists.txt與CMake的基本一致。
這個文件直接規定了這個package要依賴哪些package,要編譯生成哪些目標,如何編譯等等流程。所以CMakeLists.txt非常重要,它指定了由源碼到目標文件的規則,catkin編譯系統在工作時首先會找到每個package下的CMakeLists.txt,然后按照規則來編譯構建。
5.2 CMakeLists.txt寫法
CMakeLists.txt的基本語法都還是按照CMake,而Catkin在其中加入了少量的宏,總體的結構如下:
cmake_minimum_required() #CMake的版本號 project() #項目名稱 find_package() #找到編譯需要的其他CMake/Catkin package catkin_python_setup() #catkin新加宏,打開catkin的Python Module的支持 add_message_files() #catkin新加宏,添加自定義Message/Service/Action文件 add_service_files() add_action_files() generate_message() #catkin新加宏,生成不同語言版本的msg/srv/action接口 catkin_package() #catkin新加宏,生成當前package的cmake配置,供依賴本包的其他軟件包調用 add_library() #生成庫 add_executable() #生成可執行二進制文件 add_dependencies() #定義目標文件依賴於其他目標文件,確保其他目標已被構建 target_link_libraries() #鏈接 catkin_add_gtest() #catkin新加宏,生成測試 install() #安裝至本機
如果你從未接觸過CMake的語法,請閱讀《CMake實踐》:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf 。掌握CMake語法對於理解ROS工程很有幫助。
5.3 CMakeLists例子
為了詳細的解釋CMakeLists.txt的寫法,我們以turtlesim小海龜這個pacakge為例,讀者可roscd到tuetlesim包下查看,在turtlesim/CMakeLists.txt的寫法如下,:
cmake_minimum_required(VERSION 2.8.3) #CMake至少為2.8.3版 project(turtlesim) #項目(package)名稱為turtlesim,在后續文件中可使用變量${PROJECT_NAME}來引用項目名稱turltesim find_package(catkin REQUIRED COMPONENTS geometry_msgs message_generation rosconsole roscpp roscpp_serialization roslib rostime std_msgs std_srvs) #cmake宏,指定依賴的其他pacakge,實際是生成了一些環境變量,如<NAME>_FOUND, <NAME>_INCLUDE_DIRS, <NAME>_LIBRARYIS #此處catkin是必備依賴 其余的geometry_msgs...為組件 find_package(Qt5Widgets REQUIRED) find_package(Boost REQUIRED COMPONENTS thread) include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}) #指定C++的頭文件路徑 link_directories(${catkin_LIBRARY_DIRS}) #指定鏈接庫的路徑 add_message_files(DIRECTORY msg FILES Color.msg Pose.msg) #自定義msg文件 add_service_files(DIRECTORY srv FILES Kill.srv SetPen.srv Spawn.srv TeleportAbsolute.srv TeleportRelative.srv) #自定義srv文件 generate_messages(DEPENDENCIES geometry_msgs std_msgs std_srvs) #在add_message_files、add_service_files宏之后必須加上這句話,用於生成srv msg頭文件/module,生成的文件位於devel/include中 catkin_package(CATKIN_DEPENDS geometry_msgs message_runtime std_msgs std_srvs) # catkin宏命令,用於配置ROS的package配置文件和CMake文件 # 這個命令必須在add_library()或者add_executable()之前調用,該函數有5個可選參數: # (1) INCLUDE_DIRS - 導出包的include路徑 # (2) LIBRARIES - 導出項目中的庫 # (3) CATKIN_DEPENDS - 該項目依賴的其他catkin項目 # (4) DEPENDS - 該項目所依賴的非catkin CMake項目。 # (5) CFG_EXTRAS - 其他配置選項 set(turtlesim_node_SRCS src/turtlesim.cpp src/turtle.cpp src/turtle_frame.cpp ) set(turtlesim_node_HDRS include/turtlesim/turtle_frame.h ) #指定turtlesim_node_SRCS、turtlesim_node_HDRS變量 qt5_wrap_cpp(turtlesim_node_MOCS ${turtlesim_node_HDRS}) add_executable(turtlesim_node ${turtlesim_node_SRCS} ${turtlesim_node_MOCS}) # 指定可執行文件目標turtlesim_node target_link_libraries(turtlesim_node Qt5::Widgets ${catkin_LIBRARIES} ${Boost_LIBRARIES}) # 指定鏈接可執行文件 add_dependencies(turtlesim_node turtlesim_gencpp) add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp) target_link_libraries(turtle_teleop_key ${catkin_LIBRARIES}) add_dependencies(turtle_teleop_key turtlesim_gencpp) add_executable(draw_square tutorials/draw_square.cpp) target_link_libraries(draw_square ${catkin_LIBRARIES} ${Boost_LIBRARIES}) add_dependencies(draw_square turtlesim_gencpp) add_executable(mimic tutorials/mimic.cpp) target_link_libraries(mimic ${catkin_LIBRARIES}) add_dependencies(mimic turtlesim_gencpp) # 同樣指定可執行目標、鏈接、依賴 install(TARGETS turtlesim_node turtle_teleop_key draw_square mimic RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) # 安裝目標文件到本地系統 install(DIRECTORY images DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} FILES_MATCHING PATTERN "*.png" PATTERN "*.svg")
06 package.xml
package.xml也是一個catkin的package必備文件,它是這個軟件包的描述文件,在較早的ROS版本(rosbuild編譯系統)中,這個文件叫做manifest.xml,用於描述pacakge的基本信息。如果你在網上看到一些ROS項目里包含着manifest.xml,那么它多半是hydro版本之前的項目了。
6.1 package.xml作用
pacakge.xml包含了package的名稱、版本號、內容描述、維護人員、軟件許可、編譯構建工具、編譯依賴、運行依賴等信息。
實際上rospack find、rosdep等命令之所以能快速定位和分析出package的依賴項信息,就是直接讀取了每一個pacakge中的package.xml文件。它為用戶提供了快速了解一個pacakge的渠道。
6.2 package.xml寫法
pacakge.xml遵循xml標簽文本的寫法,由於版本更迭原因,現在有兩種格式並存(format1與format2),不過區別不大。老版本(format1)的pacakge.xml通常包含以下標簽:
<pacakge> 根標記文件 <name> 包名 <version> 版本號 <description> 內容描述 <maintainer> 維護者 <license> 軟件許可證 <buildtool_depend> 編譯構建工具,通常為catkin <build_depend> 編譯依賴項,與Catkin中的 <run_depend> 運行依賴項
說明:其中1-6為必備標簽,1是根標簽,嵌套了其余的所有標簽,2-6為包的各種屬性,7-9為編譯相關信息。
在新版本(format2)中,包含的標簽為:
<pacakge> 根標記文件 <name> 包名 <version> 版本號 <description> 內容描述 <maintainer> 維護者 <license> 軟件許可證 <buildtool_depend> 編譯構建工具,通常為catkin <depend> 指定依賴項為編譯、導出、運行需要的依賴,最常用 <build_depend> 編譯依賴項 <build_export_depend> 導出依賴項 <exec_depend> 運行依賴項 <test_depend> 測試用例依賴項 <doc_depend> 文檔依賴項
由此看見新版本的pacakge.xml格式上增加了 、、、 ,相當於將之前的build和run依賴項描述進行了細分。
目前Indigo、Kinetic、Lunar等版本的ROS都同時支持兩種版本的package.xml,所以無論選哪種格式都可以。
6.3 pacakge.xml例子
為了說明pacakge.xml寫法,還是以turtlesim軟件包為例,其pacakge.xml文件內容如下,我們添加了相關的注釋:
<?xml version="1.0"?> <!--本示例為老版本的pacakge.xml--> <package> <!--pacakge為根標簽,寫在最外面--> <name>turtlesim</name> <version>0.8.1</version> <description> turtlesim is a tool made for teaching ROS and ROS packages. </description> <maintainer email="dthomas@osrfoundation.org">Dirk Thomas</maintainer> <license>BSD</license> <url type="website">http://www.ros.org/wiki/turtlesim</url> <url type="bugtracker">https://github.com/ros/ros_tutorials/issues</url> <url type="repository">https://github.com/ros/ros_tutorials</url> <author>Josh Faust</author> <!--編譯工具為catkin--> <buildtool_depend>catkin</buildtool_depend> <!--編譯時需要依賴以下包--> <build_depend>geometry_msgs</build_depend> <build_depend>qtbase5-dev</build_depend> <build_depend>message_generation</build_depend> <build_depend>qt5-qmake</build_depend> <build_depend>rosconsole</build_depend> <build_depend>roscpp</build_depend> <build_depend>roscpp_serialization</build_depend> <build_depend>roslib</build_depend> <build_depend>rostime</build_depend> <build_depend>std_msgs</build_depend> <build_depend>std_srvs</build_depend> <!--運行時需要依賴以下包--> <run_depend>geometry_msgs</run_depend> <run_depend>libqt5-core</run_depend> <run_depend>libqt5-gui</run_depend> <run_depend>message_runtime</run_depend> <run_depend>rosconsole</run_depend> <run_depend>roscpp</run_depend> <run_depend>roscpp_serialization</run_depend> <run_depend>roslib</run_depend> <run_depend>rostime</run_depend> <run_depend>std_msgs</run_depend> <run_depend>std_srvs</run_depend> </package>
以上內容是老版本(format1)的寫法,如果要寫成新版本(format2)則可以改為:
<?xml version="1.0"?> <package format="2"> <!--在聲明pacakge時指定format2,為新版格式--> <name>turtlesim</name> <version>0.8.1</version> <description> turtlesim is a tool made for teaching ROS and ROS packages. </description> <maintainer email="dthomas@osrfoundation.org">Dirk Thomas</maintainer> <license>BSD</license> <url type="website">http://www.ros.org/wiki/turtlesim</url> <url type="bugtracker">https://github.com/ros/ros_tutorials/issues</url> <url type="repository">https://github.com/ros/ros_tutorials</url> <author>Josh Faust</author> <!--編譯工具為catkin--> <buildtool_depend>catkin</buildtool_depend> <!--用depend來整合build_depend和run_depend--> <depend>geometry_msgs</depend> <depend>rosconsole</depend> <depend>roscpp</depend> <depend>roscpp_serialization</depend> <depend>roslib</depend> <depend>rostime</depend> <depend>std_msgs</depend> <depend>std_srvs</depend> <!--build_depend標簽未變--> <build_depend>qtbase5-dev</build_depend> <build_depend>message_generation</build_depend> <build_depend>qt5-qmake</build_depend> <!--run_depend要改為exec_depend--> <exec_depend>libqt5-core</exec_depend> <exec_depend>libqt5-gui</exec_depend> <exec_dep
07 Metapackage
7.1 Metapackage介紹
在一些ROS的教學資料和博客里,你可能還會看到一個Stack(功能包集)的概念,它指的是將多個功能接近、甚至相互依賴的軟件包的放到一個集合中去。但Stack這個概念在Hydro之后就取消了,取而代之的就是Metapackage。盡管換了個馬甲,但它的作用沒變,都是把一些相近的功能模塊、軟件包放到一起。
ROS里常見的Metapacakge有:
| Metapacakge名稱 |
描述 |
鏈接 |
| navigation |
導航相關的功能包集 |
https://github.com/ros-planning/navigation |
| moveit |
運動規划相關的(主要是機械臂)功能包集 |
https://github.com/ros-planning/moveit |
| image_pipeline |
圖像獲取、處理相關的功能包集 |
https://github.com/ros-perception/image_common |
| vision_opencv |
ROS與OpenCV交互的功能包集 |
https://github.com/ros-perception/vision_opencv |
| turtlebot |
Turtlebot機器人相關的功能包集 |
https://github.com/turtlebot/turtlebot |
| pr2_robot |
pr2機器人驅動功能包集 |
https://github.com/PR2/pr2_robot |
| ... |
... |
... |
以上列舉了一些常見的功能包集,例如navigation、turtlebot,他們都是用於某一方面的功能,以navigation metapackage(官方介紹里仍然沿用stack的叫法)為例,它包括了以下軟件包:
| 包名 |
功能 |
| navigation |
Metapacakge,依賴以下所有pacakge |
| amcl |
定位 |
| fake_localization |
定位 |
| map_server |
提供地圖 |
| move_base |
路徑規划節點 |
| nav_core |
路徑規划的接口類 |
| baselocalplanner |
局部規划 |
| dwalocalplanner |
局部規划 |
| ... |
... |
這里只看一個軟件包navigation。這個navigation就是一個簡單的pacakge,里面只有幾個文件,但由於它依賴了其他所有的軟件包。Catkin編譯系統會明白,這些軟件包都屬於navigation metapacakge。
這個道理並不難理解,比如我們在安裝ROS時,用到了命令,由於它依賴了ROS所有的核心組件,我們在安裝時也就能夠安裝整個ROS。
sudo apt-get install ros-kinetic-desktop-full
7.2 Metapackage寫法
我們以ROS-Academy-for-beginners為例介紹meteapckage的寫法,在教學包內,有一個ros-academy-for-beginners軟件包,該包即為一個metapacakge,其中有且僅有兩個文件:CMakeLists.txt和pacakge.xml。
CMakeLists.txt寫法如下:
cmake_minimum_required(VERSION 2.8.3) project(ros_academy_for_beginners) find_package(catkin REQUIRED) catkin_metapackage() #聲明本軟件包是一個metapacakge
pacakge.xml寫法如下:
<package>
<name>ros_academy_for_beginners</name>
<version>17.12.4</version>
<description>
--------------------------------------------------------------------------
A ROS tutorial for beginner level learners. This metapacakge includes some
demos of topic, service, parameter server, tf, urdf, navigation, SLAM...
It tries to explain the basic concepts and usages of ROS.
--------------------------------------------------------------------------
</description>
<maintainer email="chaichangkun@163.com">Chai Changkun</maintainer>
<author>Chai Changkun</author>
<license>BSD</license>
<url>http://http://www.droid.ac.cn</url>
<buildtool_depend>catkin</buildtool_depend>
<run_depend>navigation_sim_demo</run_depend> <!--注意這里的run_depend標簽,將其他軟件包都設為依賴項-->
<run_depend>param_demo</run_depend>
<run_depend>robot_sim_demo</run_depend>
<run_depend>service_demo</run_depend>
<run_depend>slam_sim_demo</run_depend>
<run_depend>tf_demo</run_depend>
<run_depend>topic_demo</run_depend>
<export> <!--這里需要有export和metapacakge標簽,注意這種固定寫法-->
<metapackage/>
</export>
</package>
metapacakge中的以上兩個文件和普通pacakge不同點是:
- CMakeLists.txt:加入了catkin_metapackage()宏,指定本軟件包為一個metapacakge。
- package.xml:標簽將所有軟件包列為依賴項,標簽中添加標簽聲明。
metapacakge在我們實際開發一個大工程時可能有用。
08 其他常見文件類型
在ROS的pacakge中,還有其他許多常見的文件類型,這里做個總結。
8.1 launch文件
launch文件一般以.launch或.xml結尾,它對ROS需要運行程序進行了打包,通過一句命令來啟動。一般launch文件中會指定要啟動哪些package下的哪些可執行程序,指定以什么參數啟動,以及一些管理控制的命令。 launch文件通常放在軟件包的launch/路徑中。
8.2 msg/srv/action文件
ROS程序中有可能有一些自定義的消息/服務/動作文件,為程序的開發者所設計的數據結構,這類的文件以.msg,.srv,.action結尾,通常放在package的msg/,srv/,action/路徑下。
8.3 urdf/xacro文件
urdf/xacro文件是機器人模型的描述文件,以.urdf或.xacro結尾。它定義了機器人的連桿和關節的信息,以及它們之間的位置、角度等信息,通過urdf文件可以將機器人的物理連接信息表示出來。並在可視化調試和仿真中顯示。
8.4 yaml文件
yaml文件一般存儲了ROS需要加載的參數信息,一些屬性的配置。通常在launch文件或程序中讀取.yaml文件,把參數加載到參數服務器上。通常我們會把yaml文件存放在param/路徑下
8.5 dae/stl文件
dae或stl文件是3D模型文件,機器人的urdf或仿真環境通常會引用這類文件,它們描述了機器人的三維模型。相比urdf文件簡單定義的性狀,dae/stl文件可以定義復雜的模型,可以直接從solidworks或其他建模軟件導出機器人裝配模型,從而顯示出更加精確的外形。
8.6 rviz文件
rviz文件本質上是固定格式的文本文件,其中存儲了RViz窗口的配置(顯示哪些控件、視角、參數)。通常rviz文件不需要我們去手動修改,而是直接在RViz工具里保存,下次運行時直接讀取。
