Cyber RT作为apollo RTOS和自动驾驶各个模块的中间通信接口
Cyber提供的功能主要包括一下方面:
消息队列
实时调度
用户接口
开发工具
Cyber RT的架构
基础库:Cyber RT为了高性能和减少依赖,实现了自己的基础库。(Lock-free的对象池,队列)
通信层:Publish/Subscribe机制,Service/Client机制(共享内存、Socket、进程内存)
数据缓存/融合层:数据缓存与融合。
计算层:计算模型,任务以及任务调度
接口: Cyber RT为开发者提供了component类,开发者的算法业务模块只需要继承该类,实现其中的proc接口即可。
Cyber RT编译:
cd apollo
bash docker/scripts/dev_start.sh
bash docker/scripts/dev_into.sh
采用apollo.sh 编译
./apollo.sh build cyber
也可以使用bazel命令直接编译
bazel build //cyber/examples/common_component_example/…
启动节点可以采用cyber_launch start “对应路径”+launch 文件:
关闭同理 cyber_launch stop “对应路径”+launch 文件。
Cyber RT 常用命令行工具
cyber_visualizer: 可视化工具,可以用来显示cyber RT的channel中的数据,一般用来作为激光点云和摄像头数据的可视化工具。
cyber_monitor: 该命令可以在terminal中实时显示cyber所有channel的信息。通道信息的默认显示为红色。但是,如果有数据流过通道,则通道的相应行显示为绿色。
cyber_node: 该命令行工具用于打印Cyber RT节点信息。
cyber_channel: 打印Cyber RT通道信息。
cyber_service: 打印cyber RT节点信息。
cyber_recorder: 数据的录制回放工具,它提供了许多有用的功能,包括记录文件、回放记录文件、分割记录文件、检查记录文件信息等。
cyber_launch: 该命令用于加载模块。
rosbag_to_record: 该命令行工具用于将ROS系统的rosbag工具记录的消息文件转换Apollo Cyber RT提供的记录文件。
cyber: 消息中间件,作为消息层的实时框架代替ros
docker: 容器相关,docker/scripts下两个常用启动docker的脚本: dev_start.sh 和dev_into.sh
docs: Apollo的文档,包括完整的英文文档和部分的中文文档
modules: Apollo各个模块的源代码,例如感知,规划,预测,控制等
third_party: 第三方的库
tools: 编译相关的配置文件
audio: 音频模块,用来检测能否激活车辆紧急状态时的警报器声音,该模块主要输出警报器的开关状态,移动状态和警报器的相对位置。
bridge: 桥接模块,该模块采用socket提供了Apollo和外界模块交互的相关支持,包括sender和receiver模块。例如通过该模块可以实现Apollo和LGSVL模拟器的连接。
calibration: 标定模块,根据不同车型的传感器方案提供包含车身、摄像头、激光雷达、GNSS、感知、雷达、初始化等参数,该文件夹只有标定好的参数,并没有标定的工具和方法。
canbus: can总线模块,该模块接受并执行控制模块发出的指令,并收集底盘的状态作为反馈。
common: 公共的模块,包含通信、配置、滤波器、记录模块、数学、log系统、车辆状态,proto, 可视化等子模块。
contrib: apollo的有益贡献,包含和lgsv相关的protobuf包的信息、tcp和Cyber交互的桥接模块、自定位系统模块(elo: 利用高精地图的自定位模块。前向的摄像头会采集车道数据以实现更精确的定位,输出的位置信息包括车辆的x y z坐标,还有就是在百度高精度地图中的ID)、和端到端(e2e: 端到端深度学习,所谓e2e指的是由传感器的输入,直接决定车的行为,例如油门,刹车,方向等。也就是机器学习的算法直接学习人类司机的驾驶行为)子模块
control: 控制模块,控制模块根据规划的轨迹和车辆的当前状态,采用不同的控制算法来生成一个舒适的驾驶体验(这里个人理解就是结合舒适性的考虑输出底盘的油门、转向角和刹车的指令等)。控制模块可以再正常模式和导航模式下工作。
data: 数据模块,包含一些数据的proto定义以及一个smart_recorder工具,smart_recorder用来减少记录数据量的大小,可以有选择的记录所需要的数据。
dreamview: 可视化模块,dreamview是一个web程序,可以用来可视化车辆的状态信息,以及各个模块的输出。
driver: 驱动模块,包含摄像头、CAN总线、GNSS、激光雷达、麦克风、smarteye(???)等模块的驱动和proto配置文件,此外还包括了一个视频(???)子模块和一个image_decompress的工具。
guardian: 系统检测保护模块
localization: 定位模块,该模块通过两种方式提供定位服务,一种是结合GPS和IMU信息的RTK(Real Time Kinematic实时运动)方法,另一种是融合GPS、IMU和激光雷达信息的多传感器融合方法。
map: 地图模块,包括高精度地图、PNC地图(Planning and Control map)、和relative map(连接HD map/感知模块和规划模块的中间层)。此外还有一些相关的proto配置文件,数据和工具等。
monitor: 监视器模块,该模块包含系统层次的软件用来检查硬件状态和监控系统的健康状态的代码。
perception: 感知模块,该模块能够仅在一个detection component中检测并分类障碍物。
planning: 轨迹规划模块,Apollo6.0采用数据驱动的方法和基于学习的模型来解决轨迹规划问题。该模块将每个驾驶用例都视为不同的驾驶场景。Apollo引入了E2E模式和混合模式两种规划模式。
prediction: 预测模块,该模块学习并预测所有感知模块所检测到的物体的行为,预测的数据输入为障碍物的基本感知信息,包括位置、朝向、速度和加速度。输出为物体的轨迹(带有概率信息)。
routing: 路由模块,该模块可以根据要求生成高等级的导航信息。该模块的输入是地图数据和路由指令(起点和终点位置),输出为路由导航信息。
storytelling: 全局的高级场景管理器,该模块用于帮助协调跨模块的操作。 为了让自动驾驶汽车在城市道路上安全运行,需要复杂的规划场景来确保安全驾驶。该模块输入为定位和高精度地图信息,输出为可以被其他模块订阅的"story"。
task_manager: 任务管理器,主要任务为似乎是routing相关(???)。
third_party_perception: 第三方感知模块,该模块用来管理第三方的传感器(例如Mobileye, Conti/Delphi雷达)来进行简单融合并得到感知的输出。主要是在apollo 2.5之前使用,据说apollo刚开始检测效果不好。
tools: 一些基于python编写并且兼容proto的模块。
transform: 坐标转换模块,类似于ros的tf2。
v2x: 车路协同。