基本日志宏 - RCLCPP_{DEBUG,INFO,WARN,ERROR,FATAL}
每次都会输出。
用途:用于常规日志输出,例如在每一帧、每个回调、每次服务调用中打印。
示例:
RCLCPP_INFO(logger, "Received %d items", count);
只打印一次 - RCLCPP_{...}_ONCE
只打印第一次命中这行代码时的日志。
用途:避免在循环中重复打印相同的警告或信息,打印一次性提示如“连接成功”。
示例:
RCLCPP_WARN_ONCE(logger, "First time sensor value is too high!");
按条件输出日志 - RCLCPP_{...}_EXPRESSION
表达式为真时打印。
用途:在某些状态满足时才输出日志。
示例:
RCLCPP_DEBUG_EXPRESSION(logger, battery_level < 10, "Battery is critically low!");
按函数判断是否输出 - RCLCPP_{...}_FUNCTION
函数返回 true 时打印。
用途:复杂条件封装在函数中,增强逻辑可读性。
示例:
bool should_log() { return cpu_usage > 90; }
RCLCPP_ERROR_FUNCTION(logger, should_log, "High CPU usage detected!");
跳过第一次再打印 - RCLCPP_{...}_SKIPFIRST
第一次不打印,之后每次都打印。
用途:跳过初始化阶段的日志或噪音。
示例:
RCLCPP_WARN_SKIPFIRST(logger, "Temperature slightly high.");
限频打印 - RCLCPP_{...}_THROTTLE
指定毫秒内最多打印一次。
用途:控制高频率输出,防止刷屏。
示例:
RCLCPP_INFO_THROTTLE(logger, 1000, "Status: %s", status.c_str());
跳过第一次 + 限频 - RCLCPP_{...}_SKIPFIRST_THROTTLE
第一次跳过,后续限频打印。
用途:避免初始化打印,运行时限频。
示例:
RCLCPP_DEBUG_SKIPFIRST_THROTTLE(logger, 2000, "Reading sensor data...");
流式日志宏 - RCLCPP_{...}_STREAM
使用 << 风格,不用 printf 格式字符串,类型安全。
示例:
RCLCPP_INFO_STREAM(logger, "Current speed: " << speed << " km/h");
同样适用于 ONCE、THROTTLE、EXPRESSION 等变体。
对比总结表
宏类别 | 使用时机 / 控制逻辑示例 |
---|
RCLCPP_INFO | 正常打印,每次触发都输出 |
RCLCPP_WARN_ONCE | 只打印第一次(常用于“首次异常”) |
RCLCPP_ERROR_THROTTLE | 高频情况下防刷屏(如 1 秒 1 次) |
RCLCPP_INFO_EXPRESSION | 仅当某条件为真时输出 |
RCLCPP_FATAL_SKIPFIRST | 跳过第一次初始化阶段的误报 |
RCLCPP_DEBUG_FUNCTION | 仅当自定义函数返回 true 时打印 |
RCLCPP_WARN_SKIPFIRST_THROTTLE | 稳定后才开始限频打印(不影响系统性能) |
RCLCPP_INFO_STREAM | 流式语法,类型安全,适合多变量组合输出 |