Apollo 8.0 Monitor逻辑梳理
创始人
2025-05-28 17:38:08

前言

本文是针对Apollo 8.0中的Monitor进行阐述,旨在通过其架构和业务逻辑来掌握Monitor。

Monitor总体介绍

架构图

Apollo官网给出的模块关系图

由此可见,Monitor模块定期检测架构中被监控软、硬模块的状态信息,计算出当前系统的整体的健康状态,及时反馈给下游模块(Guardian)。

PS: 个人感觉HMI和Monitor的Data Lines应该是双向的

  • Monitor给HMI定期输出最终系统状态

  • Monitor通过HMI拿到当前的HMI状态

分类图

每一个模块都有一个单独的xxxMonitor类来监控。种类较多,文章下面逐一剖析。

类图

下图可简单表示Monitor重要类之间的关系

Monitor子模块介绍

Monitor

是整个监控的入口模块,Cyber框架的应用模块之一,最终被编译成libmonitor.so被mainboard启动。

继承了Cyber框架的定时组件,所以内部逻辑相当简单,持有若干个xxxMonitor的指针

  • Init

  • 初始化Monitor Manager、xxxMonitor实例

  • Proc

  • 串行调度各模块监控的任务,最后产出监控结果

  • 一次监控检测任务顺序

  • EsdCanMonitor-->SocketCanMonitor-->GpsMonitor-->LocalizationMonitor-->CameraMonitor-->ProcessMonitor-->ModuleMonitor-->LatencyMonitor-->ChannelMonitor-->ResourceMonitor-->SummaryMonitor-->(FunctionalSafetyMonitor)

Monitor Manager

此类被声明为单例模式,被*Monitor调用

主要作用

  • 被Monitor类调用

  • StartFrame、EndFrame成员函数来开始&&结束一次监控任务。

  • StartFrame

  • 创建人机交互模块的reader,并获取最新的状态,如果获取不到,直接停止本次监控任务(这也是为什么要同时启动人机交互模块)

  • Channel: hmi_status_topic, /apollo/hmi/status

  • 消息: modules/common_msgs/dreamview_msgs/hmi_status.proto: HMIStatus

  • 判断上次的运行方式与本次的运行方式(HMIStatus.current_mode)是否改变,

  • 改变

  • 记录当前运行方式

  • 获取当前运行方式的配置(apollo::dreamview::HMIMode)

  • 初始化系统状态中各组件状态字段

  • 没改变

  • 清理历史上其他模块的结果

  • 更新自动驾驶标识字段并返回true

  • EndFrame: 调用log_buffer_对象来发布消息

  • 监控结果channel: /apollo/monitor

  • 消息类型: modules/common_msgs/monitor_msgs/monitor_log.proto: MonitorMessage

  • 被xxxMonitor类调用

  • CreateReader、CreateWriter成员模板函数来创建不同类型的reader和writer

  • reader被缓存在Monitor Manager内部

  • Getters

  • GetStatus : 获取当前系统整体的状态(SystemStatus: status_)

  • SystemStatus: modules/common_msgs/monitor_msgs/system_status.proto

  • IsInAutonomousMode: 判断当前是否为自动驾驶模式

  • 如果当前是离线模式(use_sim_time被设置true) 为false

  • 创建底盘的reader,如果创建不成功,为false

  • Channel: chassis_topic, /apollo/canbus/chassis

  • 消息: modules/common_msgs/chassis_msgs/chassis.proto: Chassis

  • 通过底盘reader获取最新的底盘状态,如果Chassis消息中的头部模块名字被标记为SimControl, 为false (因为仿真不需要安全检查)

  • 判断消息是否过期,过期为否

  • 消息时间 + FLAGS_system_status_lifetime_seconds(default: 30s) < 当前时间即为过时

  • 判断底盘消息中的驾驶模式是否为自动驾驶模式,直接返回

  • GetHMIMode: 获取人机交互模块的配置

其内部的node成员是Monitor继承TimerComponet而来的。

RecurrentRunner

