(訳注:最新の情報は原文を参照してください.)
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のグラフの概念を知り,roscore,rosnodeとrosrunなどのコマンドラインツールの使い方を学びます.Tutorial Level: BEGINNER
Next Tutorial: ROSトピックの理解
Contents
準備: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についてさらに情報が得られます.ここでは以下のようにrosoutが rosout_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 のウィンドウが表示されます:
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 で自由に停止できます.