以下文章來源于分子運動 ,作者王方浩
分子運動.
自動駕駛、AI知識分享
下面是由社群開發者—王方浩提供的文章,本文主要介紹Cyber架構。
ENJOY THE FOLLOWING
本文将主要從以下幾個方面來介紹:
-
資料處理流程
-
整體介紹
- 總結
Cyber中整個的資料處理流程,通過了解資料流程中各個子產品如何工作,清楚地了解每個子產品的作用,然後分析具體的子產品。
如上圖所示,Cyber的資料流程可以分為6個過程:
1、Node節點中的Writer往通道裡面寫資料;
2、通道中的Transmitter釋出消息,通道中的Receiver訂閱消息;
3、Receiver接收到消息之後,觸發回調,觸發DataDispather進行消息分發;
4、DataDispather接收到消息後,把消息放入CacheBuffer,并且觸發Notifier,通知對應的DataVisitor處理消息;
5、DataVisitor把資料從CacheBuffer中讀出,并且進行融合,然後通過notifier_喚醒對應的協程;
6、協程執行對應的注冊回調函數,進行資料處理,處理完成之後接着進入睡眠狀态。
對資料流程有整體的認識之後,接下來按照功能劃分分析具體的每個子產品。
首先對Cyber中各個子產品做一個簡單的介紹,然後再接着分析。隻要清楚了下面這些概念之間的關系,就基本了解清楚了整個Cyber的資料流程。
- Component和Node的關系
Component是Cyber中封裝好的資料處理流程,對使用者來說,對應自動駕駛中的Planning Component、Perception Component等,目的是幫助使用者更友善的訂閱和處理消息。實際上Component子產品在加載之後會執行"Initialize()"函數,這是個隐藏的初始化過程,對使用者不可見。在"Initialize"中,Component會建立一個Node節點,概念上對應ROS的節點,每個Component子產品隻能有一個Node節點,也就是說每個Component子產品有且隻能有一個節點,在Node節點中進行消息訂閱和釋出。
- Node和Reader\Writer的關系
在Node節點中可以建立Reader訂閱消息,也可以建立Writer釋出消息,每個Node節點中可以建立多個Reader和Writer。
- Reader和Receiver,Writer和Transmitter,Channel的關系
一個Channel對應一個Topic,概念上對應ROS的消息通道,每個Topic都是唯一的。而Channel中包括一個發送器(Transmitter)和接收器(Receiver),通過Receiver接收消息,通過Transmitter發送消息。
一個Reader隻能訂閱一個通道的消息,如果一個Node需要訂閱多個通道的消息,需要建立多個Reader。同理一個Writer也隻能釋出一個通道的消息,如果需要釋出多個消息,需要建立多個Writer。
Reader中調用Receiver訂閱消息,而Writer通過Transmitter釋出消息。
- Receiver, DataDispatcher和DataVisitor的關系
每一個Receiver接收到消息之後,都會觸發回調,回調中觸發DataDispather(消息分發器)釋出消息,DataDispather是一個單例,所有的資料分發都在資料分發器中進行,DataDispather會把資料放到對應的緩存中,然後Notify(通知)對應的協程(實際上這裡調用的是DataVisitor中注冊的Notify)去處理消息。
DataVisitor(消息通路器)是一個輔助的類,一個資料處理過程對應一個DataVisitor,通過在DataVisitor中注冊Notify(喚醒對應的協程,協程執行綁定的回調函數),并且注冊對應的Buffer到DataDispather,這樣在DataDispather的時候會通知對應的DataVisitor去喚醒對應的協程。
也就是說DataDispather(消息分發器)釋出對應的消息到DataVisitor,DataVisitor(消息通路器)喚醒對應的協程,協程中執行綁定的資料處理回調函數。
- DataVisitor和Croutine的關系
實際上DataVisitor中的Notify是通過喚醒協程(為了友善了解也可以了解為線程,可以了解為你有一個線程池,通過線程池綁定資料處理函數,資料到來之後就喚醒對應的線程去執行任務),每個協程綁定了一個資料處理函數和一個DataVisitor,資料到達之後,通過DataVisitor中的Notify喚醒對應的協程,執行資料處理回調,執行完成之後協程進入休眠狀态。
- Scheduler, Task和Croutine
通過上述分析,資料處理的過程實際上就是通過協程完成的,每一個協程被稱為一個Task,所有的Task(任務)都由Scheduler進行排程。從中可以分析得出實際上Cyber的實時排程由協程去保障,并且可以靈活的通過協程去設定對應的排程政策,當然協程依賴于程序,Apollo在Linux中設定程序的優先級為實時輪轉,先保障程序的優先級最高,然後内部再通過協程實作對應的排程政策。
協程和線程的優缺點這裡就不展開了,這裡有一個疑問是協程不能被終止,除非協程主動退出,這裡先留一個伏筆,後面再分析協程的排程問題。
上述就是Cyber中各個概念之間的關系,對了解資料的流程非常有幫助,希望大家可以畫一下對應的資料流程圖和關系。
* 《 Apollo介紹之Cyber架構》
https://zhuanlan.zhihu.com/p/115046708