0。 目錄:

1。 動機

2。 ROS2的架構

3。 ROS2應用的構成

4。 ROS2的三種通訊機制

5。 ROS2的排程模型

6。 例子一

7。 例子二

8。 響應時間

9。 ROS2排程模型的缺點

10。 參考

1. 動機:為什麼選擇ROS2,而不是ROS1?

ROS代表機器人作業系統。 雖然名字中有OS(Operating System), 但是ROS 並不是真正的作業系統,因為它是安裝在Linux之上的。 我們只能說ROS 是作業系統之上的一個去操作或模擬機器人的框架或者中介軟體。

第一代ROS,ROS1作為中介軟體(middleware),連線了程式語言和作業系統。比如我們可以寫C++的程式碼,然後呼叫ROS1內建庫裡的函式,讓這些程式碼在我們的作業系統(Linux)上執行。最終去實際的控制機器人運動或者進行模擬。

但是ROS1也有一些缺點,這些缺點促使了ROS2的誕生:

ROS1只支援在Linux上執行。

ROS1不支援多機器人協同。比如像多機械臂協同作業,車聯網就不能用ROS1來實現。

ROS1實時能力不好。也就是說給定一個任務,不一定能在規定時間內完成它。

ROS2完全是為了解決這些問題而被設計的。ROS2可以在Windows,MacOS,Linux,RTOS這些作業系統上執行,也支援多機器人協同作業,並且考慮了實時能力。

2。 ROS2的架構

ROS2排程策略(一)

ROS2架構

如圖所示,ROS2應用可以用C++或者Python來寫。比如我用C++寫了一個ROS2應用,那麼它在執行的時候,它先呼叫ROS2中內建的RCLCPP(ROS Client Library C++)這個庫。RCLCPP這個庫是用C++寫的,基於C++的。然後RCLCPP繼續向下層呼叫RCL(ROS Client Library)這個庫。如果我們的應用是多程序,那將使用RMW(ROS Middleware)這個中介軟體,進行跨程序通訊。你可以把它看作一個介面,連線了外部的DDS和內部的RCL。DDS是一個具有實時能力的通訊標準,利用多種配置引數(QoS)來保證跨程序通訊的實時性。全世界範圍內有多個DDS廠商,至於選擇具體的哪個DDS,可由我們自己去定義。如果是同一個程序內部的通訊,則需要Intra-Process API 這個介面。最終這些都要在我們的作業系統上執行。如果我們的ROS2應用是由Python寫成的,則呼叫下層的RCLPY,然後RCLPY呼叫RCL。

3。 ROS2應用的構成

ROS2排程策略(一)

ROS2應用程式的模型

如圖所示,一個ROS2應用是由多個節點(Note)組成。 一個節點中有多個回撥函式(Callback),我們可以把每個回調當成一個小的任務。 一個或多個節點對映到作業系統中的一個程序。 ROS2內建的執行器(Executor)用於協調和排程程序中回撥。ROS2的RCL提供了 2 種執行器。 一種是單執行緒執行器,在單執行緒中執行回撥;另一種是多執行緒執行器跨多個執行緒執行回撥。 現在我們只關注單執行緒執行器。

需要注意的是:回撥和節點是在ROS2應用層面,執行器是ROS2層面,程序是在作業系統層面。

4。 ROS2的三種通訊機制

在闡述排程模型之前,我們要先知道ROS2中有三種通訊機制,分別是

Publish-Subscribe

Service-Client

,以及

Actions

ROS2排程策略(一)

1。 Publish-Subscribe 2。Service-Client 3。Actions

Publish-Subscribe:釋出者不直接傳送資料給訂閱者,而是分類為Topic。 訂閱了該Topic的訂閱者將獲得資料。

Service-Client:Client向Server傳送請求,Server執行任務,等任務完成後Server把響應返回給Client

Actions:該通訊機制基於Service-Client,只不過在任務執行過程中的產生多次反饋。

5。 ROS2的排程模型(單執行緒執行器)

單執行緒執行器(Single Thread Executor)根據回撥函式的優先順序來決定它們的執行順序。 回撥函式的優先順序取決於: 回撥的型別和註冊順序(Registration Order)。

回撥的型別(按照優先順序降序排列):

1。 定時器回撥

C^{tmr}

