ROS 教學系列(三)-ROS 1 與 ROS 2 的差異

ROS 教學系列(三)-ROS 1 與 ROS 2 的差異

本篇文章將從系統架構、用戶端的程式語言、使用現有的中介軟體層與編譯系統四個重點,說明 ROS 1 與 ROS 2 之間的差異性,若想瞭解更詳細的差異,可以參考「Changes between ROS 1 and ROS 2」,最後會依據使用者的身分為大家分析應該使用 ROS 1 或是 ROS 2 的時機。

一、系統架構

ROS 1 與 ROS 2 在使用上的最大差異性,在於各個節點之間的連接方式,我們將以下圖說明 ROS 1 與 ROS 2 的系統架構差異性:

1. 系統層(Operating System Layer)

・ ROS 1 僅支援 Linux 系統,不過在 2018 年時,微軟宣布在 Windows 10 上也能夠以實驗性質的方式安裝 ROS 1。

・ ROS 2 則能夠支援較多的作業系統,如:Linux、Windows、Mac、RTOS。

2. 中介軟體層(Middleware Layer)

・ ROS 1 採用 TCPROS/UDPROS 為通訊標準。

・ ROS 2 則是使用 DDS 為通訊標準。

3. 應用層(Application Layer)

・ ROS 1 需要使用主節點(Master Node)連接其餘節點,因此若是主節點失去作用,則整個 ROS 1 系統將會無法使用。

・ ROS 2 使用分布式發現機制(distributed discovery process)連結節點,若是其中一個節點失去作用,並不至於讓整個 ROS 2 系統停擺。

二、用戶端的程式語言

ROS 的目的是為了提高程式碼的使用率,因此不論是 ROS 1 或 ROS 2,皆能夠支援多種程式語言讓開發者進行使用。下面我們將以開發者最常使用的兩種程式語言進行差異性的比較:

1. C++

・ ROS 1 中, 主要是以 C++ 03 作為核心, 並且無法使用 C++ 11 的 API(Application Programming Interface)特性。

・ ROS 2 廣泛地使用C++ 11 的特性,並且在最新的長期支援版本 Foxy 中使用了 C++ 14,預計之後的版本將會使用 C++ 17 做為主要的平台使用。

2. Python

・ ROS 1 中,以 Python 2 作為核心,不過在最新的 ROS 1 -Noetic 版本中則是以 Python 3 作為核心。

・ ROS 2 則是使用 Python 3.5 以上作為核心。

三、使用現有的中介軟體層

・ ROS 1 使用自訂義的序列化格式、傳輸協定與中心探索機制。

・ ROS 2 擁有抽象化中介軟體介面支援序列化、傳輸與探索機制,並且基於 DDS 標準上實現功能,這也讓 ROS 2 能夠提供 QOS 以改善位於各種不同網路上的通訊品質。

四、編譯系統

・ ROS 1 在 groovy 版本之後採用 catkin 編譯系統,這是以 Cmake 為中心的編譯系統,因此就算使用者的 ROS 1 功能套件包完全以 Python 撰寫,也必須由 Cmake 進行處理,然而 Cmake 並不支援 Python setuptools 中的所有功能。除此之外,在 Windows 系統上也較不容易移植 Cmake 專案。

・ ROS 2 在最新的長期支援版本 Foxy 中,使用了 colcon 編譯系統,可搭配 ament_tools 對使用 Python 的功能套件包進行編譯。

五、 ROS 1 與 ROS 2 差異比較表

項目ROS 1 ROS 2
系統層期僅能使用官方維護的 Linux,後續新增第三方社群自行開發的系統支援 Linux、Windows、Mac、RTOS

中介軟體使用 TCPROS/UDPROS 通訊標準, 這使得每個機器人 IP 位址皆需要特別指定,並且需要指定其中一台機器人作為主要節點(Master Node) 的載體,所有機器人皆須要透過主要節點才能夠與其他機器人進行連結


使用資料分布服務 DDS(Data Distribution Service)通訊標準透過全局資料空間(Global Data Space)的概念,這讓所有機器人僅需要設定一個「領域 ID(Domain ID) 」,即可互相通訊,每個機器人皆可自行接收與發布訊息。
應用層使用主節點(Master Node)連接其餘節點,因此若是主節點失去作用,則整個 ROS 1 系統將會無法使用。使用分布式發現機制(distributed discovery process)連結節點,若是其中一個節點失去作用,則不至於讓整個 ROS 2 系統停擺。
主流程式
語言差異
C++ 03
Python 2
Python 3(Noetic)
C++14(Foxy)
C++17(future version)
Python 3.5(at least)
編譯系統catkincolcon

六、使用 ROS 1 / ROS 2 的時機?

ROS 2 預計在 2023 年完全取代 ROS 1,但這也並不意謂著 ROS 1 將會被停止更新,ROS 1 最新也是最後的長期支援版本 Noetic 預計將會在 2025 年停止更新。那麼現在到底該使用 ROS 1 還是 ROS 2 呢?以下將會以使用者的身分類別向大家分析使用 ROS 1 或是 ROS 2 的時機。

1. 學習者

可以擁有更豐富的資源,這將會增加學習的效率與速度,ROS 1 在經歷將近 15 年的發展後,已經積累了相當多的開源功能套件包可供使用,學習者將可以透過大量的開源功能套件包,瞭解 ROS 1 的設計架構與遵循標準。

關於ROS 1 開源功能套件包請參考 ROS Index 官方文件,ROS 1 的遵循標準請參考Index of ROS Enhancement Proposals (REPs)。並且現在的網際網路技術是基於TCP/IP 通訊協定形成的網際網路,ROS 1 也透過此項協定完成多機通訊,對於熟悉現代網際網路技術的學習者們會是較為容易理解與配置的功能。

2. 開發者

ROS 2 是在 ROS 1 的基礎上改進的新世代機器人操作系統,因此在熟悉 ROS 1 的基礎上,將能夠更容易、快速地理解 ROS 2 設計架構。

ROS 1 的最新版本 Noetic 預計支援到 2025 年,並且在 ROS Discourse 有多人討論 ROS 2 預計在 2023 年完全取代 ROS 1。雖然 ROS 2 全面取代 ROS 1 的確切時間點尚有待確定,但 ROS 2 取代 ROS 1 確實是一件正在進行的事,並且 ROS 2 Foxy 版本已足夠成熟,可以讓開發者創造出符合真實世界的機器人應用程式。

七、小結

閱讀完上述的內容後,各位是不是對於 ROS 1 與 ROS 2 的差異有更進一步的認識了呢?下一篇 ROS 教學系列我們將要跟大家分享如何安裝 ROS 2 ?

如果喜歡我們的文章,請大家多多分享與支持,並持續關注我們最詳細的 ROS 教學系列喔!