CyberRT概览
本文最后更新于:1 小时前
总体软件架构
CyberRT 是 Apollo 自动驾驶平台的核心通信和调度框架,是一个消息驱动的组件化框架,类似 ROS 但针对自动驾驶场景进行了高性能、低延迟的优化

数据传输

在一个分布式计算系统中,根据两个节点间的位置关系需要使用不同的传输方式:
INTRA:如果是同进程的,因为在同一地址空间,直接传指针就可以
SHM(Shared memory):如果是同一机器上,但跨进程的,为了高效可以使用共享内存
RTPS:如果是跨设备的,那就老老实实通过网络传吧
HYBRID: 框架需要根据节点间关系选择合适的传输后端(混合异步订阅和同步请求)
源码层级


可以把CyberRT拆分为两个核心部分:
分布式通信:负责数据流的高效传递
协程计算框架:负责计算任务的高效执行
通信架构部分

- 序列化模块:序列化模块负责将用户自定义的数据结构转换为可传输的二进制格式,并支持反向解析。本模块采用嵌入式序列化方案,用户仅需定义C++数据结构体并通过标准化宏调用即可完成序列化操作。该方案支持C++基本数据类型(如int、float)以及STL容器(如vector、map)
- 发布订阅系统:发布-订阅系统是本设计中分布式通信中间件的核心模块之一,负责实现节点间高效、解耦的通信。该系统采用基于消息驱动的架构,由发布者、订阅者和消息代理三个部分组成。发布者负责发布特定主题(Channel)的消息,订阅者则订阅感兴趣的主题,消息代理充当中枢,接收并转发发布者的消息至对应的订阅者。在分布式系统中,节点间的通信可能涉及不同的网络环境,如同一主机内的通信与跨主机的通信。针对这一问题,当节点位于同一主机时发布订阅框架会优先选择共享内存进行通信,这样可以避免网络协议栈的开销,从而实现更低延迟的通信;而当节点位于不同主机时,框架则采用基于FastRTPS网络通信方式。在多层次的网络架构中,通信方式会根据实际情况动态选择,确保在不同环境下都能够提供高效的通信服务。
- 服务发现机制:在点对点通信中,节点需要了解目标节点的信息以建立通信连接。为解决这一问题,设计了动态拓扑发现机制,节点间的连接信息通过有向图进行维护。每当节点加入或退出通信平面时,它会广播自身的信息,其他节点根据这些信息动态更新拓扑结构
- 高性能基础库:为满足分布式通信中间件对基础功能的需求,设计了一个高性能基础库,涵盖了数据结构、线程同步机制以及设计模式等多种基础功能。该库提供了如无锁队列、无锁哈希表、线程池、目标池等关键模块
- 日志库:日志库用于记录中间件在运行过程中不同级别的日志信息,支持输出至文件和控制台。该日志库基于C++的ofstream类实现文件写入,并定义了一组宏:log_debug、log_info、log_warn、log_error、log_fatal,分别对应不同的日志级别,方便用户在代码中输出相应的日志信息,帮助调试和运行时问题定位。