天天看點

開發者說|Apollo介紹之Cyber架構

以下文章來源于分子運動 ,作者王方浩

開發者說|Apollo介紹之Cyber架構

分子運動.

自動駕駛、AI知識分享

開發者說|Apollo介紹之Cyber架構

下面是由社群開發者—王方浩提供的文章,本文主要介紹Cyber架構。

    ENJOY THE FOLLOWING  

本文将主要從以下幾個方面來介紹:

  • 資料處理流程

  • 整體介紹

  • 總結
開發者說|Apollo介紹之Cyber架構

Cyber中整個的資料處理流程,通過了解資料流程中各個子產品如何工作,清楚地了解每個子產品的作用,然後分析具體的子產品。

開發者說|Apollo介紹之Cyber架構

如上圖所示,Cyber的資料流程可以分為6個過程:

1、Node節點中的Writer往通道裡面寫資料;

2、通道中的Transmitter釋出消息,通道中的Receiver訂閱消息;

3、Receiver接收到消息之後,觸發回調,觸發DataDispather進行消息分發;

4、DataDispather接收到消息後,把消息放入CacheBuffer,并且觸發Notifier,通知對應的DataVisitor處理消息;

5、DataVisitor把資料從CacheBuffer中讀出,并且進行融合,然後通過notifier_喚醒對應的協程;

6、協程執行對應的注冊回調函數,進行資料處理,處理完成之後接着進入睡眠狀态。

對資料流程有整體的認識之後,接下來按照功能劃分分析具體的每個子產品。

開發者說|Apollo介紹之Cyber架構

首先對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中設定程序的優先級為實時輪轉,先保障程序的優先級最高,然後内部再通過協程實作對應的排程政策。

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

開發者說|Apollo介紹之Cyber架構

上述就是Cyber中各個概念之間的關系,對了解資料的流程非常有幫助,希望大家可以畫一下對應的資料流程圖和關系。

開發者說|Apollo介紹之Cyber架構

* 《 Apollo介紹之Cyber架構》

https://zhuanlan.zhihu.com/p/115046708

繼續閱讀