Apollo 应用与源码分析:Monitor监控 - 基本概念与入口分析

news2025/7/19 21:02:03

Monitor 系统监控

目录

基本概念

代码结构分析

整体逻辑分析


基本概念

整体分类

该模块包含用于检查硬件状态和监视系统运行状况的代码等系统级软件。

在Apollo 5.5中,监视模块现在执行以下检查:

  • 运行模块状态
  • 监控数据完整性
  • 监控数据频率
  • 监视系统运行状况(例如CPU、内存、磁盘使用情况等)
  • 生成端到端延迟统计报告

前三项功能是可以自主配置的。

属性分类

从属性上来分类的话,apollo 的monitor 基本上可以分为硬件状态监控和软件状态监控。

硬件状态监控基本上可以分为:

  • GPS
  • Resource
  • ESD-CAN
  • Socket-CAN

软件状态监控可以分为:

  • Channel Status
  • Functional safety Status
  • Latency status
  • Localization status
  • Module status
  • Process status
  • recorder status

然后由Summary 模块将上述的状态打包发出。

代码结构分析

├── BUILD
├── README.md
├── common
│   ├── BUILD
│   ├── monitor_manager.cc
│   ├── monitor_manager.h
│   ├── recurrent_runner.cc
│   ├── recurrent_runner.h
│   └── recurrent_runner_test.cc
├── hardware
│   ├── BUILD
│   ├── esdcan_monitor.cc
│   ├── esdcan_monitor.h
│   ├── gps_monitor.cc
│   ├── gps_monitor.h
│   ├── resource_monitor.cc
│   ├── resource_monitor.h
│   ├── socket_can_monitor.cc
│   └── socket_can_monitor.h
├── monitor.cc
├── monitor.h
├── proto
│   ├── BUILD
│   └── system_status.proto
└── software
    ├── BUILD
    ├── camera_monitor.cc
    ├── camera_monitor.h
    ├── channel_monitor.cc
    ├── channel_monitor.h
    ├── functional_safety_monitor.cc
    ├── functional_safety_monitor.h
    ├── latency_monitor.cc
    ├── latency_monitor.h
    ├── localization_monitor.cc
    ├── localization_monitor.h
    ├── module_monitor.cc
    ├── module_monitor.h
    ├── process_monitor.cc
    ├── process_monitor.h
    ├── recorder_monitor.cc
    ├── recorder_monitor.h
    ├── summary_monitor.cc
    └── summary_monitor.h

主要包含4个部分:

  • component创建入口 :monitor.cc/.h
  • common 公共基类
  • hardware 硬件监控
  • software 软件监控

整体逻辑分析

整体流程

Monitor 运行时,先扫描不同的子 Monitor,然后通过 SummaryMonitor 做整体状态的监控报告,产生 4 类状态:

  • Fatal
  • Error
  • Warn
  • OK
  • Unkown

之后由FunctionalSafetyMonitor根据状态做两个行为:

  1. 通知驾驶员采取行动
  2. 如果预期的安全措施没有生效,触发Guardian模块(紧急停车)

代码分析

Monitor 类结构分析:monitor.h/.cc

class Monitor : public apollo::cyber::TimerComponent {
 public:
  bool Init() override;
  bool Proc() override;

 private:
  std::vector<std::shared_ptr<RecurrentRunner>> runners_;
};

Monitor 是一个继承了TimerComponent的定时器组件,init要负责初始化,proc负责实际执行。

Monitor 初始化分析

MonitorManager::Instance()->Init(node_);
  // Only the one CAN card corresponding to current mode will take effect.
  runners_.emplace_back(new EsdCanMonitor());
  runners_.emplace_back(new SocketCanMonitor());
  // To enable the GpsMonitor, you must add FLAGS_gps_component_name to the
  // mode's monitored_components.
  runners_.emplace_back(new GpsMonitor());
  // To enable the LocalizationMonitor, you must add
  // FLAGS_localization_component_name to the mode's monitored_components.
  runners_.emplace_back(new LocalizationMonitor());
  // To enable the CameraMonitor, you must add
  // FLAGS_camera_component_name to the mode's monitored_components.
  runners_.emplace_back(new CameraMonitor());
  // Monitor if processes are running.
  runners_.emplace_back(new ProcessMonitor());
  // Monitor if modules are running.
  runners_.emplace_back(new ModuleMonitor());
  // Monitor message processing latencies across modules
  const std::shared_ptr<LatencyMonitor> latency_monitor(new LatencyMonitor());
  runners_.emplace_back(latency_monitor);
  // Monitor if channel messages are updated in time.
  runners_.emplace_back(new ChannelMonitor(latency_monitor));
  // Monitor if resources are sufficient.
  runners_.emplace_back(new ResourceMonitor());
  // Monitor all changes made by each sub-monitor, and summarize to a final
  // overall status.
  runners_.emplace_back(new SummaryMonitor());
  // Check functional safety according to the summary.
  if (FLAGS_enable_functional_safety) {
    runners_.emplace_back(new FunctionalSafetyMonitor());
  }

  return true;

