ROS2.0整體架構說明


ROS2.0整體架構說明

說明: 
- 介紹ROS2.0相關概念,以及與ROS1.0的異同

ros2目標: 
- 支持涉及不可靠網絡的多機器人系統 
- ”bare-metal“ 微控制器 
- 支持實時控制器 
- 消除原型和最終產品之間的差距 
- 多平台支持

ROS2的目標,也是目前存在與ROS1中的問題,至於如何解決,就讓我們慢慢探索ROS2.0時代到底帶來了哪些改變。

ROS2.0的架構

這里寫圖片描述
上圖所示是ROS2與ROS1整體架構的對比

  1. ROS1主要構建於Linux系統

    ROS2支持構建的系統包括Linux、windows、Mac、RTOS,甚至沒有操作系統的裸機。

  2. ROS1的通訊系統基於TCPROS/UDPROS,強依賴於master節點的處理(可以想像master一掛,整個系統會面臨如何的窘境)。

    ROS2的通訊系統是基於DDS,同時在內部提供了DDS的抽象層實現,用戶就可以不去關注底層的DDS使用了哪個商家的API。

  3. ROS中最重要的一個概念就是“節點”,基於發布/訂閱模型的節點使用,可以讓開發者並行開發低耦合的功能模塊,並且便於進行二次復用。

    ROS2得益於DDS的加入,發布/訂閱模型也會發生改變。

  4. 兩個很重要的獨立模塊“Nodelet”和“Intra-process”。在ROS1的架構中Nodelet和TCPROS/UDPROS是並列的層次,負責通訊,實際上Nodelet是為同一個進程中的多個節點提供一種更優化的數據傳輸方式。

    ROS2中保留了這種數據傳輸方式,只不過換了一個名字,叫“Intra-process”,同樣也是獨立於DDS。

DDS是什么

DDS(Data Distribution Service)即數據分發服務。它是一個專門為實時系統設計的數據分發/訂閱標准,目前已成為分布式實時系統中數據發布/訂閱的標准解決方案。

DDS 的技術核心是以數據為核心的發布訂閱模型(Data-Centric Publish-Subscribe ,DCPS),DCPS模型創建了一個“全局數據空間“的概念,所有獨立的應用都可以去訪問。在DDS中,每一個發布者或者訂閱者都成為參與者,類似於ROS中節點的概念。每一個參與者都可以使用某種定義好的數據類型來讀寫全局數據空間。好像和ROS1的發布訂閱差不多,那我們來對比一下兩個模型

這里寫圖片描述 
ROS1中,一個節點想要發布消息,需要在master中注冊一下,讓master知道你這個節點要干什么。另外一個節點想要訂閱消息,就需要去問問master哪里有這個消息,master發現這兩個節點相互之間“有意思”,酒吧把IP地址告訴他們,接下來兩個節點就開始私聊,也就沒有master什么事了,就算兩個節點鬧矛盾聯系不上,master也管不着。

DDS中的模型就人性化多了:

  1. 參與者(Domain Participant):一個參與者就是一個容器,對應於一個使用DDS的用戶,任何DDS的用戶都必須通過Participant來訪問全局數據空間。
  2. 發布者(Publisher):數據發布的執行者,支持多種數據類型的發布,可以與多個數據寫入器(DataWriter)相聯,發布一種或多種主題(Topic)的消息。
  3. 訂閱者(Subscriber):數據訂閱的執行者,支持多種數據類型的訂閱,可以與多個數據讀取器(DataReader)相聯,訂閱一種或多種主題(Topic)的消息。
  4. 數據寫入器(DataWriter):應用向發布者更新數據的對象,每個數據寫入器對應一個特定的Topic,類似於ROS1中的一個消息發布者。
  5. 數據讀取器(DataReader):應用從訂閱者讀取數據的對象,每個數據讀取器對應一個特定的Topic,類似於ROS1中的一個消息訂閱者。
  6. 主題(Topic):這個和ROS1中的Topic概念一致
  7. QoS Policy:Quality of Service,質量服務原則,負責數據質量的。QoS是DDS中非常重要的一環,控制了各方面與底層的通訊機制,主要從時間限制、可靠性、持續性、歷史記錄幾個方面,滿足用戶針對不同場景的數據應用需求。

從上邊DDS的幾個重要概念中,我們就可以看到ROS2相比於ROS1,在以下方面有所提升:

  • 實時性增強:數據必須在deadline之前完成更新。

  • 持續性增強:ROS1盡管存在數據隊列的概念,但是還有很大的局限,訂閱者無法接收到加入網絡之前的數據;

    ​ DDS可以為ROS提供數據歷史的服務,就算新加入的節點,也可以獲取發布的所有歷史數據。

  • 可靠性增強:通過DDS配置可靠性原則,用戶可以根據需求選擇性能模式(BEST_EFFORT)或者穩定模式(RELIABLE)。

ROS2實踐

ROS2里沒有master,那么節點之間是怎么知道彼此存在的呢?

自動發現的機制——Discovery。 
簡單來說,當一個節點啟動后,首先在網絡中發條廣播,大聲告訴這個世界我來了,其他節點聽到之后,紛紛反饋各自的信息,這樣一來二去也就聯系上了

