ROS學習之日志消息
ROS日志系統的核心思想,就是使程序生成一些簡短的文本字符流,這些字符流便是日志消息。
0.1嚴重級別
ROS中,日志消息分為五個不同的嚴重級別,也可簡稱為嚴重性或者級別。按照嚴重性程度遞增,這些級別有
DEBUG
INFO
WARN
ERROR
FATAL
0.2生成日志消息
0.2.1簡單日志消息
生成簡單的日志消息,總共有五個基本的 C++宏用來產生日志消息,其中每個宏對應一個嚴重級別:
ROS_DEBUG_STREAM(message);
ROS_INFO_STREAM(message);
ROS_WARN_STREAM(message);
ROS_ERROR_STREAM(message);
ROS_FATAL_STREAM(message);
其實這個宏的定義就把格式輸出包含到里面,其中各個宏的參數 message 可以處理 C++中標准輸出流(ostream)中的各種表達式,比如 std::cout。這包括在 int 或者 double 這種基本數據類型上使用插入操作符(<<),以及已經重載這個操作符的 復 合 數 據 類 型
0.2.2生成單次日志消息
生成單次消息,其實就是在程序中加入了一個靜態局部變量來檢測,進入一次后就把變量改為false則下次檢測到后則不輸出該信息。
// Don't do this directly. Use ROS_..._STREAM_ONCE instead. { static bool first_time = true ; if (first_time) { ROS_INFO_STREAM( "Here's some important information" <<" that will only appear once."); first_time = false; } }
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);
0.2.3生成頻率受控日志消息
參數 interval 是 double 類型的,它表示以秒為單位的時間量,這是相鄰日志消息出現的最小時間間隔。 ROS_..._STREAM_THROTTLE宏的每一個實例在第一次執行時都會生成日志消息(與不帶_THROTTLE 后綴版本宏的日志消息相同),隨后的執行都會被忽略,直到經過了指定的時間間隔。每個宏的實例的時間被單獨跟蹤,方法是使用一個局部靜態變量來存儲上一次生成日志的時間。
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);
0.3查看日志消息
0.3.1控制台輸出日志
0.3.2rosout輸出日志
除了在控制台上顯示,每一個日志消息都被發布到話題/rosout 上。該話題的消息類型是 rosgraph_msgs/Log
我們可以通過rostopic echo /rosout 來查看消息,也可以通過一個節點來訂閱日志話題還可以通過指令rqt_console來通過圖形界面來顯示日志消息。
0.3.3日志文件
日志消息的第三個,也是最后一個目的地,是由 rosout 節點生成的日志文件。作為/rosout 話題回調函數的一部分,該節點可以將日志消息作為一行寫入到一個日志文件,文件名類似於:~/.ros/log/run_id/rosout.log
有時日志過多時需要我們清除系統日志,利用指令rosclean check如果日志正在消耗過多的硬盤空間,可以通過下面的命令刪除所有已經存在的日志:rosclean purge
0.4日志啟用和禁用
0.4.1通過命令行設置日志級別
設置一個節點的日志級別,可以使用與以下類似的命令:rosservice call /node-name/set_logger_level ros.package-name level條命令調用 set_logger_level 服務,該服務由各個節點自動提供。
node-name 是你期望設置日志級別的節點名稱
package-name 正如你猜測的一樣,是擁有這個節點的功能包的名稱
level 參數是 DEBUG、INFO、WARN、ERROR、FATAL 中的一個89字符串,即為節點設置的日志級別。
例如,為了在示例程序中啟用 DEBUG 級別的消息,我們可以使用下面這條命令:
rosservice call /count_and_log/set_logger_level ros.agitr DEBUG
注意,由於這條命令直接與節點進行交互,我們不能在節點啟動之前使用它。如果一切正常,這個對 rosservice 的調用將輸出一個空行。
0.4.2通過圖形界面設置日志級別
可以嘗試以下命令:rqt_logger_level來通過圖形界面進行配置