runners_ 是 类中的一个成员容器:std::vector<std::shared_ptr<RecurrentRunner>> runners_。

init 函数流程:

  1. 利用当前node,对MonitorManger 进行初始化(node_是因为继承了component来的)
  2. 把下述monitor 放入容器:
    1. EsdCanMonitor
    2. SocketCanMonitor
    3. GpsMonitor
    4. LocalizationMonitor
    5. CameraMonitor
    6. ProcessMonitor
    7. ModuleMonitor
    8. LatencyMonitor
    9. ChannelMonitor
    10. ResourceMonitor
    11. SummaryMonitor
  1. 判断是不是enable 了functional_safety
    1. 如果是就把FunctionalSafetyMonitor也放入容器
  1. 返回ture

Monitor 执行函数分析

bool Monitor::Proc() {
  const double current_time = apollo::cyber::Clock::NowInSeconds();
  if (!MonitorManager::Instance()->StartFrame(current_time)) {
    return false;
  }
  for (auto& runner : runners_) {
    runner->Tick(current_time);
  }
  MonitorManager::Instance()->EndFrame();

  return true;
}

流程

  1. 记录了当前时间
  2. MonitorManager 启动一个frame(启动一次监控任务),并传入当前时间
    1. 如果执行失败返回false
  1. 遍历runners容器,将里面的所有的monitor 执行tick函数(启动子监控的监控任务),并传入当前时间。
  2. MonitorManager 关闭frame。
  3. 返回true。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot 点滴(3)springboot ThreadLocal实现单机权限认证

Springboot中权限认证的基本方案&#xff1a; 可以对URL进行HandlerInterceptor拦截&#xff0c;然后权限验证。 Client登录成功后&#xff0c;每次发送请求时&#xff0c;会将token等信息存放到header中。 Server收到请求&#xff0c;在HandlerInterceptor中从header获取用户…

3.4、可靠传输

3.4、可靠传输 3.4.1、基本概念 使用差错检测技术\color{red}差错检测技术差错检测技术&#xff08;例如循环冗余校验 CRC )&#xff0c;接收方的数据链路层就可检测出帧在传输过程中是否产生了误码\color{red}误码误码&#xff08;比特错误)。 数据链路层向上层提供的服务类…

hive中连续N天登录问题、topN问题、拉链表实现

一、连续N天登录问题 一般采用开窗函数来实现 首先需要用到窗口函数的向下取值 窗口函数lead 功能&#xff1a;用于从当前数据中基于当前行的数据向后偏移取值 语法&#xff1a;lead(colName&#xff0c;N&#xff0c;defautValue) colName&#xff1a;取哪一列的值 N&#xf…

RemObjects Remoting SDK for Delphi

RemObjects Remoting SDK for Delphi 远程处理SDK是一个框架&#xff0c;允许您创建使用服务公开性能的服务器。然后&#xff0c;可以通过网络远程访问这些解决方案&#xff0c;这些解决方案可以通过运行在大量语言和平台上的客户端软件来实现。 在当今时代&#xff0c;许多程序…

【人才盘点九宫格】你还不来学一学人才九宫格,知道你在领导心目中是属于哪一类人才吗?

文章目录一、九宫格的维度——绩效、能力、潜力1.1 维度一&#xff1a;绩效。1.2 维度二&#xff1a;能力。1.3 维度三&#xff1a;潜力。二、九宫格分类2.1 经典九宫格&#xff1a;绩效-能力九宫格2.2 高潜九宫格&#xff1a;绩效-潜力九宫格2.2.1 高潜九宫格图示2.2.2 高潜九…

SRV1:拥有一个阿里云服务器

1.1 简介 平台&#xff1a; 阿里云   时间&#xff1a; 2022.11.25   类型&#xff1a; 轻量应用服务器2核2G   链接&#xff1a; https://www.aliyun.com/daily-act/ecs/activity_selection?utm_contentse_1013075595 1.2 说明 本文购买的是阿里云的 轻量应用服务器2…

NFT 的洗盘交易,真的赚钱吗?

Nov. 17&#xff0c;Hanson Data Source&#xff1a; Footprint Analytics Wash Trade Analysis 洗盘交易造成的虚假交易是准确评估 NFT 项目、交易所和整个行业的最大障碍之一。 这份报告将会分析X2Y2市场的洗盘交易者如何从洗盘交易和代币质押中获励。同时分析了前10交易量…

3.3、差错检测

3.3、差错检测 3.3.1、比特差错 比特差错\color{red}比特差错比特差错 实际的通信链路都不是理想的&#xff0c;比特在传输过程中可能会产生差错: 111 可能会变成 000 ,而 000 也可能变成 111 。 比特流在传输过程中由于受到各种干扰&#xff0c;就可能会出现比特差错&#…

K8S基础知识学习

目录 一、什么是 Kubernetes &#xff1f; Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;Kubernetes简称K8S。 K8S用于容器化应用程序的部署&#xff0c;扩展和管理。 K8S提供了容器编排&#xff0c;资源调度&#xff0c;弹性伸缩&#xff0c;部署管理&a…

详解设计模式:简单工厂模式

简单工厂模式&#xff08;Smiple Factory Pattern&#xff09;&#xff1a;定义一个工厂类&#xff0c;他可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有共同的父类&#xff0c;简单工厂模式也被称为静态工厂模式。 &#xff5e; 本篇内容包括&#xf…

若依(Ruoyi-Vue-Plus版)——1.登录(SaToken)

这里学习一下若依框架的一个扩展版本&#xff1a; RuoYi-Vue-Plus: 后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-TokenMybatis-PlusJacksonXxl-JobSpringDocHutoolOSS 定期同步 (gitee.com) 官方文档&#xff1a;文档预览 - Gitee.com 项目有关SaToken登录写在最后&#xff0c…

论文阅读笔记 | 三维目标检测——SECOND算法

如有错误&#xff0c;恳请指出。 文章目录1. 背景2 网络结构2.1 3d Backbone2.2 Loss Compute2.3 Data Augment3. 实验结果paper&#xff1a;《SECOND: Sparsely Embedded Convolutional Detection》 1. 背景 鉴于VoxelNet等3d检测算法中使用的3d卷积会导致计算量大且推理速度…

智慧税务解决方案-最新全套文件

智慧税务解决方案-最新全套文件一、建设背景税务大数据现状和挑战1、数据割裂&#xff0c;外部数据整合不足&#xff0c;智能化应用不足2、缺乏统一治理&#xff0c;数据资产不清&#xff0c;质量不高3、数据获取效率低&#xff0c;数据冗余、查询效率低4、 运营运维体系不健全…

【Linux】---进程地址空间

文章目录什么是进程地址写时拷贝为什么要有进程地址为了保护物理内存更方便进行进程和进程数据的解耦统一视角操作系统怎么管理进程地址区域划分在之前学习C/C的时候都会提到 地址这个概念&#xff0c;我们写代码时创建变量&#xff0c;定义函数等都会有其对应的地址空间。而地…

成为数字游民,他们为何「All in Web3」?

成为数字游民&#xff0c;他们为何「All in Web3」&#xff1f; “早上好&#xff0c;夜之城。” 赛博朋克承载着一代人对未来世界的遐想。今年上映的「赛博朋克&#xff1a;边缘行者」中&#xff0c;主人公大卫面临着不夜城旧有制度的高压和控制&#xff0c;对旧有秩序不断发…

C++STL-string类的实现(下)

文章目录1. 流插入和流提取1.1 流插入1.2 流提取2. 现代写法的拷贝构造和赋值函数2.1 现代写法的拷贝构造2.1 现代写法的赋值函数3. string类的迭代器实现3.1 正向迭代器1. 流插入和流提取 1.1 流插入 可能有的同学会这样去写&#xff1a;以一个字符串形式来输出。还有的人会这…

《CTFshow - Web入门》03. Web 21~30

Web 21~30web21知识点题解web22知识点题解web23知识点题解web24知识点题解web25知识点题解web26知识点题解web27知识点题解web28知识点题解web29知识点题解web30知识点题解web21 知识点 tomcat 认证爆破burpsuite暴力破解&#xff08;Sniper&#xff09;之custom iterator使用…

用Numba:一行代码将Python程序运行速度提升100倍

用Numba&#xff1a;一行代码将Python程序运行速度提升100倍 在《用PyPy加速Python程序》中我们看到&#xff0c;PyPy通过JIT技术可以将Python的运行速度平均提高3-4倍。但即便是提升后&#xff0c;Python的执行速度依然无法与C/C/Rust同日而语。并且PyPy对Python程序的优化对…

【计算机毕业设计】33.快递取件预约系统源码

一、系统截图&#xff08;需要演示视频可以私聊 摘 要 本论文主要论述了如何使用JSP技术开发一个快递取件预约系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…

GEO振弦式钢筋计适用范围

适用范围 钢筋计&#xff1a;用于监测岩土工程混凝土建筑物的应力&#xff0c;适用于长期埋设在水工建筑物或其他建 筑物内部&#xff0c;测量结构物内部的钢筋应力。 锚杆应力计&#xff1a;钢筋计用于测量锚杆应力时&#xff0c;成为锚杆应力计。装上锚杆应力计的锚杆称…