< >
Home » ROS与Python入门教程 » ROS与Python入门教程-使用日志

ROS与Python入门教程-使用日志

ROS与Python入门教程-使用日志

说明

  • 介绍日志级别
  • 介绍日志API
  • 介绍日志使用

日志级别

  • 日志按严重程度,分为:DEBUG ,INFO ,WARN ,ERROR ,FATAL

  • DEBUG(调试) , 您永远不需要查看系统是否正常工作的信息。实例:

    • “收到来自来电者Y的主题X的消息”
    • “发送20个字节的套接字9”。
  • INFO(信息) ,少量的信息,可能是有用的用户。实例:

    • “节点初始化”
    • “在主题X上的广告与消息类型Y”
    • “新订阅的主题X:Y”
  • WARN(警告) , 用户可能会发现报警,并可能会影响应用程序的输出,但是该系统的预期工作的一部分。实例:

    • “无法从<路径>中加载配置文件>。使用默认值。”
  • ERROR(错误), 一些严重的,已经错了的信息。实例:

    • “没有收到关于主题X的更新10秒。直到X继续广播停止机器人。”
    • “在转换X中接收到的意外的南值……”
  • FATAL(致命),事情发生了不可恢复的。实例:

  • “电机着火了!”

日志API

  • 有几个函数,可以写入日志的:
rospy.logdebug(msg, *args)
rospy.logwarn(msg, *args)
rospy.loginfo(msg, *args)
rospy.logerr(msg, *args)
rospy.logfatal(msg, *args)
  • 这些函数跟日志等级是一对一对应的。

  • 有四个潜在的地方日志消息可能最终取决于详细级别:

    • stdout: loginfo
    • stderr: logerr, logfatal, logwarn (ROS 0.9)
    • your Node's log file: all
    • the /rosout Topic: loginfo, logwarn, logerr, logfatal
  • 注意:

    • 你的节点完全初始化前,您的信息将不会出现在/rosout话题,所以你可能看不到最初的消息。
    • 当你看到一个消息输出在stdout,不在“/rosout”,很可能是初始化未完成,或者你忘记调用rospy.init_node。
  • 节点日志文件一般位于 ROS_ROOT/log or ~/.ros/log,你可以可以通过 ROS_LOG_DIR 环境变量来更改它

  • 如果你想看到DEBUG信息,可以在初始化节点如:

rospy.init_node('my_node', log_level=rospy.DEBUG)
  • 每个rospy.log*()函数可以输入格式化的字符串内容,如:
rospy.logerr("%s returned the invalid value %s", other_name, other_value)
  • 逗号间隔多个对应%s的变量

测试使用

  1. 进入scripts目录,新建log_level.py
$ roscd beginner_tutorials/scripts
$ touch log_level.py
$ chmod +x log_level.py
$ rosed beginner_tutorials log_level.py
  1. 手工输入如下代码:
#!/usr/bin/env python

import rospy
from  std_msgs.msg import String

def log_level():

    debug ="Received a message on topic X from caller Y"
    rospy.logdebug("it is debug: %s", debug)

    info = "Node initialized"
    rospy.loginfo("it is info: %s", info)

    warn = "Could not load configuration file from <path>. Using defaults"
    rospy.logwarn("it is warn: %s", warn)

    error = "Received unexpected NaN value in transform X. Skipping..."
    rospy.logerr("it is error:%s", error)

    fatal = "Motors have caught fire!"
    rospy.logfatal("it is fatal: %s", fatal)


if __name__ == '__main__':

    try:
        rospy.init_node('log_level', log_level=rospy.DEBUG)
        log_level()
    except rospy.ROSInterruptException :
        pass
  1. 运行代码
  • 命令:
$ rosrun beginner_tutorials log_level.py 
  • 效果:
[DEBUG] [WallTime: 1478592313.625470] init_node, name[/log_level], pid[537]
[DEBUG] [WallTime: 1478592313.626043] binding to 0.0.0.0 0
[DEBUG] [WallTime: 1478592313.626711] bound to 0.0.0.0 37694
[DEBUG] [WallTime: 1478592313.627204] ... service URL is rosrpc://192.168.0.105:37694
[DEBUG] [WallTime: 1478592313.627458] [/log_level/get_loggers]: new Service instance
[DEBUG] [WallTime: 1478592313.662173] ... service URL is rosrpc://192.168.0.105:37694
[DEBUG] [WallTime: 1478592313.662577] [/log_level/set_logger_level]: new Service instance
[DEBUG] [WallTime: 1478592313.684361] it is debug: Received a message on topic X from caller Y
[INFO] [WallTime: 1478592313.684937] it is info: Node initialized
[WARN] [WallTime: 1478592313.685350] it is warn: Could not load configuration file from <path>. Using defaults
[ERROR] [WallTime: 1478592313.686025] it is error:Received unexpected NaN value in transform X. Skipping...
[FATAL] [WallTime: 1478592313.686388] it is fatal: Motors have caught fire!
  • 把系统的调试信息也显示出来了。
  1. 显示错误,通过rosout节点显示,要先监听节点,在执行log_level.py
  • 监听/rosout节点:
$ rostopic echo /rosout
  • 打开新终端,执行log_level.py节点
$ rosrun beginner_tutorials log_level.py 
  • 效果
$ rostopic echo /rosout
header: 
  seq: 1
  stamp: 
    secs: 1478592586
    nsecs: 482081890
  frame_id: ''
level: 16
name: /log_level
msg: it is fatal: Motors have caught fire!
file: log_level.py
function: log_level
line: 21
topics: ['/rosout']
---

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

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


标签: ros与python入门教程