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

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

fastrtps是一个开源网络库。cyber基于fastrtps在进程之间交换节点/channel信息。这些进程可以在同一个主机上,也可以跨主机。

Manager及相关类封装fastrtps对象。NodeManager和ChannelManager派生自Manager,前者实现node加入、离开等信息的交换,后者实现channel加入、离开等信息的交换。

Reader/Writer基于ChannelManager管理channel信息;Node/NodeChannelImpl基于NodeChannelManager管理节点信息,它也负责创建Reader/Writer。

3.1 Participant

cyber基于fastrtps库实现topoloy发现功能。Participant类封装fastrtps接口。

  • 成员fastrtps_partipant_ 保存partipant实例,这个participant实例是fastrtps的通信节点。成员name_ 是participant的名字。
  • fastrtps基于udp协议,成员send_port_ 保存fastrtps发送端口。
  • 成员listener_ 挂接在fastrtps_participant_上监听fastrtps消息,如其他pariticipant的上线、下线通知等。
  • 成员函数CreateFastRtpsParticipant()创建fastrtps_participant_和listenser_,它们分别是fastrtps::Participant和fastrtps::ParticipantListener的实例。这两个类是fastrtps库定义的。
  • ParticipantListener监听fastrtps的Participant change事件。当Particant加入或离开时,它的虚拟成员函数OnPartipantDiscovery()被调用。

3.2 TopologyManager

TopologyManager管理cyber各种对象的topology,包括Node、Channel等等。

  • 成员participant_ 是Participant实例。成员listener_是ParticipantListener实例,被打包到participant_。成员函数CreateParticipant()创建participant_,参数包括listener_用于接收消息。
  • 当Paricipant Change事件发生时,ParticipantListener的成员callback_被调用。这里的callback_是TopologyManager::OnParticipantChange()。
    • OnParticipantChange()接收的消息包括ParticipantDiscoveryInfo信息。TopoloyManager将它转换成ChangeMsg。这个消息通知给成员change_signal_,它是Signal<ChangeMsg>实例,用于通知其他成员,如node_manager_等。
    • OnParticipantChange()将其他participant的名字保存在成员participant_names_中。

3.3 Manager

Manager基于Participant管理topology消息的收发。它的派生类包括NodeManager、ChannelManager等,分别管理Node、Channel等加入/离开消息的收发。

  • 成员hostname_是主机名,process_id_是进程id。

  • 成员是allowed_role_和change_type_分别保存当前Manager实例的角色和消息类型,比如NodeManager和ChannelManager分别有自己的类型。

  • 成员publisher_ 是fastrtps::Publisher实例,subscriber_是fastrtps::Subscriber实例。这两个是fastrtps定义的类型。

  • 成员listener_是SubscriberListener类型。它派生自fastrtps定义的类型fastrtps::SubscriberListener,用于从fastrtps接收消息。

  • 消息到来时,调用虚拟成员函数SubscrierListener::onNewDataMessage()。这个函数调用成员callback_。在SubcriberListener的构造函数中,它已经指定为Manager::OnRemoteChange()。

  • 在OnRemoteChange()中,调用Manager的虚拟成员函数Dispose()。Manager的派生类可以按照自己的方式处理消息,比如处理其他节点的join/leave消息。

  • 成员函数Join()加入指定的role圈子。其中,

    • 根据指定的role类型、属性构造ChangeMsg实例;
    • 调用Dispose()通知自己;
    • 调用Publish()通过fastrtps发布消息。
  • 成员函数Leave()退出指定的圈子。

  • 成员singal_是一个Signal实例,Notify()通过发送通知。AddChangeListner()将指定的回调函数接收这个通知,RemoveChangeListener()将指定的回调函数移出通知。

3.4 NodeManager

这里以NodeManager为例说明Manager的派生类实现。

  • 成员nodes_保存从fastrtps消息创建的其他节点。这是一个NodeWareHouse实例。
  • 在成员函数Dispose()中,根据收到消息类型是加入或离开,分别调用DisposeJoin()/DisposeLeave(),然后调用Notify()通知监听者。
  • 在DisposeJoin()中,创建节点实例加入nodes_;在DisposeLeave()中,从成员nodes_中移除节点实例。

3.5 ChannelManager

ChannelManager是另一个Manager派生类的例子。

  • 成员node_writers_是WriterWarehouse实例,保存从node到RoleWriter的多值映射;成员node_readers_则是从node到RoleReader的多值映射。
  • 成员channel_writers_是从channel到RoleWriter的多值映射,成员channel_readers_是从channel到RoleReader的多值映射。
  • RoleReader和RoleWriter是RoleBase的派生类,这里的WriterWarehouse/ReaderWarehouse保存RoleBase实例。

3.6 再说TopologyManager

再次回到TopologyManager。它基于Participant,创建NodeManager/ChannelManager实例。

  • 成员participant_是Participant实例,listener_是ParticipantListener实例。成员node_manager_是NodeManager实例,channel_manager_是ChannelManager实例。
  • 在TopologyManager的构造函数中,
    • 创建node_manager_/channel_manager_;
    • 调用CreateParticipant()创建participant_listener_,绑定成员函数OnParticipantChange()处理Participant Change消息;创建participant_。
  • 调用功能InitNodeManager()/InitChannelManager(),启动node_manger_/channel_manager_的发现机制,也就是participant的收发功能。
  • 在OnParticipantChange()中,调用成员change_signal_通知其中注册的回调函数。

3.7 Reader

关于Reader,(这里的读取数据部分,后面会再详细说明)

  • 成员reader_func_ 是消息到达时的回调函数,由使用者指定。
  • 成员receiver_ 是Receiver实例,负责接收数据。接收到消息时,它会调用reader_func_。
  • 成员croutine_name_ 是使用的协程名。receiver_拿到消息,调用reader_func_,是这个协程执行的。
  • 成员blocker_ 是Blocker实例。从receiver_得到的消息,也会推送一份保存在这里。
  • 成员channel_manager_ 是全局唯一的ChannelManager实例,负责通知Reader的加入/离开。

3.8 Writer

关于Writer,(这里的写数据部分,后面会再详细说明)

  • 成员transmitter_ 是Transmitter实例,负责发送数据。
  • 成员channel_manager_ 是全局唯一的ChannelManager实例,负责通知Writer的加入/离开。

3.9 Node

Node定义cyber的节点。

  • 成员readers_保存所有reader,这是一个topic name -> Reader实例的map
  • 成员writers_保存所有writer,这是一个topic name -> Writer实例的map
    • 成员node_channel_impl_是一个NodeChannelImpl实例,Node委托它处理各种任务,如创建Reader/Writer实例。

关于NodeChannelImpl,

  • 成员node_manager_ 是NodeManager实例,它在NodeChannelImpl的构造函数中,从TopologyManager得到。
  • 成员函数CreateReader()创建Reader实例。它有两个参数,RoleAttribute指定Reader属性,CbFunc指定接收消息的回调函数。
  • 成员函数CreateWriter()创建Writer实例。

相关链接

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容