LoginSignup
7

More than 1 year has passed since last update.

posted at

updated at

ROS講座06 ROS Logger

環境

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

項目
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講座の目次へのリンク

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
What you can do with signing up
7