ROS学习之日志消息
ROS學(xué)習(xí)之日志消息
ROS日志系統(tǒng)的核心思想,就是使程序生成一些簡(jiǎn)短的文本字符流,這些字符流便是日志消息。
0.1嚴(yán)重級(jí)別
?????? ROS中,日志消息分為五個(gè)不同的嚴(yán)重級(jí)別,也可簡(jiǎn)稱為嚴(yán)重性或者級(jí)別。按照嚴(yán)重性程度遞增,這些級(jí)別有
?????? DEBUG
?????? INFO
?????? WARN
?????? ERROR
?????? FATAL
0.2生成日志消息
0.2.1簡(jiǎn)單日志消息
???? 生成簡(jiǎn)單的日志消息,總共有五個(gè)基本的 C++宏用來產(chǎn)生日志消息,其中每個(gè)宏對(duì)應(yīng)一個(gè)嚴(yán)重級(jí)別:
???? ROS_DEBUG_STREAM(message);
???? ROS_INFO_STREAM(message);
?? ? ROS_WARN_STREAM(message);
?? ? ROS_ERROR_STREAM(message);
?? ? ROS_FATAL_STREAM(message);
???? 其實(shí)這個(gè)宏的定義就把格式輸出包含到里面,其中各個(gè)宏的參數(shù) message 可以處理 C++中標(biāo)準(zhǔn)輸出流(ostream)中的各種表達(dá)式,比如 std::cout。這包括在 int 或者 double 這種基本數(shù)據(jù)類型上使用插入操作符(<<),以及已經(jīng)重載這個(gè)操作符的 復(fù) 合 數(shù) 據(jù) 類 型
?
?
0.2.2生成單次日志消息
???? 生成單次消息,其實(shí)就是在程序中加入了一個(gè)靜態(tài)局部變量來檢測(cè),進(jìn)入一次后就把變量改為false則下次檢測(cè)到后則不輸出該信息。
// 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生成頻率受控日志消息
???? 參數(shù) interval 是 double 類型的,它表示以秒為單位的時(shí)間量,這是相鄰日志消息出現(xiàn)的最小時(shí)間間隔。 ROS_..._STREAM_THROTTLE宏的每一個(gè)實(shí)例在第一次執(zhí)行時(shí)都會(huì)生成日志消息(與不帶_THROTTLE 后綴版本宏的日志消息相同),隨后的執(zhí)行都會(huì)被忽略,直到經(jīng)過了指定的時(shí)間間隔。每個(gè)宏的實(shí)例的時(shí)間被單獨(dú)跟蹤,方法是使用一個(gè)局部靜態(tài)變量來存儲(chǔ)上一次生成日志的時(shí)間。
???? 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控制臺(tái)輸出日志
?
0.3.2rosout輸出日志
??? 除了在控制臺(tái)上顯示,每一個(gè)日志消息都被發(fā)布到話題/rosout 上。該話題的消息類型是 rosgraph_msgs/Log
??????? 我們可以通過rostopic echo /rosout 來查看消息,也可以通過一個(gè)節(jié)點(diǎn)來訂閱日志話題還可以通過指令rqt_console來通過圖形界面來顯示日志消息。
?
0.3.3日志文件
?? 日志消息的第三個(gè),也是最后一個(gè)目的地,是由 rosout 節(jié)點(diǎn)生成的日志文件。作為/rosout 話題回調(diào)函數(shù)的一部分,該節(jié)點(diǎn)可以將日志消息作為一行寫入到一個(gè)日志文件,文件名類似于:~/.ros/log/run_id/rosout.log
??????? 有時(shí)日志過多時(shí)需要我們清除系統(tǒng)日志,利用指令rosclean check如果日志正在消耗過多的硬盤空間,可以通過下面的命令刪除所有已經(jīng)存在的日志:rosclean purge
?
0.4日志啟用和禁用
?
0.4.1通過命令行設(shè)置日志級(jí)別
??????? 設(shè)置一個(gè)節(jié)點(diǎn)的日志級(jí)別,可以使用與以下類似的命令:rosservice call /node-name/set_logger_level???? ros.package-name ? ? level條命令調(diào)用 set_logger_level 服務(wù),該服務(wù)由各個(gè)節(jié)點(diǎn)自動(dòng)提供。
??????? node-name 是你期望設(shè)置日志級(jí)別的節(jié)點(diǎn)名稱
??????? package-name 正如你猜測(cè)的一樣,是擁有這個(gè)節(jié)點(diǎn)的功能包的名稱
??????? level 參數(shù)是 DEBUG、INFO、WARN、ERROR、FATAL 中的一個(gè)89字符串,即為節(jié)點(diǎn)設(shè)置的日志級(jí)別。
?????? 例如,為了在示例程序中啟用 DEBUG 級(jí)別的消息,我們可以使用下面這條命令:
?????? rosservice call /count_and_log/set_logger_level ros.agitr DEBUG
?????? 注意,由于這條命令直接與節(jié)點(diǎn)進(jìn)行交互,我們不能在節(jié)點(diǎn)啟動(dòng)之前使用它。如果一切正常,這個(gè)對(duì) rosservice 的調(diào)用將輸出一個(gè)空行。
0.4.2通過圖形界面設(shè)置日志級(jí)別
?????? 可以嘗試以下命令:rqt_logger_level來通過圖形界面進(jìn)行配置
?
轉(zhuǎn)載于:https://www.cnblogs.com/flyingjun/p/8831455.html
總結(jié)
以上是生活随笔為你收集整理的ROS学习之日志消息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 端口扫描
- 下一篇: luogu P2241 统计方形