百度 Apollo 8.0 CyberRT 源代碼分析(三)

3 cyber的topology管理(node、channelD等)

fastrtps是一個(gè)開源網(wǎng)絡(luò)庫(kù)。cyber基于fastrtps在進(jìn)程之間交換節(jié)點(diǎn)/channel信息。這些進(jìn)程可以在同一個(gè)主機(jī)上,也可以跨主機(jī)。

Manager及相關(guān)類封裝fastrtps對(duì)象。NodeManager和ChannelManager派生自Manager,前者實(shí)現(xiàn)node加入、離開等信息的交換,后者實(shí)現(xiàn)channel加入、離開等信息的交換。

Reader/Writer基于ChannelManager管理channel信息;Node/NodeChannelImpl基于NodeChannelManager管理節(jié)點(diǎn)信息,它也負(fù)責(zé)創(chuàng)建Reader/Writer。

3.1 Participant

cyber基于fastrtps庫(kù)實(shí)現(xiàn)topoloy發(fā)現(xiàn)功能。Participant類封裝fastrtps接口。

  • 成員fastrtps_partipant_ 保存partipant實(shí)例,這個(gè)participant實(shí)例是fastrtps的通信節(jié)點(diǎn)。成員name_ 是participant的名字。
  • fastrtps基于udp協(xié)議,成員send_port_ 保存fastrtps發(fā)送端口。
  • 成員listener_ 掛接在fastrtps_participant_上監(jiān)聽fastrtps消息,如其他pariticipant的上線、下線通知等。
  • 成員函數(shù)CreateFastRtpsParticipant()創(chuàng)建fastrtps_participant_和listenser_,它們分別是fastrtps::Participant和fastrtps::ParticipantListener的實(shí)例。這兩個(gè)類是fastrtps庫(kù)定義的。
  • ParticipantListener監(jiān)聽fastrtps的Participant change事件。當(dāng)Particant加入或離開時(shí),它的虛擬成員函數(shù)OnPartipantDiscovery()被調(diào)用。

3.2 TopologyManager

TopologyManager管理cyber各種對(duì)象的topology,包括Node、Channel等等。

  • 成員participant_ 是Participant實(shí)例。成員listener_是ParticipantListener實(shí)例,被打包到participant_。成員函數(shù)CreateParticipant()創(chuàng)建participant_,參數(shù)包括listener_用于接收消息。
  • 當(dāng)Paricipant Change事件發(fā)生時(shí),ParticipantListener的成員callback_被調(diào)用。這里的callback_是TopologyManager::OnParticipantChange()。
    • OnParticipantChange()接收的消息包括ParticipantDiscoveryInfo信息。TopoloyManager將它轉(zhuǎn)換成ChangeMsg。這個(gè)消息通知給成員change_signal_,它是Signal<ChangeMsg>實(shí)例,用于通知其他成員,如node_manager_等。
    • OnParticipantChange()將其他participant的名字保存在成員participant_names_中。

3.3 Manager

Manager基于Participant管理topology消息的收發(fā)。它的派生類包括NodeManager、ChannelManager等,分別管理Node、Channel等加入/離開消息的收發(fā)。

  • 成員hostname_是主機(jī)名,process_id_是進(jìn)程id。

  • 成員是allowed_role_和change_type_分別保存當(dāng)前Manager實(shí)例的角色和消息類型,比如NodeManager和ChannelManager分別有自己的類型。

  • 成員publisher_ 是fastrtps::Publisher實(shí)例,subscriber_是fastrtps::Subscriber實(shí)例。這兩個(gè)是fastrtps定義的類型。

  • 成員listener_是SubscriberListener類型。它派生自fastrtps定義的類型fastrtps::SubscriberListener,用于從fastrtps接收消息。

  • 消息到來時(shí),調(diào)用虛擬成員函數(shù)SubscrierListener::onNewDataMessage()。這個(gè)函數(shù)調(diào)用成員callback_。在SubcriberListener的構(gòu)造函數(shù)中,它已經(jīng)指定為Manager::OnRemoteChange()。

  • 在OnRemoteChange()中,調(diào)用Manager的虛擬成員函數(shù)Dispose()。Manager的派生類可以按照自己的方式處理消息,比如處理其他節(jié)點(diǎn)的join/leave消息。

  • 成員函數(shù)Join()加入指定的role圈子。其中,

    • 根據(jù)指定的role類型、屬性構(gòu)造ChangeMsg實(shí)例;
    • 調(diào)用Dispose()通知自己;
    • 調(diào)用Publish()通過fastrtps發(fā)布消息。
  • 成員函數(shù)Leave()退出指定的圈子。

  • 成員singal_是一個(gè)Signal實(shí)例,Notify()通過發(fā)送通知。AddChangeListner()將指定的回調(diào)函數(shù)接收這個(gè)通知,RemoveChangeListener()將指定的回調(diào)函數(shù)移出通知。

3.4 NodeManager

