您當前的位置:首頁 > 農業

apollo介紹之Cyber框架(十一)

作者:由 王方浩 發表于 農業時間:2020-03-21

寫在之前,之前的分析都是一些原始碼級別的分析,發現一開始就深入原始碼,很容易陷進去,特別是模組非常多的情況,需要看很多遍才能理解清楚。

要寫出更容易理解的文件,需要的不是事無鉅細的分析程式碼,更主要的是能夠把複雜的東西抽象出來,變為簡單的東西。一個很簡答的例子是畫函式呼叫流程圖很簡單,但是要把流程圖轉換成框圖卻很難。

資料處理流程

我們先看下cyber中整個的資料處理流程,透過理解資料流程中各個模組如何工作,來搞清楚每個模組的作用,然後我們再接著分析具體的模組。

apollo介紹之Cyber框架(十一)

如上圖所示,

cyber的資料流程可以分為6個過程

Node節點中的Writer往通道里面寫資料。

通道中的Transmitter釋出訊息,通道中的Receiver訂閱訊息。

Receiver接收到訊息之後,觸發回撥,觸發DataDispather進行訊息分發。

DataDispather接收到訊息後,把訊息放入CacheBuffer,並且觸發Notifier,通知對應的DataVisitor處理訊息。

DataVisitor把資料從CacheBuffer中讀出,並且進行融合,然後透過notifier_喚醒對應的協程。

協程執行對應的註冊回撥函式,進行資料處理,處理完成之後接著進入睡眠狀態。

對資料流程有整體的認識之後,下面我們在分析具體的每個模組,我們還是按照功能劃分。

整體介紹

首先我們對cyber中各個模組做一個簡單的介紹,之後再接著分析。實際上我們只要搞清楚了下面一些概念之間的關係,就基本上理解清楚了整個Cyber的資料流程。

1.Component和Node的關係

Component是cyber中封裝好的資料處理流程,對使用者來說,對應自動駕駛中的Planning Component, Perception Component等,目的是幫助我們更方便的訂閱和處理訊息。實際上

Component模組在載入之後會執行"Initialize()"函式

,這是個隱藏的初始化過程,對使用者不可見。在“Initialize”中,Component會建立一個Node節點,概念上對應ROS的節點,

每個Component模組只能有一個Node節點

,也就是說每個Component模組有且只能有一個節點,在Node節點中進行訊息訂閱和釋出。

2.Node和Reader\Writer的關係

在Node節點中可以建立Reader訂閱訊息,也可以建立Writer釋出訊息,每個Node節點中可以建立多個Reader和Writer。

3.Reader和Receiver,Writer和Transmitter,Channel的關係

一個Channel對應一個Topic,概念上對應ROS的訊息通道,每個Topic都是唯一的。而Channel中包括一個傳送器(Transmitter)和接收器(Receiver),透過Receiver接收訊息,透過Transmitter傳送訊息。

一個Reader只能訂閱一個通道的訊息,如果一個Node需要訂閱多個通道的訊息,需要建立多個Reader。同理一個Writer也只能釋出一個通道的訊息,如果需要釋出多個訊息,需要建立多個Writer。

Reader中呼叫Receiver訂閱訊息,而Writer透過Transmitter釋出訊息。

4.Receiver, DataDispatcher和DataVisitor的關係

每一個Receiver接收到訊息之後,都會觸發回撥,回撥中觸發DataDispather(訊息分發器)釋出訊息,DataDispather是一個單例,所有的資料分發都在資料分發器中進行,DataDispather會把資料放到對應的快取中,然後Notify(通知)對應的協程(實際上這裡呼叫的是DataVisitor中註冊的Notify)去處理訊息。

DataVisitor(訊息訪問器)是一個輔助的類,

一個數據處理過程對應一個DataVisitor,透過在DataVisitor中註冊Notify(喚醒對應的協程,協程執行繫結的回撥函式),並且註冊對應的Buffer到DataDispather

,這樣在DataDispather的時候會通知對應的DataVisitor去喚醒對應的協程。

也就是說DataDispather(訊息分發器)釋出對應的訊息到DataVisitor,DataVisitor(訊息訪問器)喚醒對應的協程,協程中執行繫結的資料處理回撥函式。

5.DataVisitor和Croutine的關係

實際上DataVisitor中的Notify是透過喚醒協程(為了方便理解也可以理解為執行緒,可以理解為你有一個執行緒池,透過執行緒池繫結資料處理函式,資料到來之後就喚醒對應的執行緒去執行任務),每個協程綁定了一個數據處理函式和一個DataVisitor,資料到達之後,透過DataVisitor中的Notify喚醒對應的協程,執行資料處理回撥,執行完成之後協程進入休眠狀態。

6.Scheduler, Task和Croutine

透過上述分析,

資料處理的過程實際上就是透過協程完成的,每一個協程被稱為一個Task,所有的Task(任務)都由Scheduler進行排程

。從這裡我們可以分析得出實際上Cyber的實時排程由協程去保障,並且可以靈活的透過協程去設定對應的排程策略,當然協程依賴於程序,Apollo在linux中設定程序的優先順序為實時輪轉,先保障程序的優先順序最高,然後內部再透過協程實現對應的排程策略。

協程和執行緒的優缺點這裡就不展開了,這裡有一個疑問是協程不能被終止,除非協程主動退出,這裡先留一個伏筆,後面我們再分析協程的排程問題。

總結

上述就是各個概念之間的關係,上述介紹對理解資料的流程非常有幫助,希望有時間的時候,大家可以畫一下對應的資料流程圖和關係。

往期回顧

apollo介紹(一)

apollo介紹之map模組(二)

apollo介紹之localization模組(三)

apollo介紹之planning模組(四)

apollo介紹之Routing模組(六)

apollo介紹之Transform模組(七)

apollo介紹之Canbus模組(八)

apollo介紹之Control模組(九)

apollo介紹之Perception模組(十七)

apollo介紹之Audio模組(十八)

apollo預測模組分享(二十一)

Cyber框架

apollo介紹之cyber設計(五)

apollo介紹之Cyber框架(十)

apollo介紹之Cyber框架(十一)

apollo介紹之Cyber定時器(十二)

apollo介紹之Cyber Component(十三)

apollo介紹之Cyber Data(十四)

apollo介紹之Cyber Scheduler排程(十五)

apollo介紹之Cyber Async非同步呼叫(十六)

apollo介紹之cyber啟動(十九)

高精度地圖

apollo介紹之map模組(二)

高精度地圖製作

高精度地圖製作(二)

高精度地圖製作(三)

apollo簡易製圖過程(二十)

apollo高精度地圖視覺化(二十二)

apollo高精度地圖製作(二十三)

apollo高精度地圖標註(二十四)

如果覺得本文對你有幫助,歡迎點贊、分享、關注3連 O(∩_∩)O~~

標簽: Apollo  協程  模組  DataVisitor  對應