是所有xxxMonitor的父类,其内部有两个主要的方法

  • Tick

  • 根据xxxMonitor的监控周期来调用RunOnce方法

  • RunOnce

  • 此方法为纯虚函数,xxxMonitor实现自己的监控逻辑。

软件模块

Camera Monitor

  • 消息来源:

  • CameraCompent : modules/drivers/camera (未移植)

  • Channel name(实际上应该与modules/drivers/camera/conf/camera*.pb.txt中channel name一致)

  • FLAGS_image_long_topic

  • Default: /apollo/sensor/camera/traffic/image_long

  • FLAGS_camera_image_long_topic

  • Default: /apollo/sensor/camera/image_long

  • FLAGS_camera_image_short_topic

  • Default: /apollo/sensor/camera/image_short

  • FLAGS_camera_front_6mm_topic

  • Default: /apollo/sensor/camera/front_6mm/image

  • FLAGS_camera_front_6mm_2_topic

  • Default: /apollo/sensor/camera/front_6mm_2/image

  • FLAGS_camera_front_12mm_topic

  • Default: /apollo/sensor/camera/front_12mm/image

  • 消息

  • 类型: apollo::drivers::Image

  • 定义: modules/common_msgs/sensor_msgs/sensor_image.proto

  • 模块用途

  • 摄像头是否存在且只能存在一个

  • 监控检测逻辑

  • 串行判断所有摄像头的Channel,记录下frame_id,如果检测到当前摄像头存在且已经有摄像头存在即报错

  • 最终一个都没有检测到即报错,否则报正常

  • 如何开启

  • 在modules/dreamview/conf/hmi_modes下的配置文件中monitored_components模块里面指定FLAGS_camera_component_name的名字

Channel Monitor

  • 模块用途

  • 监控modules/dreamview/conf/hmi_modes下配置文件中monitored_components里面指定channel数据是否有效(为空或者缺失字段)、时延、发送频率等指标

  • 监控检测逻辑

  • 获取当前的HMImode

  • 如果被监控组件配置中有channel字段,则计算更新频率

  • 创建相对应的reader并且获取最新的message

  • reader创建不成功时,直接下发UNKNOWN状态

  • 最新message为空时,直接下发FATAL状态

  • 检查reader中的channel延迟情况, 不符合预期则下发FATAL状态

  • reader->GetDelaySec()

  • 检查message中是否缺失字段,不符合预期则下发ERROR状态

  • 被监控字段定义: modules/dreamview/proto/hmi_mode.proto: ChannelMonitorConfig.mandatory_fields 目前并没有被使用

  • 检查更新频率是否在预期范围内,不符合预期则下发WARN状态

  • 内部持有LatencyMonitor的指针,并通过GetFrequency来计算更新频率

  • 如果以上全部符合预期,下发OK状态

  • 如何开启

  • modules/dreamview/conf/hmi_modes下配置文件中monitored_components里面指定channel字段即自动开启。

Functional Satety Monitor

  • 模块用途

  • 此模块在Summay Monitor之后执行,会根据汇总的结果来确定是否要采取一定的措施,比如说紧急停车

  • 开启方法

  • FLAGS_enable_functional_safety, 默认是开启的

  • 监控检测逻辑

  • 确定当前是否安全,如果安全,则跳过本次监控

  • 如果当前是非自动驾驶模式,则认为是安全的

  • 检查HMI Modules、Monitored Component的状态,如果没有任何的ERROR或者FATAL,则认为是安全的

  • 判断请求停车是否被触发过,触发过则跳过本次监控

  • 判断是否有安全模式触发时间,如果没有,设置新的安全模式触发时间,跳过本次监控

  • 判断在safety_mode_seconds_before_estop(10s)时间内有没有采取任何措施,如果没有,则设置紧急停车状态位

  • 安全模式触发时间 + safety_mode_seconds_before_estop < 当前时间,即认为没有采取任何措施

