ROS中的日志log消息与ROS终端的不同颜色输出
Posted 非晚非晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS中的日志log消息与ROS终端的不同颜色输出相关的知识,希望对你有一定的参考价值。
文章目录
ROS自带了大量的能够输出调试信息的函数和宏,包括错误,警告等.它提供了如信息级别,条件触发消息和STL的流接口等方式。
1. 日志消息
ROS 日志 (log) 系统的功能就是让进程生成一些日志消息,显示在屏幕上(终端)、发送到特定 topic 或者储存在特定 log 文档中
,以方便调试、记录、报警等。向终端输出是最常见的一种方式,将会在第二节中讲解,下面来简要介绍其它两种方式。
1.1 rosout的日志
在ROS中,有一个特殊的话题叫作/rosout
,它承载着所有节点的所有日志消息。我们可以使用 rostopic echo /rosout
方法查看我们正在输出的一些日志。
/rosout
消息的类型是rosgraph_msgs/Log
,通过下列命令可以查看它的类型:
rosmsg show rosgraph_msgs/Log
输出:
byte DEBUG=1
byte INFO=2
byte WARN=4
byte ERROR=8
byte FATAL=16
std_msgs/Header header
uint32 seq
time stamp
string frame_id
byte level
string name
string msg
string file
string function
uint32 line
string[] topics
rosgraph_msgs/Log
消息用来让各个节点发布日志消息,这样一来就能让网络上的任何一个人都可以看到。
1.2 日志文件
日志消息另外一个目的地,是由 rosout 节点生成的日志文件。作为/rosout 话题回调函数的一部分,该节点可以将日志消息作为一行写入到一个日志文件,文件存放于:~/.ros/log/run_id/rosout.log
(一般在home目录下)
有时日志过多时需要我们 清除系统日志
,利用下列指令可以检查日志的大小。
#检查日志大小
rosclean check
在平时我们执行roscore
指令的时候,也会经常出现日志大于1G的报警信息,如下所示。
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
WARNING: disk usage in log directory [/home/user/.ros/log] is over 1GB.
It's recommended that you use the 'rosclean' command.
如果觉得日志消耗了过多的硬盘空间,可以通过下面的命令 删除所有已经存在的日志
。
#清理日志
rosclean purge
2. 日志等级
2.1 基础介绍
ROS有5个日志记录标准级别,这些名称是输出信息的函数的一部分,他们遵循以下语法:
ROS_<LEVEL>[_<OTHER>]
每个消息级别用于不同的目的,ROS消息的5个级别如下图所示。
它们对应五个C++宏来产生日志消息,如下所示:
ROS_DEBUG_STREAM(message);
ROS_INFO_STREAM(message);
ROS_WARN_STREAM(message);
ROS_ERROR_STREAM(message);
ROS_FATAL_STREAM(message);
我们经常也能看到不带_STREAM
的消息,它们的区别如下:
ROS_INFO(“INFO message %d”,k)
: 相当于c中的printf;ROS_INFO_STREAM ( "INFO message." <<k)
: 相当于c++中的cout;
2.2 举例
下面举例来看看这五个级别的输出。
#include <ros/ros.h>
#include <ros/console.h>
int main( int argc, char **argv )
ros::init( argc, argv, "rosdebug" );
ros::NodeHandle n;
ros::Rate rate( 1 );
while( ros::ok() )
ROS_DEBUG_STREAM( "DEBUG message." );
ROS_INFO_STREAM ( "INFO message." );
ROS_WARN_STREAM ( "WARN message." );
ROS_ERROR_STREAM( "ERROR message." );
ROS_FATAL_STREAM( "FATAL message." );
ROS_INFO("==========================================");
ros::spinOnce();
rate.sleep();
return 1;
输出如下,可以看到一般debug模式不输出。
2.3 设置日志级别
- 方法一:命令行调整日志级别
如果想让DEBUG模式的日志也输出,或者想要重新调整日志的级别,可以通过下列命令进行设置。
rosconsole set <node> <logger> <level>
例如:
rosconsole set rosdebugtest ros.rosdebugtest debug
- 方法二:图形化界面调整日志级别
通过命令,调出图像化界面进行设置
rosrun rqt_logger_level rqt_logger_level
调出界面后,通过选择Level进行调整。
用这种方式,简单直接明了!
- 方法三:编译时设置日志级别
由于编译时默认显示的是INFO级别,因此调试时为了看到Debug信息,需要在编译是设置调试级别。在 ros::init( argc, argv, “rosdebugtest” )
;后加入下面这一行就行。
ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME,ros::console::levels::Debug);
- 方法四:通过配置文件修改
通过打开下列文件,可以直接修改相应的输出等级。
vim /opt/ros/melodic/share/ros/config/rosconsole.config
默认的配置如下所示。
#
# rosconsole will find this file by default at $ROS_ROOT/config/rosconsole.config
#
# You can define your own by e.g. copying this file and setting
# ROSCONSOLE_CONFIG_FILE (in your environment) to point to the new file
#
log4j.logger.ros=INFO
log4j.logger.ros.roscpp.superdebug=WARN
3. ROS日志其它说明
3.1 单次输出
有时候在一个循环中,我们并不想每次都使用log,那么可以使用下列方法。
ROS_INFO_STREAM_ONCE("Output only once")
3.2 设置输出频率
当然我们也可以将ROS设置为多次循环输出一次内容
,方法如下:
ROS_INFO_STREAM_THROTTLE( 2, "INFO throttle message." );
上面表示每两次输出一次log。
4. ROS终端颜色输出
我们知道C++中的cout和printf能够向终端打印不同颜色的字体,同样的,ROS的消息输出机制也可以输出彩色信息,下面我们以ROS_INFO_STREAM为例,说明怎么向终端输出不一样的彩色文本。
下面说明了不同颜色的字体和背景的输出方式,
#include <ros/ros.h>
#include <ros/console.h>
int main(int argc, char **argv)
ros::init(argc, argv, "rosdebug");
ROS_INFO_STREAM("\\033[30m 黑色字 \\033[0m");
ROS_INFO_STREAM("\\033[31m 红色字 \\033[0m");
ROS_INFO_STREAM("\\033[32m 绿色字 \\033[0m");
ROS_INFO_STREAM("\\033[33m 黄色字 \\033[0m");
ROS_INFO_STREAM("\\033[34m 蓝色字 \\033[0m");
ROS_INFO_STREAM("\\033[36m 天蓝字 \\033[0m");
ROS_INFO_STREAM("\\033[37m 白色字 \\033[0m");
ROS_INFO_STREAM("\\033[40;37m 黑底白字 \\033[0m");
ROS_INFO_STREAM("\\033[41;37m 红底白字 \\033[0m");
ROS_INFO_STREAM("\\033[42;37m 绿底白字 \\033[0m");
ROS_INFO_STREAM("\\033[47;30m 白底黑字 \\033[0m");
ROS_INFO_STREAM("\\033[43;37m 黄底白字 \\033[0m");
ROS_INFO_STREAM("\\033[44;37m 蓝底白字 \\033[0m");
ROS_INFO_STREAM("\\033[45;37m 紫底白字 \\033[0m");
ROS_INFO_STREAM("\\033[46;37m 天蓝底白字 \\033[0m");
return 1;
会输出相应颜色的字体和背景,如下输出所示:
如果你的输出字体显示为问号,可以在打印方法之前,加入 下面任意一行代码
:
setlocale(LC_ALL, "");
setlocale(LC_CTYPE, "zh_CN.utf8");
其实它的 方法和C++中的cout和printf类似
,相应的还有另外一些指令可以控制输出的方式。
\\033[0m 关闭所有属性
\\033[1m 设置高亮度
\\033[4m 下划线
\\033[5m 闪烁
\\033[7m 反显
\\033[8m 消隐
\\033[30m -- \\33[37m 设置前景色
\\033[40m -- \\33[47m 设置背景色
\\033[nA 光标上移n行
\\033[nB 光标下移n行
\\033[nC 光标右移n行
\\033[nD 光标左移n行
\\033[y;xH设置光标位置
\\033[2J 清屏
\\033[K 清除从光标到行尾的内容
\\033[s 保存光标位置
\\033[u 恢复光标位置
\\033[?25l 隐藏光标
\\033[?25h 显示光标
以上是关于ROS中的日志log消息与ROS终端的不同颜色输出的主要内容,如果未能解决你的问题,请参考以下文章