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 源代碼分析(五)