:由系統定時器觸發,一般是週期性觸發。一個回撥鏈由多個回撥組成。而第一個回撥通常是定時器回撥。 它在 4 種回撥型別中具有最高優先順序。

2。 訂閱型回撥

C^{sub}

:基於Publish-Subscribe這種通訊機制。優先順序排第二。

3。 服務型回撥

C^{srv}

: 基於Service-Client和Actions這兩種通訊機制中的Service。優先順序排第三。

4。 客戶型回撥

C^{clt}

:基於Service-Client和Actions這兩種通訊機制中的Client。 最低優先順序。

為什麼沒有釋出者回調?這是因為在一個回撥鏈中,第一個回撥通常是定時器回撥,它向後傳送資料,而後面的訂閱者回調同時也扮演著釋出者的角色。

為什麼優先順序如此排 ?這是因為在這三種通訊機制中,Publish-Subscribe最為常見,其次是Service-Client和Actions。

如何比較兩個回撥的優先順序?如果兩個回撥的型別不同,則比較它們的型別。如果它們的型別相同,則比較他們的註冊順序。先註冊的優先順序更高。

ROS2排程策略(一)

ROS2的排程模型

現在我們看一下ROS2的排程模型。

首先,如果Readyset 為空,那麼執行器將所有就緒(ready)的常規回撥放入Readyset。常規回撥是除了定時器回撥之外的回撥。

Readyset 更新的時間點稱為輪詢點

。兩個相鄰輪詢點之間的時間間隔稱為

處理視窗

(Processing Window)。定時器回撥不需要等待輪詢點。

圖的下半部分顯示了不同型別回撥的執行順序。我們總是首先執行 定時器回撥,然後是訂閱型回撥,然後是服務型,最後是客戶型。

如果某些回撥具有相同的型別,我們將根據它們的註冊順序執行它們。更早在執行器上註冊的回撥則具有更高的優先順序。如果回撥有多個例項,則只有第一個例項可以執行。

如果 Readyset 中所有回撥的第一個例項都執行了,也就是說ReadySet 是空集,那我們就到達下一個輪詢點,新的處理視窗將開始。

需要注意的是:

在每個處理視窗中,每個回撥只有第一個例項可以執行。

常規回撥只能在輪詢點加入到ReadySet中。

定時器回撥不受輪詢點的約束。

6。 例子一

ROS2排程策略(一)

讓我用這個圖來詳細解釋ROS2的排程模型。

T0、T1、T2是註冊順序不同的定時器回撥。H、M 和 L 是具有不同註冊順序的訂閱型回撥。 SH, SM, SL 是不同註冊順序的服務型回撥。 T0 的優先順序最高,SL 的優先順序最低。

在輪詢點PP0,單執行緒執行器得到訊息序列,並且只將每個回撥的一個例項放入就緒集中。所以第二個L、M、H、SH、SL要等待下一個輪詢點PP1。

因此,我們首先執行H。

在 a 時刻,定時器回撥 T0 和 T1觸發,並在 H 完成後執行它們。計時器回撥不需要等待輪詢點。

在 b 時刻,我們收到了新的訊息序列 {SM SM H},但我們無法將它們放入到ReadySet中。它們必須等待下一個輪詢點PP1。

所以我們執行 M 和 L。

在 c 時刻,我們得到定時器回撥 T2 和 T3,並在L完成後執行它們,然後執行SH和SL。

現在所有的第一個例項都已執行。其餘例項將在接下來的處理視窗中執行。

7。 例子二

ROS2排程策略(一)

回撥鏈

在這張圖裡我們有 2 條回撥鏈 ,C 和 C´。每一個 每個回撥都有自己的優先順序。 1為最高,7為最低。C 和 C´的第一個回撥均為定時器回撥,即週期性觸發。在一個回撥鏈中,回撥從前往後順序執行。我們可以把每個回調當成一個任務(Task)。

當且僅當同時滿足以下 2 個條件時,常規回撥的例項(Instance)才準備就緒(ready):

1。 該鏈例項中前面的回撥例項已經執行完成。

2。 同一回撥的所有較早例項都已執行完成。

現在我們看一下ROS2排程模型在回撥鏈中是如何工作的。

ROS2排程策略(一)

如圖所示,我們將鏈C例化兩次,得到鏈C的兩個例項i1和i2。 將鏈C例化,得到i3。

在這個例子中,ReadySet與以前相比略有變化,它還包含了計時器回撥。