萬一哪個節點掉線了怎們辦?

沒關系,每個節點都會周期性的發布廣播,告訴其他節點他還在線,就算要下線,他也會廣播告訴其他節點他要走了。

ROS2安裝

參考ROS2安裝使用教程,這里不再詳細說明 
1. ROS2的API並不是在ROS1的基礎上查漏補缺,而是完全從新設計。關於ROS2的API說明,可以參考API文檔:http://docs.ros2.org/beta1/api/rclcpp/index.html 
2. 使用了更多C++的特性,比如auto、make_shared等。 
3. 加入了QoS配置,QoS有默認的配置rmw_qos_profile_default 。 
4. 代碼的總體架構還是與ROS1極為相似的。

ament編譯系統

ament是一種元編譯系統,用來構建組成應用程序的多個獨立功能包,是catkin編譯系統進一步演化的版本 
主要分為兩個部分: 
1. 編譯系統:配置、編譯、安裝獨立的功能包 
2. 構建工具:將多個獨立的功能包按照一定的拓撲結構進行鏈接

關於獨立功能包之間的依賴關系,和ROS1相同,也需要在清單文件——package.xml中進行聲明

ament的命令行工具

ament_tools是ament為用戶提供的一種命令行工具,可以讓用戶完成功能包的編譯、測試、安裝、卸載,它本身也是一個Python的功能包。

從功能上來看,ament_tools和cantkin系統中的catkin_tools類似,目前並不提供並行構建的能力,將來應該會加入。

ament vs catkin 
cantkin缺陷 
1. CMake centric 
catkin系統以 CMake為中心,所以只包含python代碼的功能包也需要由CMake進行處理,但是CMake並不支持Python setuptools中的所有功能,而且也很難在Window上進行移植。

  1. Devel space 
    在catkin系統構建完成后,會在工作目錄下生成一個devel文件夾,里邊是編譯好的功能包,以及環境變量的設置等等,基本上等同於ROS安裝完成后的目錄結構和作用。但是相信很多初學者因為devel中的環境變量而苦惱過,這確實為用戶帶來了一些不必要的麻煩。

  2. CMAKE_PREFIX_PATH 
    catkin會將編譯多個工作區的前綴存儲到環境變量CMAKE_PREFIX_PATH 中,但是這種方法會干擾變量中的其他值,在ament中,不同工作區的前綴會放到不同的環境變量中。

  3. catkin_simple 
    catkin_simple是一個用於改善用戶catkin體驗的工具包,可以減少復雜的CMake代碼,但是會存在不穩定的情況。ament也是實現了類似的功能,但是可靠性更強。

  4. Building within a single CMake context 
    使用catkin_make命令可以一次性編譯工作空間中的所有功能包,雖然方便,但如果存在相同命名的功能包時,會編譯失敗,ament在這方面也進行了改善。

針對以上缺陷,ament都進行了優化

安裝ament 
1. 參考官方wiki 
2. 安裝好就可以編譯了

 

src/ament/ament_tools/scripts/ament.py build --build-tests --symlink-install
  1. ament編譯完成后,所有聲稱的文件都放到了ros_ws工作目錄下的install文件夾里
  2. 生成的命令在bin文件夾下,如果我們需要在終端中調用這些命令,當然還是老辦法,先設置環境變量,在運行

如何在ros2中開發自己的功能包 
創建一個工作區吧: 
mkdir -p ~/ros2_overlay_ws/srccd ~/ros2_overlay_ws/src 
放入自己的功能包,這里使用ros2的exampl代替: 
git clone https://github.com/ros2/examples.git 
我們就可以編譯這個新的工作區了(注意:之前編譯好的ament的環境變量設置,可以寫到.bashrc文件里): 
cd ~/ros2_overlay_ws 
ament build –cmake-args -DCMAKE_BUILD_TYPE=Debug 
編譯的過程和catkin差不多,編譯完成后也會在工作區產生一個install文件,里邊的目錄結構和我們之前編譯ament所生成的一樣

ROS1與ROS2之間的橋梁

ROS2雖然重新設計了架構實現,但是也考慮到了與ROS1的兼容,專門開發了一個功能包——ros1_bridge,來完成ROS2與ROS1之間的通訊。但是目前ros1_bridge這個包的功能有限,還不提供python實現,而且僅支持ros2/common_interfaces repository中列出的通訊類型,如果要支持自己定義的接口,還需要自己編譯ros1_bridge包。 
示例1:talker和listener

 

# Shell A: source /opt/ros/kinetic/setup.bash roscore # Shell B: source /opt/ros/kinetic/setup.bash source ~/ros2_ws/install/setup.bash export ROS_MASTER_URI=http://localhost:11311 ros2 run ros1_bridge dynamic_bridge # Shell C: source /opt/ros/kinetic/setup.bash rosrun rospy_tutorials talker # Shell D: source ~/ros2_ws/install/setup.bash ros2 run demo_nodes_cpp listener


 

該屏幕截圖顯示了所有的shell窗口及其預期內容: 
這里寫圖片描述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM