ROS中的日志(log)消息

学会使用日志(log)系统,做ROS大型项目的主治医生

通过显示进程的运行状态是好的习惯,但需要确定这样做不会影响到软件的运行效率和输出的清晰度。ROS 日志 (log) 系统的功能就是让进程生成一些日志消息,显示在屏幕上、发送到特定 topic 或者储存在特定 log 文档中,以方便调试、记录、报警等。下面简单介绍如何生成和查看日志消息。

日志消息

在ROS中,有一个特殊的话题叫作/rosout,它承载着所有节点的所有日志消息。/rosout消息的类型是rosgraph_msgs/Log:

rosgraph_msgs/Log消息用来让各个节点发布日志消息,这样一来就能让网络上的任何一个人都看到。可以认为/rosout是一个加强版的print():他不是向终端输出字符串,可以将字符串和元数据放到一个消息中,发送到网络上的任何一个人。ROS节点应该向/rosout发布日志消息,这样一来这些消息就能被所有人看到。rospy客户端提供了多个函数来发布rosgraph_msgs/Log消息:

12
if battery_voltage < 11.0:rospy.logwarn(‘Battery voltage low: %f‘%(battery_voltage))

rospy.logwarn()函数实现了三件事请:

  1. 输出一个格式化的字符串到终端
  2. 输出更详细的警告到日志文档中,这个文档一般在~/.ros/log中
  3. 构建并发布一条消息到/rosout话题,其中包括警告以及节点元数据

日志等级

ROS有5个日志记录标准级别,这些名称是输出信息的函数的一部分,他们遵循以下语法:
ROS_<LEVEL>[_<OTHER>]
每个消息级别用于不同的目的:

  • DEBUG(调试):只在调试时用,此消息不出现在部署的应用中,仅用于测试。
  • INFO(信息):标准消息,说明重要步骤或节点所正在执行的操作。
  • WARN(警告):提醒一些错误,缺失或者不正常,但进程仍能运行。
  • ERROR(错误):提示错误,尽管节点仍可在这里恢复,但对节点的行为设置了一定期望。
  • FATAR(致命):这些消息通常表示阻止节点继续运行的错误。

生成基本的日志消息

由五个 C++ 宏来产生日志消息,每个宏对应一个级别:

12345
ROS_DEBUG_STREAM(message);  ROS_INFO_STREAM(message);  ROS_WARN_STREAM(message);  ROS_ERROR_STREAM(message);  ROS_FATAL_STREAM(message);

编写如下 C++ 进程:

1234567891011121314151617181920212223
int (int argc,char **argv){   ros::init(argc,argv,"count_and_log");   ros::NodeHandle nh;   ros::Rate.rate(10);   for(int i=1;ros::ok();i++){      ROS_DEBUG_STREAM("Counted?to?"<<i);      if((i%3)==0){         ROS_INFO_STREAM(I<<"?is?divisible?by?3.");      }      if((i%5)==0){         ROS_INFO_STREAM(I<<大专栏  ROS中的日志(log)消息"string">"?is?divisible?by?5.");      }      if((i%10)==0){         ROS_INFO_STREAM(I<<"?is?divisible?by?10.");      }      if((i%20)==0){         ROS_INFO_STREAM(I<<"?is?divisible?by?20.");      }      rate.sleep();   }}

编译、执行之后结果如下:

生成一次性日志消息

ROS 提供了可以仅仅生成一次日志消息的宏:

12345
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);

将上述 C++ 进程中的 log 命令替换一下,得到如下的执行结果:

可以看到每个日志只生成了一次。

生成频率受控的日志消息

12345
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);

参数 interval 是 double 型,表示相邻日志消息出现的最小时间间隔,以秒为单位。得到如下的执行结果:

查看日志消息

日志消息有三个不同的输出目的地,包括屏幕、rosout topic、log 文档。其中发布到 rosout topic 的 msg 类型是 rosgraph_msgs/Log。除了 topic echo,还可以通过 rqt_console 查看日志消息:

启用和禁用日志消息

ROS 默认只处理 INFO 或者更高级别消息,DEBUG 级别的消息会被忽略。可以通过命令行设置显示的日志级别:
rosservice call /node-name/set_logger_level package-name level

其中:

  • set_logger_level服务由各个节点自动提供;
  • node-name 期望设置日志级别的节点名称;
  • package-name 拥有这个节点的 package 名称;
  • level 是五个级别中的一个。

另外也可以通过图形接口设置日志级别:
rqt_logger_level

图中列出了节点列表、日志记录器列表、日志级别列表。在图中操作与 rosservice 命令的效果一致。
另外,也可以在 C++ 进程中设置日志级别。ROS node 改变自身日志级别最直接的方式是使用 log4cxx 提供的接口:

1234
#include <log4cxx/logger.h>log4cxx::Logger::getLogger(ROSCONSOLE_DEFAULT_NAME)->setLevel(ros::console::g_level_lookup[ros::console::levels::Debug]);ros::console::notifyLoggerLevelsChanged();