這里以NodeManager為例說明Manager的派生類實(shí)現(xiàn)。

  • 成員nodes_保存從fastrtps消息創(chuàng)建的其他節(jié)點(diǎn)。這是一個(gè)NodeWareHouse實(shí)例。
  • 在成員函數(shù)Dispose()中,根據(jù)收到消息類型是加入或離開,分別調(diào)用DisposeJoin()/DisposeLeave(),然后調(diào)用Notify()通知監(jiān)聽者。
  • 在DisposeJoin()中,創(chuàng)建節(jié)點(diǎn)實(shí)例加入nodes_;在DisposeLeave()中,從成員nodes_中移除節(jié)點(diǎn)實(shí)例。

3.5 ChannelManager

ChannelManager是另一個(gè)Manager派生類的例子。

  • 成員node_writers_是WriterWarehouse實(shí)例,保存從node到RoleWriter的多值映射;成員node_readers_則是從node到RoleReader的多值映射。
  • 成員channel_writers_是從channel到RoleWriter的多值映射,成員channel_readers_是從channel到RoleReader的多值映射。
  • RoleReader和RoleWriter是RoleBase的派生類,這里的WriterWarehouse/ReaderWarehouse保存RoleBase實(shí)例。

3.6 再說TopologyManager

再次回到TopologyManager。它基于Participant,創(chuàng)建NodeManager/ChannelManager實(shí)例。

  • 成員participant_是Participant實(shí)例,listener_是ParticipantListener實(shí)例。成員node_manager_是NodeManager實(shí)例,channel_manager_是ChannelManager實(shí)例。
  • 在TopologyManager的構(gòu)造函數(shù)中,
    • 創(chuàng)建node_manager_/channel_manager_;
    • 調(diào)用CreateParticipant()創(chuàng)建participant_listener_,綁定成員函數(shù)OnParticipantChange()處理Participant Change消息;創(chuàng)建participant_。
  • 調(diào)用功能InitNodeManager()/InitChannelManager(),啟動(dòng)node_manger_/channel_manager_的發(fā)現(xiàn)機(jī)制,也就是participant的收發(fā)功能。
  • 在OnParticipantChange()中,調(diào)用成員change_signal_通知其中注冊(cè)的回調(diào)函數(shù)。

3.7 Reader

關(guān)于Reader,(這里的讀取數(shù)據(jù)部分,后面會(huì)再詳細(xì)說明)

  • 成員reader_func_ 是消息到達(dá)時(shí)的回調(diào)函數(shù),由使用者指定。
  • 成員receiver_ 是Receiver實(shí)例,負(fù)責(zé)接收數(shù)據(jù)。接收到消息時(shí),它會(huì)調(diào)用reader_func_。
  • 成員croutine_name_ 是使用的協(xié)程名。receiver_拿到消息,調(diào)用reader_func_,是這個(gè)協(xié)程執(zhí)行的。
  • 成員blocker_ 是Blocker實(shí)例。從receiver_得到的消息,也會(huì)推送一份保存在這里。
  • 成員channel_manager_ 是全局唯一的ChannelManager實(shí)例,負(fù)責(zé)通知Reader的加入/離開。

3.8 Writer

關(guān)于Writer,(這里的寫數(shù)據(jù)部分,后面會(huì)再詳細(xì)說明)

  • 成員transmitter_ 是Transmitter實(shí)例,負(fù)責(zé)發(fā)送數(shù)據(jù)。
  • 成員channel_manager_ 是全局唯一的ChannelManager實(shí)例,負(fù)責(zé)通知Writer的加入/離開。

3.9 Node

Node定義cyber的節(jié)點(diǎn)。

  • 成員readers_保存所有reader,這是一個(gè)topic name -> Reader實(shí)例的map
  • 成員writers_保存所有writer,這是一個(gè)topic name -> Writer實(shí)例的map
    • 成員node_channel_impl_是一個(gè)NodeChannelImpl實(shí)例,Node委托它處理各種任務(wù),如創(chuàng)建Reader/Writer實(shí)例。

關(guān)于NodeChannelImpl,

  • 成員node_manager_ 是NodeManager實(shí)例,它在NodeChannelImpl的構(gòu)造函數(shù)中,從TopologyManager得到。
  • 成員函數(shù)CreateReader()創(chuàng)建Reader實(shí)例。它有兩個(gè)參數(shù),RoleAttribute指定Reader屬性,CbFunc指定接收消息的回調(diào)函數(shù)。
  • 成員函數(shù)CreateWriter()創(chuàng)建Writer實(shí)例。

相關(guān)鏈接

百度 Apollo 8.0 Cyber 源代碼分析(一)
百度 Apollo 8.0 Cyber 源代碼分析(二)
百度 Apollo 8.0 Cyber 源代碼分析(三)
百度 Apollo 8.0 Cyber 源代碼分析(四)
百度 Apollo 8.0 Cyber 源代碼分析(五)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,640評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容