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();
}
- 查阅rosconsole文档了解更多
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号