在0時刻,i1的定時器回撥例項(圖中第一個紅色的塊)觸發,放入到ReadySet,並立即執行。

在1時刻,i2的定時器回撥例項(圖中第二個紅色的塊)觸發,放入ReadySet中,但是必須要等到i1的定時器回撥例項實行結束後才能執行。

在2時刻,第一個橙色塊ready,因為第一個紅色已經完成了,但是它不能被放入ReadySet。因為常規回道受輪詢點的約束。它必須等待時間 4 的輪詢點,才能放入到ReadySet。

在時間 4,第一個橙色塊被放入到ReadySet。

在時間 6,第一個黃色和第二個橙色準備就緒,我們將它們放入ReadySet中。我們執行第一個黃色是因為它的優先順序高於第二個橙色。

7時刻,i3的定時器回撥例項被釋放。

從時間8到10,系統資源不可用,沒有回撥例項可以執行。該項可被定義,在時間長度為X的時間段內最多隻能有時間長度為N去執行回撥。在該例子中,X=10, N=8。

在時間 10,我們執行 i3的定時器回撥例項,因為它的優先順序高於第二個橙色。

以下步驟類似。

ROS2排程策略(一)

ReadySet中的回撥例項

8。 響應時間

pw_{u}

是一個回撥鏈例項中最後一個回撥的的處理視窗。

一個鏈例項的響應時間由三部分組成:

從定時器回撥的觸發時間到

pw_{u}

的開始時間

2。 從

pw_{u}

開始時間到該鏈例項中最後一個回撥例項的開始執行時間。

3。從最後一個回撥例項的開始執行時間到它的結束時間。

ROS2排程策略(一)

比如我們分析 i2。從時刻1到時刻26是第一部分,我用藍色箭頭表示;從 26 到 30 是第二部分,用紅色箭頭表示;從30到34是第三部分,用綠色箭頭表示。

但是優先順序如何影響每個部分的時間呢?

第 1 部分與回撥的優先順序無關。 如果改變這個時間短內回撥的優先順序,只會影響這段時間內回撥例項的執行順序。 但是這段時間的長度不會改變。

第 2 部分僅取決於該鏈中最後一個回撥的優先順序。優先順序越高,最後一個回撥開始執行的時間越早,該時間段因此也越短。

第 3 部分顯然與優先順序無關。 它只取決於該鏈中最後一個回撥的執行時間。

因此,一條回撥鏈的響應時間僅取決於其最後回撥的優先順序。

理論上講,我們可以透過人為定義最後一個回撥的型別來改變其優先順序。但是註冊順序卻難以改變。

9。 ROS2排程模型的缺點

首先,優先順序反轉,因為所有常規回撥都必須等待輪詢點,並且每個處理視窗中每個回撥只有一個例項可以執行。這就導致了高優先順序的回撥例項可能比低優先順序的回撥例項之行的更晚。比如說下圖中的PP1輪詢點和PP2輪詢點附近產生了優先順序反轉。總的來說,輪詢點的存在造成了優先順序反轉。

ROS2排程策略(一)

第二,隱式優先順序。 回撥的優先順序取決於回撥型別和註冊順序。 這往往對ROS應用開發者使用者來說是不直觀的。

第三,不可搶佔。 回撥執行期間不能被更高優先順序的回撥搶佔並中斷,這也是優先順序反轉的一種情況。

因此,有必要設計新的排程模型來克服這些缺點。

10。 參考文獻

[1] Daniel Casini, Tobias Blaß, Ingo Lütkebohle, and Björn B。 Brandenburg。 ”Response-Time Analysis of ROS 2 Processing Chains Under Reservation-Based Scheduling”。 In Sophie Quinton, editor, 31st Euromicro Conference on Real-Time Systems (ECRTS 2019), volume 133 of Leibniz International Proceedings in Informatics (LIPIcs), Dagstuhl, Germany, 2019。 Schloss Dagstuhl–Leibniz-Zentrum für Informatik。

[2] Charles Randolph。 “Improving the Predictability of Event Chains in ROS2”。 TU-Delft。

[3] Yue Zhang, Zhiwei Feng et al。 “Resonse Time Analysis and Priority Assignment of Processing Chains onROS2 Executors”。 2020 IEEE Rea-Time System Symposium(RTSS)。

[4]

[5]