(訳注:最新の情報は原文を参照してください.)

Note: This tutorial assumes that you have completed the previous tutorials: ROSパッケージのビルド.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

ROSのノードを理解する

Description: このチュートリアルではROSのグラフの概念を知り,roscorerosnoderosrunなどのコマンドラインツールの使い方を学びます.

Tutorial Level: BEGINNER

Next Tutorial: ROSトピックの理解

準備:ros_tutorialsのインストール

このチュートリアルでは、チュートリアル用のシミュレータを使います。インストールしていない場合は, 下記のコマンドを実行してシミュレータをインストールしてください。

$ sudo apt-get install ros-<distro>-ros-tutorials

'<distro>'の部分は使用しているディストリビューションの名前(hydroやindigoなど)に置換します

グラフ概念についての,てっとり早いおさらい

  • ノード(Nodes): 1つのノードは ROS を使用して他のノードとやりとりします.

  • トピック(Topics): ノードはメッセージをトピックへ向けてPublish(配信)し,同様にSubscribe(購読)することでトピックからメッセージを受け取ることができます.

  • メッセージ(Messages): トピックへ配信したり購読したりするときの ROS のデータ型です.

  • マスター(Master):ROSのネームサービス(例えば,ノードがお互いを検索することを助けます)

  • rosout: ROS における stdout や stderr と同等の機能です.

  • roscore: マスター + rosout + パラメータ サーバ(パラメータ サーバについては後の章で紹介します)

ノード

ノードは ROS パッケージ内の実行ファイルに他なりません.ROS ノードは ROS クライアント ライブラリを使用して他のノードとやりとりします.ノードはトピックへ配信したり購読したりできます.ノードはサービスを提供したり,使用したりすることができます.

クライアント ライブラリ

ROS クライアント ライブラリは異なるプログラミング言語で記述されたノードがやりとりできるようにします.

  • rospy = Python クライアント ライブラリ
  • roscpp = C++ クライアント ライブラリ

roscore

roscore は ROS を使用する際に一番初めに起動させます.

起動してみましょう:

$ roscore

これに似たような表示がされるはずです:

  • ... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.
    
    started roslaunch server http://machine_name:33919/
    ros_comm version 1.4.7
    
    SUMMARY
    ========
    
    PARAMETERS
     * /rosversion
     * /rosdistro
    
    NODES
    
    auto-starting new master
    process[master]: started with pid [13054]
    ROS_MASTER_URI=http://machine_name:11311/
    
    setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf
    process[rosout-1]: started with pid [13067]
    started core service [/rosout]

もしroscoreが初期化されていないなら、ネットワークの設定に問題があるかもしれません。Network Setup - Single Machine Configurationを参照してください。

roscore が初期化されず, パーミッションの不足に関するメッセージが表示される場合, おそらく, ~/.ros フォルダの所有権が root にあるため, フォルダの所有権を再帰的に変更します:

$ sudo chown -R <your_username> ~/.ros

rosnode の使い方

新しいターミナルを開いて,roscore が何をしているのかを rosnode を使用して見てみましょう.

Note: 新しいターミナルを開くと環境がリセットされ, ~/.bashrc が読み込まれます. rosnode のようなコマンドの実行に問題がある場合, 何かしらの環境セットアップファイルを ~/.bashrc に追加するか, 手動で再読込しましょう.

rosnode は実行中の ROS ノードについての情報を表示します.rosnode list コマンドはアクティブなノードのリストを表示します:

$ rosnode list
  • このように表示されます:
  • /rosout

この表示から rosout という1つのノードのみが起動していることが分かります.このノードはノードのデバッグ出力を集めてログ化するために常に起動しています.

rosnode info コマンドは特定のノードについての情報を返します.

$ rosnode info /rosout

このコマンドで、rosoutについてさらに情報が得られます.ここでは以下のようにrosoutrosout_aggを発行していることが分かります.

  • --------------------------------------------------------------------------------
    Node [/rosout]
    
    Publications:
     * /rosout_agg [roslib/Log]
    
    Subscriptions:
     * /clock [unknown type]
     * /rosout [unknown type]
    
    Services:
     * /rosout/set_logger_level
     * /rosout/get_loggers
    
    contacting node http://foo.local:54614/ ...
    Pid: 5092

他のノードについても見てみましょう.そのためにまず、rosrun を使って別のノードを起動しましょう。

rosrun の使い方

rosrun はディレクトリのパッケージ名を使用して,パッケージに含まれるノードを(パッケージへのパスを知ることなく)起動します.

使い方:

$ rosrun [package_name] [node_name]

新しいターミナルで,turtlesim パッケージ内の turtlesim_node を起動します:

$ rosrun turtlesim turtlesim_node

turtlesim のウィンドウが表示されます:

  • ROS/Tutorials/UnderstandingNodes/turtlesim.png

Note: あなたの turtle_sim ウィンドウのturtleの表示はこれと違うかもしれませんが,心配ありません.いろいろなタイプのturtleが表示されますよ!

新しいターミナルで次のコマンドを実行すると:

$ rosnode list

このように表示されます:

  • /rosout
    /turtlesim

ROS の強力な特徴の1つとして,コマンドラインから名前を変更することができます.

rosrun turtlesim のウィンドウに戻って,ctrl-C でノードを停止します.そして再度turtlesimを起動しましょう,ただし今回はノードの名前を変えるために,リマップ引数(Remapping Arguments)を使用します.

rosrun turtlesim turtlesim_node __name:=my_turtle

ここで戻って rosnode list をすると:

$ rosnode list
  • このように表示されます:
  • /rosout
    /my_turtle

Note: /turtlesim が未だにリストに残っているのであれば, ウインドウを閉じるかわりにctrl-Cを使ってターミナルのノードを止めたか, ネットワークのセットアップ - Single Machine Configurationで説明されている $ROS_HOSTNAME 環境変数の定義が無いことを意味しているかもしれません. 次のコマンドでrosnodeのリストをクリアしてみましょう: $ rosnode cleanup

新しく /my_turtle ノードが見えます.別の rosnode コマンドの ping を使って,/my_turtleノードが起動中かチェックしてみましょう:

$ rosnode ping my_turtle
  • rosnode: node is [/my_turtle]
    pinging /my_turtle with a timeout of 3.0s
    xmlrpc reply from http://aqy:42235/     time=1.152992ms
    xmlrpc reply from http://aqy:42235/     time=1.120090ms
    xmlrpc reply from http://aqy:42235/     time=1.700878ms
    xmlrpc reply from http://aqy:42235/     time=1.127958ms

復習

ここで扱ったコマンドは:

  • roscore = ros+core : master (ROSのネームサービス) + rosout (stdout/stderr) + parameter server (パラメータサーバについては別の章で)
  • rosnode = ros+node : ノードについての情報を得る ROS ツール
  • rosrun = ros+run : 与えられたパッケージからノードを起動する

ここでは ROS ノードの働きについて理解しました.次はROS トピックの働きを見てみましょう.また,turtlesim_node は Ctrl-C で自由に停止できます.

Wiki: ja/ROS/Tutorials/UnderstandingNodes (last edited 2015-10-13 13:17:53 by s_ktr)