概要

printfデバッグはお手軽で有用な方法です。ROSでもprintfを使うことができますが、多数のROSノードが実行される状況では多数のノードのprintfが混ざってしまうために少々使いにくなります。
その代わりにROSではROS loggerという仕組みが用意されています。ターミナルで表示できるだけでなく、rqt_consoleというデバッグ情報を統合的に表示するツールもあります。このようなツールがあるために大規模なシステムではソフトウェア的なエラーメッセージはROS loggerを使います。
後々書きますが、ハードウェアの接続エラーには「diagnostics」という別の仕組みを使います。

単体でのRosloger

ソースコード

logger.cpp
#include "ros/ros.h"
#include <string.h>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "logger");
    ros::NodeHandle n;
    ros::Rate loop_rate(1);

    int count=0;
    while (ros::ok()){
        ROS_DEBUG("log:%i", count);
        ROS_INFO( "log:%i", count);
        ROS_WARN( "log:%i", count);
        ROS_ERROR("log:%i", count);
        ROS_FATAL("log:%i", count);

        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}```

## 実行
```shell:1つ目のターミナル
roscore
2つ目のターミナル
rosrun ros_lecture 

表示例

[ INFO] [1525732240.098944582]: log:0
[ WARN] [1525732240.098974515]: log:0
[ERROR] [1525732240.098999224]: log:0
[FATAL] [1525732240.099023751]: log:0

Debugの表示方法

初期設定ではDEBUGレベルのメッセージは表示されません。これを表示するようにするには以下をターミナルに打ち込むか、

rosservice call /(node_name)/set_logger_level ros.(package_name) (logger_level)

もしくはソースコード中に以下のように追記します。

#include <ros/console.h>
if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug) ) {
   ros::console::notifyLoggerLevelsChanged();
}

launch時でのROS logger

launchファイル

logger.launch
<launch>
  <node name="logger1" pkg="ros_lecture" type="logger" />
  <node name="logger2" pkg="ros_lecture" type="logger" />
</launch>

表示

[ERROR] [1525732240.098999224]: log:0
[ERROR] [1525732240.098999224]: log:0
[FATAL] [1525732240.099023751]: log:0
[FATAL] [1525732240.099023751]: log:0

この場合はError、Fatalのレベルしか表示されません。

rqt_console

上記のlaunchを動かしたまま以下のコマンドを実行します。

rosrun rqt_console rqt_console

rqt_console.png

このようなGUI画面が表示されます。真ん中の「Exlude Messages」で表示するloggerを選択できます。

参考

ROS wiki: http://wiki.ros.org/roscpp/Overview/Logging

目次ページへのリンク

ROS講座の目次へのリンク

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.