Skip to main content

24. 高级日志与诊断 — 系统健康监控

概述

本示例演示 ROS 2 的日志系统高级用法和诊断框架。通过 demo_xmake_logging 包,你将学习如何在运行时切换日志级别、使用 diagnostic_updater 发布系统健康状态,以及利用 ros2 doctor 进行系统检查。

ROS 2 知识点:ros2 doctor、日志级别运行时切换、diagnostic_updater、自定义诊断

xmake 知识点diagnostic_updater 依赖解析

ROS 2 知识

日志系统架构

ROS 2 的日志系统基于 spdlog,支持 5 个级别:

DEBUG < INFO < WARN < ERROR < FATAL

日志级别可以在多个层面控制:

  • 启动时--ros-args --log-level debug
  • 运行时:通过 Service /<node>/set_logger_level 动态切换
  • 配置文件--ros-args --log-config-file <path>

diagnostic_updater 框架

diagnostic_updater 提供了一种标准化的方式来报告硬件和软件状态:

┌──────────────┐    /diagnostics    ┌──────────────────┐
│ Your Node │ ─────────────────> │ diagnostic_agg │
│ (Updater) │ │ (聚合/监控) │
└──────────────┘ └──────────────────┘
│ │
DiagnosticTask rqt_robot_monitor
- 硬件温度 (GUI 查看)
- 通信状态
- 资源使用率

每个 DiagnosticTask 报告一个诊断状态,包括:

  • OK:正常
  • WARN:需要注意
  • ERROR:需要处理
  • STALE:数据过期

ros2 doctor

ros2 doctor 是系统级健康检查工具,可以检测:

  • ROS 2 环境配置
  • 网络连通性
  • DDS 配置
  • 话题/服务连接状态

示例代码

项目结构

demo_xmake_logging/
├── xmake.lua # 构建配置
├── package.xml # deps: rclcpp, diagnostic_updater
└── src/
└── diagnostics_node.cpp # 诊断发布 + 日志级别演示

xmake.lua 构建配置

set_project("demo_xmake_logging")
set_version("0.1.0")
set_languages("cxx17")

add_rules("mode.debug", "mode.release")
add_rules("ament_xmake.package")

target("diagnostics_node")
set_kind("binary")
set_installdir("lib/demo_xmake_logging")
add_files("src/diagnostics_node.cpp")
add_ros_deps("rclcpp", "diagnostic_updater")

diagnostic_updater 是一个标准 ROS 2 包,通过 add_ros_deps() 即可引入,xmake 会自动解析其头文件路径和链接库。

源码要点

诊断任务注册

// 创建 Updater(自动发布到 /diagnostics)
diagnostic_updater::Updater updater(this);
updater.setHardwareID("demo_robot");

// 添加诊断任务
updater.add("Hardware Status", [this](diagnostic_updater::DiagnosticStatusWrapper & stat) {
if (cpu_temp_ < 60.0) {
stat.summary(diagnostic_msgs::msg::DiagnosticStatus::OK, "Temperature normal");
} else if (cpu_temp_ < 75.0) {
stat.summary(diagnostic_msgs::msg::DiagnosticStatus::WARN, "Temperature elevated");
} else {
stat.summary(diagnostic_msgs::msg::DiagnosticStatus::ERROR, "Overheating!");
}
stat.add("CPU Temperature", cpu_temp_);
stat.add("Uptime (s)", uptime_seconds_);
});

运行时日志级别切换

// 程序化切换日志级别
auto logger = this->get_logger();
auto ret = rcutils_logging_set_logger_level(
logger.get_name(), RCUTILS_LOG_SEVERITY_DEBUG);

构建与运行

# 构建
colcon build --packages-select demo_xmake_logging
source install/setup.bash

# 运行诊断节点
ros2 run demo_xmake_logging diagnostics_node

# 在另一个终端,指定日志级别启动
ros2 run demo_xmake_logging diagnostics_node --ros-args --log-level debug

验证

# 查看诊断话题
ros2 topic echo /diagnostics

# 系统健康检查
ros2 doctor

# 运行时切换日志级别(通过 service)
ros2 service call /diagnostics_node/set_logger_level \
rcl_interfaces/srv/SetLoggerLevel \
"{logger_name: 'diagnostics_node', level: 10}"

xmake 知识点小结

特性说明
add_ros_deps("diagnostic_updater")引入诊断框架依赖,自动解析头文件和链接库
单 target 简单包一个 binary target 的最小包结构

内容扩展

以下资源可帮助你深入了解本章涉及的技术领域。

开源项目

工具

文档与教程

参考