20
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ROS講座06 ROS Logger

Last updated at Posted at 2018-05-08

環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 20.04
ROS Noetic

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

printfデバッグはお手軽で有用な方法です。ROSでもprintfを使うことができますが、多数のROSノードが実行される状況では多数のノードのprintfが混ざってしまうために少々使いにくなります。
その代わりにROSではROS loggerという仕組みが用意されています。ターミナルで表示できるだけでなく、rqt_consoleというLogger情報を統合的に表示するツールもあります。このようなツールがあるためにROSではこのLoggerの仕組みを使い、通常のprintfは使いません。

ROS loggerをpublishするソースコード

ソースコード

loggerもprintfと使い方はほぼ変わらずROS_****("文字列", 引数, ...)という形になります。

basic_lecture/src/basic_logger.cpp
#include <string.h>
#include <ros/ros.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "basic_logger");
  ros::NodeHandle n;
  ros::Rate loop_rate(1);
  // if (ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug))
  // {
  //   ros::console::notifyLoggerLevelsChanged();
  // }

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

##launchファイル

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

CmakeListの設定

basic_lecture/CMakeLists.txtへの追加
add_executable(basic_logger src/basic_logger.cpp)

target_link_libraries(basic_logger
  ${catkin_LIBRARIES}
)

ビルド

cd ~catkin_ws
catkin build

実行

各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bashを実行する必要があります。

ノード単体での実行

1つ目のターミナル
roscore
2つ目のターミナル
rosrun basic_lecture basic_logger 

表示例

以下のように表示されます。
basic_logger1.png

Debugの表示方法

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

rosservice call /basic_logger/set_logger_level {"logger: 'ros', level: 'debug'"}

もしくはソースコード中に以下のように追記します(上のソースコードでコメントアウトされている部分でです)。

if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug) ) {
   ros::console::notifyLoggerLevelsChanged();
}

launch時でのROS logger

実行
roslaunch basic_lecture logger.launch

##表示
basic_logger2.png

この場合はError、Fatalのレベルしか表示されません。INFO、WARNINGのレベルも表示させたいい場合はタグの属性でoutput="screen"とします

rqt_console

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

rosrun rqt_console rqt_console

rqt_console.png

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

コメント

大規模でエラーの管理が難しくなるとprintfよりかは便利に使えるツールです。基本的に使うのはInfoとErrorの2つです。ノードを単体で動かしている時に見たいログをInfoで書き、機能に影響が起きるような状況が起きたらErrorでログを出力します。
5つのレベルがありますが、あまり厳格には使用方法は決まっていません。

参考

ROS wiki

目次ページへのリンク

ROS講座の目次へのリンク

20
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?