引言
ROS 日志 (log) 系統(tǒng)的功能是讓程序生成一些日志消息,顯示在屏幕上、發(fā)送到特定 topic 或者儲存在特定 log 文件中,以方便調(diào)試、記錄、報警等。
ROS 中的日志消息按照嚴(yán)重性由低到高可以分為 5 級:DEBUG、INFO、WARN、ERROR、FATAL。DEBUG 程度最輕,只要程序可以運行就不需要注意,但 ERROR 和 FATAL 出現(xiàn)就表示程序存在著嚴(yán)重問題導(dǎo)致無法運行。
下面簡單介紹如何生成和查看日志消息。
生成基本的日志消息
由五個 C++ 宏來產(chǎn)生日志消息,每個宏對應(yīng)一個級別:
ROS_DEBUG_STREAM(message);
ROS_INFO_STREAM(message);
ROS_WARN_STREAM(message);
ROS_ERROR_STREAM(message);
ROS_FATAL_STREAM(message);
例如編寫如下 C++ 程序

編譯、執(zhí)行之后結(jié)果如下:

生成一次性日志消息
ROS 提供了可以僅僅生成一次日志消息的宏:
ROS_DEBUG_STREAM_ONCE(message);
ROS_INFO_STREAM_ONCE (message);
ROS_WARN_STREAM_ONCE (message);
ROS_ERROR_STREAM_ONCE (message);
ROS_FATAL_STREAM_ONCE (message);
將上述 C++ 程序中的 log 命令替換一下,得到如下的執(zhí)行結(jié)果:

可以看到每個日志只生成了一次。
生成頻率受控的日志消息
ROS_DEBUG_STREAM_THROTTLE(interval, message);
ROS_INFO_STREAM_THROTTLE(interval, message);
ROS_WARN_STREAM_THROTTLE(interval, message);
ROS_ERROR_STREAM_THROTTLE(interval, messge);
ROS_FATAL_STREAM_THROTTLE(interval, message);
參數(shù) interval 是 double 型,表示相鄰日志消息出現(xiàn)的最小時間間隔,以秒為單位。

查看日志消息
日志消息有三個不同的輸出目的地,包括屏幕、rosout topic、log 文件。其中發(fā)布到 rosout topic 的 msg 類型是 rosgraph_msgs/Log。除了 topic echo,還可以通過 rqt_console 查看日志消息:

啟用和禁用日志消息
ROS 默認(rèn)只處理 INFO 或者更高級別消息,DEBUG 級別的消息會被忽略。
可以通過命令行設(shè)置顯示的日志級別
rosservice call /node-name/set_logger_level rospackage-name level
其中
- set_logger_level服務(wù)由各個節(jié)點自動提供;
- node-name 期望設(shè)置日志級別的節(jié)點名稱;
- package-name 擁有這個節(jié)點的 package 名稱;
- level 是五個級別中的一個。
另外也可以通過圖形界面設(shè)置日志級別
rqt_logger_level
打開如下界面:

圖中列出了節(jié)點列表、日志記錄器列表、日志級別列表。在圖中操作與 rosservice 命令的效果一致。
另外,也可以在 C++ 程序中設(shè)置日志級別。ROS node 改變自身日志級別最直接的方式是使用 log4cxx 提供的接口:
#include <log4cxx/logger.h>
log4cxx::Logger::getLogger(ROSCONSOLE_DEFAULT_NAME)->setLevel(
ros::console::g_level_lookup[ros::console::levels::Debug]);
ros::console::notifyLoggerLevelsChanged();
其中 Debug 可以替換為 Info、Warn、Error、Fatal。
written by YY
Revised by QP