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的变量
测试使用
- 进入scripts目录,新建log_level.py
$ roscd beginner_tutorials/scripts
$ touch log_level.py
$ chmod +x log_level.py
$ rosed beginner_tutorials log_level.py
- 手工输入如下代码:
#!/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
- 运行代码
- 命令:
$ 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!
- 把系统的调试信息也显示出来了。
- 显示错误,通过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']
---
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号