ROS2 C++ 日志宏函数使用说明

基本日志宏 - 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流式语法,类型安全,适合多变量组合输出
### 如何在ROS2C++代码中实现自定义日志输出 在 ROS 2 中,`rclcpp` 使用 `rcutils` 提供的日志功能。默认情况下,日志输出会包含消息严重性、记录器名称和消息内容。此外,还可以通过配置环境变量 `RCUTILS_CONSOLE_OUTPUT_FORMAT` 来自定义控制台输出格式[^2]。 以下是一个简单的 C++ 示例,展示如何使用 ROS 2日志系统并自定义日志输出: ```cpp #include "rclcpp/rclcpp.hpp" int main(int argc, char **argv) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("custom_logger_node"); // 获取节点的 logger auto logger = node->get_logger(); // 输出不同级别的日志 RCLCPP_DEBUG(logger, "This is a DEBUG message."); RCLCPP_INFO(logger, "This is an INFO message."); RCLCPP_WARN(logger, "This is a WARN message."); RCLCPP_ERROR(logger, "This is an ERROR message."); RCLCPP_FATAL(logger, "This is a FATAL message."); // 自定义日志输出格式(需要在运行时设置环境变量) // 设置环境变量:export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}] {message} ({name})' rclcpp::shutdown(); return 0; } ``` 在这个示例中,`RCLCPP_DEBUG`、`RCLCPP_INFO` 等宏用于输出不同级别的日志消息。通过设置环境变量 `RCUTILS_CONSOLE_OUTPUT_FORMAT`,可以调整日志输出的格式[^2]。 #### 环境变量配置 可以通过以下命令设置日志输出格式: ```bash export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}] {message} ({name})' ``` 此格式将输出日志的严重性、消息内容以及记录器名称。 ### 注意事项 - 默认的日志输出格式为 `[severity] [time] [logger_name]: message`。 - 如果需要更复杂的日志处理逻辑,可以考虑使用 `rcutils_logging_set_output_handler` 函数来注册自定义的日志处理回调函数[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daolongzhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值