Latency Monitor

  • 模块用途

  • 计算所有模块时延,本身并不下发状态码,统计的数据下发到指定channel中去

  • 为ChannelMonitor提供channel更新频率数据

  • 消息来源

  • 哪个模块需要被监控时延,需要模块自己创建LatencyRecorder实例

  • 时延记录输入

  • Channel: latency_recording_topic /apollo/common/latency_records

  • 消息: modules/common/latency_recorder/proto/latency_record.proto: LatencyRecordMap

  • 统计输出

  • Channel: latency_reporting_topic /apollo/common/latency_reports

  • 消息:modules/common/latency_recorder/proto/latency_record.proto: LatencyReport

  • 监控检测逻辑

  • 创建输入时延记录channel的reader,并设置最大取消息数量(30条)

  • 获取多条LatencyRecordMap消息,记录并计算频率保存在成员变量里,以供查询

  • 如果满足时延报告周期,则对外发布消息

  • 当前时间-上次报告时间 > 报告周期

  • 如果开启

  • 自动开启,只要有模块把延时上报,监控模块就会有统计报告

Localization Monitor

  • 模块用途

  • 主要用来监控定位数据,最后根据订阅来的状态码来更新最终的状态

  • 消息来源

  • modules/localization

  • 输入Channel

  • localization_msf_status: /apollo/localization/msf_status

  • 消息

  • modules/common_msgs/localization_msgs/localization.proto: LocalizationStatus

  • 监控检测逻辑

  • 检查定位模块是否被监控,如果没被监控,跳过

  • 创建reader并获取最新message

  • 如果最新message为空则下发ERROR状态

  • 透传定位状态码到组件状态码并下发,对应关系

  • MeasureState::OK : ComponentStatus::OK

  • MeasureState::WARNNING : ComponentStatus::WARN

  • MeasureState::ERROR : ComponentStatus::WARN

  • MeasureState::CRITICAL_ERROR: ComponentStatus::ERROR

  • MeasureState::FATAL_ERROR: ComponentStatus::FATAL

Module Monitor

  • 模块用途

  • 这是通过Cyber框架中Node服务发现手段来检测被监控模块是否还存在

  • 监控检测逻辑

  • 对于每一个被监控的模块,用NodeManager去查看是否有模块Node,如果在启动时配置的Node任意一个不存在,则下发FATAL状态码

  • NodeManager即为cyber::service_discovery::NodeManager,可以找到所有存在的Node节点,一个正常运行的模块至少存在一个Node节点

