百度 Apollo 8.0 Cyber 源代码分析(四)

2024-11-25  本文已影响0人  RonZheng2010

4 cyber Reader接收数据

cyber收发数据有几种类型:进程内,进程间,跨主机。进程间的收发基于共享内存,跨主机的收发基于fastrtps网路库。这里以进程间的场景为例说明。

ShmReceiver基于共享内存实现Reciever接口,它委托ShmDispatcher从共享内存读取数据。

DataDispatcher/DataVisitor及相关类,实现一写多读的生产/消费模式。ShmReceiver读取的数据,会复制到DataDispatcher的环形缓存,这个缓存由DataVisitor提供。(ReceiverManager负责将DataDispatcher连接到receiver)。

每个Reader实例创建一个DataVisitor实例,并向DataDispatcher注册它。DataVisitor的环形缓存是在构造函数创建的。

Reader通过指定的回调函数接收消息。Reader通过RoutineFactory创建了一个协程,从DataVisitor读取消息,然后调用这个回调函数。这样Reader就收到消息了。

4.1 ConditionNotifier与MulticastNotifier

NotifierBase用于一组数据的生产/消费通知,这里一个数据单元称作block。也
就是,当写入一个block完成时,writer会通知一个或一组reader。

作为NotfiBase的派生类,ConditionNotifier和MutlicastNotifier的区别是,前者通知一个消费者,后者通知所有消费者。

ConditionNotifier基于共享内存实现。

MulticastNotifier基于udp组播实现。
+notifier_fd_是socket fd,使用组播地址239.255.0.100/8888。

4.2 Segment

基于共享内存的通信使用Segment传输数据,每个channel一个Segment实例。

XsiSegment和PosixSegment的区别是创建共享内存块managed_shm_ 的方式不同。

SegmentFactory根据配置文件的选项创建XsiSegment/PosixSegment实例。

4.3 Dispatcher / ListenserHandler

ListenerHandlerBase定义了消息通知接口,ListenerHandler基于Signal实现这个接口。

Dispatcher从传输层接收消息,并向上层派发。

4.4 ShmDispatcher

ShmDispatcher基于共享内存实现Dispatcher接口。

4.5 Receiver

Receiver负责接收消息。

4.6 ShmReceiver

ShmReceiver基于共享内存实现Receiver接口,它将主要工作委托给ShmDispatcher。

4.7 HybridReceiver

HybridReceiver是混合型Receiver实例,它实际上是将工作委托给自己的成员去处理,这些成员其他基本类型的Receiver,如ShmReceiver。

4.8 Transport

Transport负责根据指定的Mode创建Receiver/Transmiter实例。

4.9 cyber如何使用DataVisitor向多个Reader推送消息

DataVisitor在cyber中的使用场景如下:

4.10 ReceiverManager

ReceieverManager基于Transport创建Receiver实例。这里定义了一个函数绑定到Receiver实例上。当消息到达时,调用DataDispatcher::Dispatch()推送它,保存到DataVisitor实例中。

5 cyber Writer发送数据

cyber收发数据有几种类型:进程内,进程间,跨主机。进程间的收发基于共享内存,跨主机的收发基于fastrtps网路库。这里以进程间的场景为例说明。

5.1 Transmitter

Transmitter负责发送消息。

5.2 ShmTrasmitter

ShmTransmitter基于共享内存实现Transmitter接口。

5.3 HybridTransmitter

HybridTransmitter是混合型Transmitter实例,它实际上是将工作委托给自己的成员去处理,这些成员其他基本类型的Transmitter,如ShmTransmitter。

6 cyber 跨主机收发数据的场景

前面以进程间的场景说明了cyber如何收发数据,这里说明跨主机收发数据的场景。

RtpsDispatcher派生自Dispatcher,负责从fastrtps接收指定channel的消息,然后派发给上层的DataDispatcher/DataVisitor实例,进而被Reader接收。

RtpsTransmitter派生自Transmitter,负责通过fastrtps发送指定channel的消息。消息发送之前,会先序列化成字符串。

7 cyber 收发消息的底层消息

进程间通信时,ShmTransmitter/ShmDispatcher传输的消息单元是ReadableBlock/WritableBlock;跨主机通信时,RtpsTranmistter/RtpsDispatcher传输的消息单元是UnderlayMessage。

MessageInfo中保存发送端的Id,消息序列号等。传输时需要它来标记消息。

8 cyber跨主机收发数据的qos

cyber可以在配置文件cyber/conf/cyber.conf中,给跨主机通信设置质量保证选项

这些选项读入后保存在RoleAttributes的成员qos_profle中,这是一个QosProfile实例。

当创建fastrtps_Subscriber/fastrtps_Publisher时,这些选项会作为创建的参数传入。

相关链接

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

上一篇 下一篇

猜你喜欢

热点阅读