其中 Debug 可以替换为 Info、Warn、Error、Fatal。

后记

对于大型ROS项目的调试必须要利用到日志系统,所有成熟的框架都为开发者提供了代码进程的调试工具,学会这些工具能够很大程度上帮助我们少走弯路节省时间,所以我们要能够利用这些辅助工具来作为开发过程中的左膀右臂,达到事半功倍的效果。

原文地址:https://www.cnblogs.com/lijianming180/p/12014217.html

时间: 2024-10-31 23:52:21

ROS中的日志(log)消息的相关文章

C++、Java、JavaScript中的日志(log)

编程思想之日志记录 什么是log? 相信你一定用日记写过点滴心事,或是用空间.微信.微博刷着动态,记录你每天的喜怒哀乐!在程序中也有一种类似的东西,记录着他主人(应用程序)每天的行踪,他叫日志(log).日记--是人类生活的记事本,日志(log)--是程序运行状况的记事本. 顾名思义,日志(log,后面均以log称之)就是用来记录程序每天的运行状况的,比如程序出现异常的情况,或是某个关键点,功某个重要的数据或交易等.这里的每天不是说每天一记,可以是伴随着程序运行的始终,只要程序在运行着就一直在记

spring boot中配置日志log和热部署

Java的日志有很多 个人强烈不推荐log4j ,推荐log4j2和logback 在高并发,多线程的环境下log4j1 的性能和log4j2相比可以用junk来形容  对就是junk.log4j2的异步模式表现了绝对的性能优势,优势主要得益于Disruptor框架的使用,logback比log4j1强但比log4j2弱.此外常规情况下logback要比log4j2的性能优越,毕竟logback是基于log4j的基础上优化的.LogBack和Log4J2是Log4j的改良版本,比Log4j拥有更

python中写日志log

import nnlog log = nnlog.Logger('test.log',level='error',backCount=5,when='D') #默认是debug级别最低的,默认保留5天的backCount when='D' # D H M S D=天,H=小时,M=分钟 S=秒 log.debug('返回结果...')#一些调试信息,看变量值这些log.info('info...') #一些提示信息log.warning('waring')#出警告了log.error('erro

对比几种在ROS中常用的几种SLAM算法

在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是:HectorSLAM,Gmapping,KartoSLAM,CoreSLAM和LagoSLAM.当然最后还有比较经典的google开源的cartographer,虽然不是基于ROS的但是大牛们已经将它修改为基于ROS的版本的cartographer_ros, ROS(Robot Operating

ROS学习之日志消息

转:https://www.cnblogs.com/flyingjun/p/8831455.html 1.ros调试信息,输出不同颜色字体 ROS学习之日志消息 ROS日志系统的核心思想,就是使程序生成一些简短的文本字符流,这些字符流便是日志消息. 0.1严重级别 ROS中,日志消息分为五个不同的严重级别,也可简称为严重性或者级别.按照严重性程度递增,这些级别有       DEBUG       INFO       WARN       ERROR       FATAL 0.2生成日志消息

mysql中slow query log慢日志查询分析

在mysql中slow query log是一个非常重要的功能,我们可以开启mysql的slow query log功能,这样就可以分析每条sql执行的状态与性能从而进行优化了. 一.慢查询日志 配置 开启慢查询日志 , 配置样例: /etc/mysql/my.cnf[mysqld]log-slow-queries 在 my.cnf 配置文件中增加上述配置项并重启 mysql 服务,这时 mysql 慢查询功能生效.慢查询 日志将写入参数 DATADIR (数据目录:/var/lib/mysql

Ubuntu中没有/var/log/messages日志

在Ubuntu中没有/var/log/messages,Ubuntu中对应的应该是/etc/rsyslog.conf和rsyslogd. 解决方法:用vim打开/etc/rsyslog.d/50-default.conf文件末尾增加一行内容如下:*.info;mail.none;authpriv.none;cron.none /var/log/messages然后保存:按ESC,然后:wq:在重启系统 ,然后查看.var/log/messages就有了

JAVA中自定义日志输出到指定文件

虽然JAVA日志包提供的功能已经很方便,但是假如我们有新的需求如:将日志文件保存到我们希望的位置并在日志文件名中添加日期且保存指定时间内的日志文件:按照自己希望的格式输出日志内容.对于这些需求我们只要扩展java.util.logging.StreamHandler(Handler的子类),java.util.logging.Formatter创建自定义的处理器及格式化器即可以实现.下面是个例子,它分别创建了Handler及Formatter的子类,以便实现将日志文件保存到我们需要的位置,及在日

java中的日志组件-log4j

1.为什么使用日志组件 Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT的事件记录器:还可以控制每一条日志输出格式.此外,通过定义日志信息的级别,能够非常细致地控制日志的输出,最令人感兴趣的是,这些功能可以通过一个配置文件来灵活进行配置,而不需要修改应程序代码. 在应用程序中输出日志有3个目的: 监视代码中变量的变化情况,把数据周期性记录到文件中供其他应用进行统计分析工作: 跟踪代码运行时轨迹,作