參考資料:
https://www.icourse163.org/course/ISCAS-1002580008?tid=1003713012 //中國大學MOOC
https://www.bilibili.com/video/av23401751 //B站
《ROS操作系統入門講義》PDF下載
鏈接:https://pan.baidu.com/s/1OCja2WLDRnjYXMrpnZ3-sQ
提取碼:mziy
第二章 ROS文件系統
1. Catkin編譯系統(Groovy版本后投入使用) //早期的ROS編譯系統是rosbuild
(1)特點
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軟件包
- 將本軟件包添加到環境變量
(2)工作原理
catkin編譯的工作流程如下: //相當於封裝了cmake和make
- 首先在工作空間 catkin_ws/src/ 下遞歸的查找其中每一個ROS的package
- package中會有 package.xml 和 CMakeLists.txt 文件,Catkin(CMake)編譯系統依據 CMakeLists.txt 文件,從而生成 makefiles (放在 catkin_ws/build/ )
- 然后 make 剛剛生成的 makefiles 等文件,編譯鏈接生成可執行文件(放在 catkin_ws/devel )
注:要用catkin編譯一個工程或軟件包,只需要用 catkin_make 指令 //catkin編譯之前需要回到工作空間目錄, catkin_make 在其他路徑下編譯不會成功,如果有新的目標文件產生需要緊接着“source刷新環境”
2. Catkin工作空間
(1)初始化
1 $ mkdir -p ~/catkin_ws/src 2 $ cd ~/catkin_ws/ 3 $ catkin_make #初始化工作空間
- catkin_make命令必須位於工作空間目錄catkin_ws下運行
- 原先的初始化命令catkin_init_workspace在src目錄下運行
(2)結構介紹 //用 tree 命令查看
1 $ cd ~/catkin_ws 2 $ sudo apt install tree 3 $ tree
默認包含三個文件夾:
- src/: ROS的catkin軟件包(源代碼包)
- build/: catkin(CMake)的緩存信息和中間文件
- devel/: 生成的目標文件(包括頭文件,動態鏈接庫,靜態鏈接庫,可執行文件等)、環境變量
編譯流程如下:
注:yaml文件一般存儲了ROS需要加載的參數信息,一些屬性的配置。通常在launch文件或程序中讀取.yaml文件,把參數加載到參數服務器上。
3. package軟件包 //catkin編譯的基本單元
(1)結構
一個package下常見的文件、路徑有
其中CMakeLists.txt和package.xml定義了整個package(必不可少)
- CMakeLists.txt: 定義package的包名、依賴、源文件、目標文件等編譯規則
- package.xml: 描述package的包名、版本號、作者、依賴等信息
- src/: 存放ROS的源代碼,包括C++的源碼和(.cpp)以及Python的module(.py)
- include/: 存放C++源碼對應的頭文件
- scripts/: 存放可執行腳本,例如shell腳本(.sh)、Python腳本(.py)
- msg/: 存放自定義格式的消息(.msg)
- srv/: 存放自定義格式的服務(.srv)
- models/: 存放機器人或仿真場景的3D模型(.sda, .stl, .dae等)
- urdf/: 存放機器人的模型描述(.urdf或.xacro)
- launch/: 存放launch文件(.launch或.xml)
(2)package的創建:catkin_create_pkg 命令
用法:catkin_create_pkg 包名 依賴項 // 如catkin_create_pkg test_pkg roscpp rospy std_msgs
(3)相關命令
常用命令:rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y //用於安裝工作空間中 src 路徑下所有package的依賴項(由pacakge.xml文件指定)
4. CMakeLists.txt:規定了package要依賴哪些package,要編譯生成哪些目標,如何編譯等等流程
非常重要,它指定了由源碼到目標文件的規則,catkin編譯系統在工作時首先會找到每個package下的CMakeLists.txt,然后按照規則來編譯構建。
(1)寫法 //進一步的CMake語法可參考《CMake實踐》:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf
總體的宏結構如下:
(2)示例(turtlesim包下的turtlesim/CMakeLists.txt)
5. package.xml:軟件包的描述文件,描述包的基本信息
(1)作用
- pacakge.xml 包含了package的名稱、版本號、內容描述、維護人員、軟件許可、編譯構建工具、編譯依賴、運行依賴等信息。
- 實際上 rospack find 、 rosdep 等命令之所以能快速定位和分析出package的依賴項信息,就是直接讀取了每一個package中的 package.xml 文件,為用戶提供了快速了解一個package的渠道。
(2)寫法:遵循xml標簽的寫法
格式1(old):
其中,1-6為必備標簽
格式2(new):
(3)示例(turtlesim/package)
老版本
新版本
6. Metapackage //老版本里的概念為“功能包集”stack
作用:將一些相近的功能模塊、軟件包放到一起
(1)常見metapackage
其中,navigation metapackage包含以下軟件包:
navigation就是一個簡單的package,里面只有幾個文件,但它依賴了其他所有的軟件包
(2)寫法 //metapackage為虛包,無具體的包文件
一般有且僅有兩個文件:CMakeLists.txt 和 pacakge.xml
CMakeLists.txt 寫法如下:
1 cmake_minimum_required(VERSION 2.8.3) 2 project(ros_academy_for_beginners) 3 find_package(catkin REQUIRED) 4 catkin_metapackage() #聲明本軟件包是一個metapacakge
package.xml 寫法如下:
與普通package的不同之處:
- CMakeLists.txt :加入了catkin_metapackage()宏,指定本軟件包為一個metapacakge
- package.xml :標簽將所有軟件包列為依賴項,標簽中添加標簽聲明。