< >
Home » ROS与C++入门教程 » ROS与C++入门教程-Logging(日志)

ROS与C++入门教程-Logging(日志)

ROS与C++入门教程-Logging(日志)

说明:

  • 介绍如何使用ROS日志系统

日志

  • ROS有自身的基于话题的机制,叫rosout, 用于记录节点的日志消息.
  • 日志信息是方便阅读的字符串内容,记录节点状态信息。
  • 查看实时消息最好的方式是通过rqt_console GUI程序(以前叫rxconsole)

日志语句

  • roscpp采用rosconsole包提供的客户端API。该API以一些ros_macros的形式:
  • rosconsole提供的日志语句的四种类型,5种不同的详细级别,用printf-和stream-style格式。

(1)基本版

  • ROS_DEBUG(...)
  • ROS_DEBUG_STREAM(args)
  • 基本版本只打印输出消息,即
#include <ros/console.h>
ROS_DEBUG("Hello %s", "World");
ROS_DEBUG_STREAM("Hello " << "World");
  • 基础版本输出到名叫"ros.<your_package_name>"的记录者。

(2)NAMED指定版

  • ROS_DEBUG_NAMED(name, ...)
  • ROS_DEBUG_STREAM_NAMED(name, args)
  • NAMED版本输出到日志,这允许您根据其名称配置启用/禁用的不同日志记录语句。例如:
#include <ros/console.h>
ROS_DEBUG_NAMED("test_only", "Hello %s", "World");
ROS_DEBUG_STREAM_NAMED("test_only", "Hello " << "World");
  • 它会输出到名叫"ros.<your_package_name>.test_only"的记录者。
  • 有关此信息的更多信息可在配置文件节中获得
  • 注意:不要使用可变值的变量作为名称。
  • 每个Named的日志存储在一个静态变量,使用宏来初始化。

(3)Conditional条件版

  • ROS_DEBUG_COND(cond, ...)

  • ROS_DEBUG_STREAM_COND(cond, args)

  • conditional版本当条件为真是否就会输出日志信息。

    #include <ros/console.h>
    ROS_DEBUG_COND(x < 0, "Uh oh, x = %d, this is bad", x);
    ROS_DEBUG_STREAM_COND(x < 0, "Uh oh, x = " << x << ", this is bad");

(4)Conditional Named指定条件版

  • ROS_DEBUG_COND_NAMED(cond, name, ...)
  • ROS_DEBUG_STREAM_COND_NAMED(cond, name, args)
  • 指定条件版结合上面两种类型:
#include <ros/console.h>
ROS_DEBUG_COND_NAMED(x < 0, "test_only", "Uh oh, x = %d, this is bad", x);
ROS_DEBUG_STREAM_COND_NAMED(x < 0, "test_only", "Uh oh, x = " << x << ", this is bad");

(5)Once [1.1+]

  • ROS_DEBUG_ONCE(...)
  • ROS_DEBUG_STREAM_ONCE(args)
  • ROS_DEBUG_ONCE_NAMED(name, ...)
  • ROS_DEBUG_STREAM_ONCE_NAMED(name, args)
  • 这些宏定义会激活时只输出一次
#include <ros/console.h>
for (int i = 0; i < 10; ++i)
{
  ROS_DEBUG_ONCE("This message will only print once");
}

(6)Throttle [1.1+]

  • ROS_DEBUG_THROTTLE(period, ...)
  • ROS_DEBUG_STREAM_THROTTLE(period, args)
  • ROS_DEBUG_THROTTLE_NAMED(period, name, ...)
  • ROS_DEBUG_STREAM_THROTTLE_NAMED(period, name, args)
  • 这些宏定义会定期输出日志信息
while (true)
{
  ROS_DEBUG_THROTTLE(60, "This message will print every 60 seconds");
}

(7)Delayed throttle

  • (added in Indigo as of rosconsole version 1.11.11)
  • ROS_DEBUG_DELAYED_THROTTLE(period, ...)
  • ROS_DEBUG_STREAM_DELAYED_THROTTLE(period, args)
  • ROS_DEBUG_DELAYED_THROTTLE_NAMED(period, name, ...)
  • ROS_DEBUG_STREAM_DELAYED_THROTTLE_NAMED(period, name, args)
  • 这些宏会按一定间隔延迟发送日志
while (!ros::service::waitForService("add_two_ints", ros::Duration(0.1)) && ros::ok())
{
  // This message will print every 10 seconds.
  // The macro will have no effect the first 10 seconds.
  // In other words, if the service is not available, the message will be 
  // printed at times 10, 20, 30, ...
  ROS_DEBUG_DELAYED_THROTTLE(10, "Waiting for service 'add_two_ints'");
}

(8)Filter [1.1+]

  • ROS_DEBUG_FILTER(filter, ...)
  • ROS_DEBUG_STREAM_FILTER(filter, args)
  • ROS_DEBUG_FILTER_NAMED(filter, name, ...)
  • ROS_DEBUG_STREAM_FILTER_NAMED(filter, name, args)
  • 过滤输出允许你使用自定义的过滤器,这些过滤器扩展自ros::console::FilterBase类,过滤器必需是指针类型。

日志级别

  • 五种不同的详细级别,为:

    • DEBUG
    • INFO
    • WARN
    • ERROR
    • FATAL
  • rosconsole可以让你禁用或启用特定的包和logger的详细级别。

  • 更多信息请查阅rosconsole

  • 默认的级别是INFO

输出

  • 根据不同级别,有四种潜在输出的日志的地方

(1)stdout

  • 激活后,DEBUG和INFO消息输出到stdout。
  • 注意:这可能不会发送的屏幕,依赖在roslaunch/XML/node输出参数。

(2)stderr

  • 激活后,WARN, ERROR 和 FATAL 消息输出到stderr。

(3)Node log file ,节点日志文件

  • 节点的所有内容都会记录的日志文件,在不改写ROS_HOME和ROS_LOG_DIR环境变量情况下,节点文件位于~/.ros/log。
  • 如果使用roslaunch,你可以用roslaunch-logs来设置日志目录。

(4)/rosout topic

  • 所有内容可以输出到/rosout 话题。
  • 注意:节点日志要完全启动消息才会发送,因此你可能不能看到初始化的信息。

Debug

Info

Warn

Error

Fatal

stdout

X

X

stderr

X

X

X

log file

X

X

X

X

X

/rosout

X

X

X

X

X

  • 注意,这个表不同于rospy

设置日志级别

  • 有三种方法设置日志级别:
  • 第一个是通过配置文件设置所有节点的日志级别
  • 第二个是在运行时,通过rqt_logger_level(以前叫rxloggerlevel)或rqt_console (以前叫rxconsole) 工具来设置日志级别
  • 第三个通过 rosconsole API来设置:
#include <ros/console.h>
if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug) ) {
   ros::console::notifyLoggerLevelsChanged();
}

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ROS与C++入门教程