代码位置
apollo/cyber/component
功能
在自动驾驶系统中,模块(如感知、定位、控制系统等)在 Cyber RT 下以 Component 的形式存在。不同 Component 之间通过 Channel 进行通信。Component 概念不仅解耦了模块,还为将模块拆分为多个子模块提供了灵活性。
Component类是各个组件的基类实现,组件类似与ros里的node,每个算法模块都可以自己实现为一个Component的基类,从而加入到CyberRT的框架中。
实际上Component分为2类:
- 一类是消息驱动的Component,
- 第二类是定时调用的TimerComponent。
定时调度模块没有绑定消息收发,需要用户自己创建reader来读取消息,如果需要读取多个消息,可以创建多个reader。
使用示例
使用可以参考cyber的示例程序:cyber/examples/common_component_example/
也可以看具体某个模块,比如感知模块的激光障碍物检查的component
可以看到对外的接口只有 Init() 和 Proc() 用于初始化组件以及执行组件的核心功能。
使用源码中的一句话:
The Init & Proc functions need to be overloaded, but don’t want to be called. They are called by the CyberRT Frame.
代码结构
代码事实上并不多
源码分析
类图关系
ComponentBase
- Component类和TimerComponent类的基类
- 非模板类,无需模板参数
- 定义了接口函数和几个基础功能函数(比如LoadConfigFiles)
Component
继承ComponentBase,有四个模板参数, 每个模板参数表示一个消息,即一个component最多可以处理 4 个消息信道,
这些信道,即 Reader 对象,最后都会被放入到 ComponentBase::readers_ 变量中