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 显示光标
  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QLeelq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值