- 機器人SLAM導航:核心技術與實戰
- 張虎
- 2004字
- 2022-01-04 17:29:14
1.3 ROS系統架構
安裝完ROS后,很多朋友應該迫不及待想立馬開始寫程序。由于ROS的架構比較復雜,為了后面容易理解遇到的各種概念,這里先討論一下ROS的系統架構,好讓大家對ROS中的各種概念有全面性把控。按照官方的說法,可以分別從計算圖、文件系統和開源社區視角來理解ROS架構[1]28-30。
1.3.1 從計算圖視角理解ROS架構
ROS中可執行程序的基本單位叫節點(node),節點之間通過消息機制進行通信,這樣就組成了一張網狀圖,也叫計算圖,如圖1-3所示。

圖1-3 ROS的計算圖結構
節點是可執行程序,通常也叫進程。ROS功能包中創建的每個可執行程序在被啟動加載到系統進程中后,就是一個ROS節點,如圖1-3中的節點1、節點2、節點3等。節點之間通過收發消息進行通信,消息收發機制分為話題(topic)、服務(service)和動作(action)三種,如圖1-3中的節點2與節點3、節點2與節點5采用話題通信,節點2與節點4采用服務通信,節點1與節點2采用動作通信。計算圖中的節點、話題、服務、動作都要有唯一名稱作為標識。ROS利用節點將代碼和功能解耦,提高了系統的容錯性和可維護性。所以最好讓每個節點都具有特定的單一功能,而不是創建一個包羅萬象的龐大節點。如果用C++編寫節點,需要用到ROS提供的roscpp庫;如果用Python編寫節點,需要用到ROS提供的rospy庫。
消息是構成計算圖的關鍵,包括消息機制和消息類型兩部分。消息機制有話題、服務和動作三種,每種消息機制中傳遞的數據都具有特定的數據類型(即消息類型),消息類型可分為話題消息類型、服務消息類型和動作消息類型。消息機制和消息類型將在1.5節中展開講解。
數據包(rosbag)是ROS中專門用來保存和回放話題中數據的文件,可以將一些難以收集的傳感器數據用數據包錄制下來,然后反復回放來進行算法性能調試。
參數服務器能夠為整個ROS網絡中的節點提供便于修改的參數。參數可以認為是節點中可供外部修改的全局變量,有靜態參數和動態參數。靜態參數一般用于在節點啟動時設置節點工作模式;動態參數可以用于在節點運行時動態配置節點或改變節點工作狀態,比如電機控制節點里的PID控制參數。
主節點負責各個節點之間通信過程的調度管理。因此主節點必須要最先啟動,可以通過roscore命令啟動。
1.3.2 從文件系統視角理解ROS架構
ROS程序的不同組件要放在不同的文件夾中,這些文件夾根據不同的功能對文件進行組織,這就是ROS的文件系統結構,如圖1-4所示。

圖1-4 ROS的文件系統結構
工作空間是一個包含功能包、編譯包和編譯后可執行文件的文件夾,用戶可以根據自己的需要創建多個工作空間,在每個工作空間中開發不同用途的功能包。在圖1-4中,我們創建了一個名為catkin_ws的工作空間,其中包含src、build和devel三個文件夾。src文件夾放置各個功能包和配置功能包的CMake配置文件CMakeLists.txt。這里說明一下,由于ROS中的源碼采用catkin工具進行編譯,而catkin工具又基于CMake技術,所以我們在src源文件空間和各個功能包中都會見到一個CMake配置文件CMakeLists.txt,這個文件起到配置編譯的作用。build文件夾放置編譯CMake和catkin功能包時產生的緩存、配置、中間文件等。devel文件夾放置編譯好的可執行程序,這些可執行程序是不需要安裝就能直接運行的。一旦功能包源碼編譯和測試通過后,可以將這些編譯好的可執行文件直接導出與其他開發人員分享。
功能包是ROS中軟件組織的基本形式,具有創建ROS程序的最小結構和最少內容,它包含ROS節點源碼、腳本、配置文件等。① CMakeLists.txt是功能包配置文件,用于編譯Cmake功能包編譯時的編譯配置。② package.xml是功能包清單文件,用xml的標簽格式標記該功能包的各類相關信息,比如包的名稱、開發者信息、依賴關系等,主要是為了使功能包的安裝和分發更容易。③ include/<pkg_name>是功能包頭文件目錄,可以把功能包程序中包含的*.h頭文件放在這里。include目錄之所以還要加一級路徑<pkg_name>是為了更好地區分自己定義的頭文件和系統標準頭文件,<pkg_name>用實際功能包的名稱替代。不過這個文件夾不是必要項,比如有些程序沒有頭文件。④ msg、srv和action這三個文件夾分別用于存放非標準話題消息、服務消息和動作消息的定義文件。ROS支持用戶自定義消息通信過程中使用的消息類型。這些自定義消息不是必要的,比如程序只使用標準消息類型。⑤ scripts目錄存放Bash、Python等腳本文件,為非必要項。⑥ launch目錄存放節點的啟動文件,*.launch文件用于啟動一個或多個節點,在含有多個節點的大型項目中很有用,為非必要項。⑦ src目錄存放功能包節點所對應的源代碼,一個功能包中可以有多個節點程序來完成不同的功能,每個節點程序都可以單獨運行。這里src目錄存放的是這些節點程序的源代碼,你可以按需創建文件夾和文件來組織源代碼,源代碼可以用C++、Python等編寫。
1.3.3 從開源社區視角理解ROS架構
ROS是開源軟件,各個獨立的網絡社區分享和貢獻軟件及教程,形成了強大的ROS開源社區,如圖1-5所示。

圖1-5 ROS的開源社區結構
ROS的發展依賴于開源和共享的軟件,這些代碼由不同的機構共享和發布,比如GitHub源碼共享、Ubuntu軟件倉庫發布、第三方庫等。ROS的官方wiki是重要的文檔討論社區,在里面可以很方便地發布與修改相應的文檔頁面。ROS的answer主頁里有大量ROS開發者的提問和回答,對ROS開發中遇到的各種問題的討論很活躍。