Process Monitor

  • 模块用途

  • 这是通过当前所有正在运行的进程,检测预期进程是否还存在

  • 监控检测逻辑

  • 通过所有正在运行的进程(/proc//cmdline)来获取所有的命令字符串

  • 分别检查HMI Modules、Monitored Components、 other components中的所有启动关键字是否在存活进程列表中,如果有一个不存在,则下发FATAL

Recorder Monitor

  • 模块用途

  • 监控SmartRecorder模块的状态,最后根据SmartRecorder模块的状态来下发状态

  • 输入

  • Channel: recorder_status_topic

  • 消息: modules/common_msgs/monitor_msgs/smart_recorder_status.proto: SmartRecorderStatus

  • 监控检测逻辑

  • 检查SmartComponent组件是否被监控,如果没有则跳过

  • 创建reader并且获取最新的message

  • 如果没有最新message,则下发error

  • 直接映射透传最新message中的recording_state

  • RecordingState::RECORDING: ComponentStatus::OK

  • RecordingState::TERMINATING: ComponentStatus::WARN

  • RecordingState::STOPPED: ComponentStatus::OK

Summary Monitor

  • 模块用途

  • 这个模块是整个监控体系中最重要的,xxxMonitor都调用此模块来修改Monitor Manager中的SystemStatus,内部具有优先级的判断。另外,本身也有一些汇总状态升级的逻辑。

  • 组件状态优先级: FATAL > ERROR > WARN > OK > UNKNOWN

  • 监控监测逻辑

  • 将SystemStatus中的组件状态(Process、Module、Channel、Resource、Other)汇总到最严重的级别

  • 序列化SystemStatus,并判断是否达到监控结果广播周期,如果判断到周期后,则广播

  • 判断系统状态hash值和上一次是否一致

  • 当前时间 - 上次广播时间 > 系统状态广播间隔(system_status_publish_interval: 1s)

硬件模块

Esdcan Monitor

  • 模块用途

  • 用来监控ESD-CAN设备的,看设备是否在线

  • 如何开启

  • 编译之前需要加上USE_ESD_CAN编译参数,现在默认不开启

  • 监控检测任务

  • 获取Canbus组件,如果没有获取不到,则跳过

  • 根据can_id创建一个handle,然后通过canIoctl来获取设备状态,如果一切正常,说明设备在线,下发OK,反之不在,下发ERROR

GPS Monitor

  • 模块用途

  • 用来监控GPS的状态

  • 输入

  • Channel: gnss_best_pose_topic

  • 消息: modules/common_msgs/sensor_msgs/gnss_best_pose.proto: GnssBestPose

  • 监控监测逻辑

  • 获取GPS组件,如果获取不到,跳过本次监控

  • 创建reader并且获取最新的message

  • 根据最新message的SolutionType来确定组件状态

  • SolutionType::NARROW_INT: ComponentStatus::OK

  • SolutionType::SINGLE: ComponentStatus::WARN

  • Default: ComponentStatus::ERROR

Resource Monitor

  • 模块用途

  • 根据预设的阈值来监控服务器的资源,

  • 如何开启

  • modules/dreamview/conf/hmi_modes下配置monitored_modules只要有resource相关配置就会开启

  • 监控检测逻辑

  • 获取被监控的组件,逐一检查是否配置resource字段,如果没有配置,跳过

  • 对于有资源阈值的别监控组件,逐一检查硬件资源,有任何不符合预期即下发ERROR和WARN

  • 检查磁盘空间

  • 检查CPU使用率

  • 检查内存使用率

  • 检查磁盘负载

SocketCan Monitor

  • 模块用途

  • 用来监控Socket Can设备,与Edscan Monitor类似

  • 监控检测逻辑

  • 根据名字获取相关的组件,获取不到即跳过本次监控

  • 打开Socket CAN的handler

  • 设置Message Filter, 失败即返回ERROR

  • 允许CAN的响应

  • 利用ioctl和bind来测试设备是否正常运转,出错返回ERROR

相关内容

热门资讯

宝洁失速背后,消费品正在被碎片... 本文来自微信公众号:刀姐doris,作者:刀法智库,原文标题:《宝洁失速的背后:加剧分化的时代,大品...
和讯投顾刘昌松:A股放量大跌,... A股放量大跌,是守20天均线,3362点收盘,很有意思。和讯投顾刘昌松表示,结构上日线级别m头颈线位...
湘潭电化2025年6月19日涨... 2025年6月19日,湘潭电化(sz002125)触及涨停,涨停价11.19元,涨幅10.05%,总...
21评论丨科创板出“新政”,低... 朱克力(国研新经济研究院创始院长、湾区低空经济研究院院长)近日,中国证监会发布《关于在科创板设置科创...
用担保费推高利率至36%,信用... 今年来,在扩内需、促消费的政策引导下,消费贷利率不断刷新低点,主流商业银行消费贷利率最低跌到3%左右...
飞骧科技落子嘉善建华东总部 助... 在半导体产业蓬勃发展的浪潮中,深圳飞骧科技股份有限公司与嘉善经济技术开发区的战略合作,如同一颗璀璨的...
低空经济乘势“起飞” 深市上市... 自2024年“低空经济”写入政府工作报告以来,政策端、产业端同频共振,全国多地积极行动,低空经济新赛...
调味品龙头,港股上市第一天盘中... 2025.06.20本文字数:2434,阅读时长大约4分钟作者 |第一财经 李隽港股上市第一天,海天...
周六福开启招股,6月26日将在... 来源|贝多财经 6月18日,周六福珠宝股份有限公司(下称“周六福”,HK:06168)披露发售公告,...
超1亿用户下单,美团闪购:“6... 端午家人聚餐,闪购几瓶白酒助兴;儿童节,买个“小天才”送孩子;高考结束,闪购笔记本电脑犒劳考生;父亲...
中基协:截至一季度末,资产管理... 北京商报讯(记者 李海媛)6月19日,中基协发布2025年一季度资产管理产品统计数据。数据显示,截至...
股价2个月暴涨200%,永安药... 短短两个半月内,永安药业(002365.SZ)股价从9元飙升至28元,累计涨幅超200%。截至6月1...
中国幼儿园,每小时消失2所 中... 订阅 快刀财经 ▲ 做您的私人商学院幼儿园空荡荡,产房静悄悄。作者:图数室来源:图数室(ID:sin...
信用卡存量突围战:打出私银+财... 信用卡存量突围战:打出私银+财富管理组合拳作者 | 郭聪聪编辑 | 方海平新媒体编辑 | 实习生 宋...
消费者留给防晒衣的信任不多了 ... 当"不防晒的防晒衣"冲上热搜第一,防晒衣消费热背后的隐患也暴露无遗。在央视镜头下,虚标紫外线防护系数...
海天味业港股上市,首日微涨0.... 21世纪经济报道记者吴抒颖 广州报道6月19日,海天味业在港股二次上市,截至当日收盘海天味业报36....
主力资金连续5日流出!五粮液集... 五粮液集团本次拟增持股份的所需资金来源为自有资金,考虑到集团近年来累计获得分红超百亿元,理论上具备直...
新业主七折购房,取消!老业主差... 距离收房还有不到半个月时间,但买了北京御翠园的业主很是恼火。 顶着“李嘉诚在京最后一个项目”的光环,...
易方达的千亿魔咒,是因为不懂Z... 在资产管理行业,"规模是业绩的敌人"这一说法由来已久,当基金规模突破某一临界点后,管理难度呈指数级上...
甲醇期货:6月19日涨1.88... 【6月19日国内期市能化板块多数飘红,甲醇期货延续偏强震荡】6月19日,国内期市能化板块多数飘红。甲...
Labubu二手价大跌,有黄牛... 6月19日,有网友表示,泡泡玛特6月18日在其官方小程序上已大量补货Labubu系列盲盒,并多次弹出...
又来大“咖”,羊城创意产业园“... 广州东部,金融城北区,在羊城创意产业园这片绿荫掩映的创意热土上,咖啡香气正编织着新的商业图景。库迪咖...
“618”银行掀起信用卡抢客战... 多家银行杀入“618”战场,借助这波消费旺势发力信用卡业务。 时代财经梳理发现,今年“618”期间,...
华润医疗(01515.HK):... 华润医疗(01515.HK)发布公告,自2025年6月19日起:(1)宋清退任执行董事、董事长、提名...
「数据看盘」标普消费ETF成交... 一、沪深股通前十大成交 今日沪股通总成交金额为607.86亿,深股通总成交金额为714.43亿。 ...
美利坚甩锅大赛,进入白热化阶段... 2025年年中的美联储决议出来了:维持联邦基金目标利率区4.25%-4.50%不变,维持原有缩表节奏...
国信证券:购买万和证券股份获深... 新京报贝壳财经讯 国信证券(002736.SZ)公告称,公司发行股份购买资产暨关联交易事项获得深圳证...
业绩“五连亏”,中国东航拟转让... 本文来源:时代周报 作者:管越 图片来源:图虫业绩“五连亏”的中国东航(600115.SH,067...
人均养老金有多少?人社部终于公... 养老金的差距确实大,城镇退休职工竟然是农民的14倍多。很多还没退休的人,总是问退休后能拿到多少养老金...
“兆易创新”将重回巅峰? 兆易... 去年国内的存储器公司大部分都过得很滋润,因为三星、美光和SK海力士这三大巨头放弃了DDR3市场。今年...