1.日志级别

日志消息分为五个不同的严重级别宏,与Android的Log定义的严重级别类似,如下基础宏:



ROS_DEBUG_STREAM、ROS_INFO_STREAM、ROS_WARN_STREAM、ROS_ERROR_STREAM、ROS_FATAL_STREAM(按照严重程序级别排序,低到高)



C++代码:

#include <ros/ros.h>

int main(int argc, char** argv){

ros::init(argc, argv, "hello_ros");

ros::NodeHandle nh;

ROS_DEBUG_STREAM("Log DEBUG");

ROS_INFO_STREAM("Log INFO");

ROS_WARN_STREAM("Log WARN");

ROS_ERROR_STREAM("Log ERROR");

ROS_FATAL_STREAM("Log FATAL");

}


从运行结果来看,你会发现DEBUG没有打印出来,Why?淡定,4会解答

2.循环单次日志

基础宏后面添加_ONCE,代表日志在循环迭代中只有第一次才会打印日志:



C++代码:

#include <ros/ros.h>

int main(int argc, char** argv){

ros::init(argc, argv, "hello_ros");

ros::NodeHandle nh;

for(int i = 0; i < 10; i++){

ROS_INFO_STREAM_ONCE("Log info i = " << i);

if(i >= 2){

ROS_INFO_STREAM_ONCE("Log info i = " << i);

}

}

}


3.频率日志

基础宏后面添加_THROTTLE就变为了频率日志,入ROS_INFO_STREAM_THROTTLE(interval, message),第一个参数interval代表以秒为单位的时间量,时间量指的是两个日志出现的最小时间间隔



 

4.打开、关闭日志

1中提到DEBUG日志信息没有输出,原因是C++程序默认的日志级别为INFO,所有DEBUG日志被忽略掉了,那问题来了,如何打开DEBUG级别日志呢?



rosservice call /node-name/set_logger_level ros.package-name level
C++代码:
#include <ros/ros.h>
int main(int argc, char** argv){
ros::init(argc, argv, "hello_ros");
ros::NodeHandle nh;
while(ros::ok()){
ROS_DEBUG_STREAM("Log DEBUG");
ROS_INFO_STREAM("Log INFO");
ROS_WARN_STREAM("Log WARN");
ROS_ERROR_STREAM("Log ERROR");
ROS_FATAL_STREAM("Log FATAL");
}
}


启动上面节点,然后终端运行rosservice call /hello_ros/set_logger_level ros.hello DEBUG