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