• ROS中的日志(log)消息


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

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

    日志消息

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

    1

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

    1
    2
    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(致命):这些消息通常表示阻止节点继续运行的错误。

    2

    生成基本的日志消息

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

    1
    2
    3
    4
    5
    ROS_DEBUG_STREAM(message);  
    ROS_INFO_STREAM(message);
    ROS_WARN_STREAM(message);
    ROS_ERROR_STREAM(message);
    ROS_FATAL_STREAM(message);

    编写如下 C++ 进程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    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();
    }
    }

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

    3

    生成一次性日志消息

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

    1
    2
    3
    4
    5
    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 命令替换一下,得到如下的执行结果:

    4

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

    生成频率受控的日志消息

    1
    2
    3
    4
    5
    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 型,表示相邻日志消息出现的最小时间间隔,以秒为单位。得到如下的执行结果:

    5

    查看日志消息

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

    2

    启用和禁用日志消息

    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

    6

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

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

  • 相关阅读:
    小程序工程化探索:大规模场景下的问题和解决方案----------------引用
    对Taro Next小程序跨框架开发的探索与实践-----------------引用
    对Node.js 中的依赖管理------------引用
    对redux的研究--------引用
    JavaScript 中的 for 循环---------------引用
    对JavaScript 模块化的深入-----------------引用
    对Webpack 应用的研究-----------------引用
    webpack5持久化缓存
    设置x 轴斜体(每次我都百度,这次单独为它发一个)
    字典元组列表常用方法
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12014217.html
Copyright © 2020-2023  润新知