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

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: このチュートリアルはrostopicrqt_plotなどのコマンドとともに,ROSのtopicについて学びます.

Tutorial Level: BEGINNER

Next Tutorial: ROS サービスとパラメータについて理解する

セットアップ

roscore

roscore が起動していることを,新しいターミナルで確認しましょう:

$ roscore

もし先ほどのチュートリアルで起動している roscore を残していたら,次のエラーメッセージが出ます:

  • roscore cannot run as another roscore/master is already running. 
    Please kill other roscore/zenmaster processes before relaunching

これは正しい挙動です.roscore はただ1つしか起動できません.

turtlesim

このチュートリアルでも,turtlesim を使います.新しいターミナルで起動してください:

$ rosrun turtlesim turtlesim_node

キーボードによる亀(turtle)の操作

亀の動きを操作するものが必要です.新しいターミナルで以下を起動してください.

$ rosrun turtlesim turtle_teleop_key

  • [ INFO] [1412519294.247868693]: Starting turtlesim with node name /turtlesim
    [ INFO] [1412519294.251346604]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
    
    Reading from keyboard
    ---------------------------
    Use arrow keys to move the turtle.

これで亀の動きをキーボードの矢印キーで操作することができるようになりました.もし亀を操作できなければ,turtle_teleop_key のウィンドウを選択して押したキーが認識されていることを確認してください.

  • ROS/Tutorials/UnderstandingTopics/turtle_key.png

亀の動きが操作できるようになったところで,この舞台裏で行われていることを見ていきましょう.

ROS トピック

turtlesim_nodeturtle_teleop_key のノードはお互い ROS トピックを介して通信しています.turtle_teleop_key は押されたキーをトピックに配信しています.そのとき,turtle_sim は同じトピックを購読することで,押されたキーを受け取っています.起動中のノードとトピックを表示する新しいツール, rqt_graph を使ってみましょう.

Note:`electric`, もしくはさらに古いバージョンを使用している場合, rqtは提供されていません. 代わりに, rxgraphを使用してください.

rqt_graphを使う

rqt_graph はシステム進行状況・挙動を示す,動的なグラフを生成します.rqt_graph は rqt_tools パッケージの一部です.ただし, インストールしていない場合, 下記のコマンドを実行してインストールしてください:

  • $ sudo apt-get install ros-<distro>-rqt
    $ sudo apt-get install ros-<distro>-rqt-common-plugins

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

新しい端末を開いて:

$ rosrun rqt_graph rqt_graph

…とすると, このように表示されます:

rqt_graph_turtle_key_hydro.png

/turtle1/cmd_velにマウスカーソルを重ねると, ROSのノードやトピックがハイライトされます(ここでは, ノードが青と緑, トピックが赤). 見てわかるように, turtlesim_nodeturtle_teleop_keyのノードが/turtle1/cmd_velと命名されたトピック上で通信しています.

rqt_graph_turtle_key2_hydro.png

rostopicについて

rostopic ツールで ROS トピックについての情報を得ることができます.

rostopic のヘルプのオプションで、rostopicに存在するサブコマンドを調べることができます.

$ rostopic -h
  • rostopic bw     トピックで使用されている帯域を表示する
    rostopic echo   スクリーンにメッセージを出力する
    rostopic find   メッセージの型からトピックを探す
    rostopic hz     トピックの配信頻度を表示する
    rostopic info   アクティブなトピックについての情報を出力する 
    rostopic list   アクティブなトピックをリスト表示する
    rostopic pub    トピックへデータを配信する
    rostopic type   トピックの型を出力する

turtlesimについて調べるために,これらのトピックのサブコマンドを使ってみましょう.

rostopic echo を使う

rostopic echo はトピックから配信されているデータを表示します.

使い方:

rostopic echo [topic]

turtle_teleop_key ノードが配信している /turtle1/cmd_vel トピックのデータを見てみましょう.新しいターミナルで以下を実行してください:

$ rostopic echo /turtle1/cmd_vel

もしかしたら,何も見えないかもしれません.それはトピックにデータが配信されていないからです.矢印キーを押して,turtle_teleop_key にデータを配信させてみましょう.もう一度 turtle_teleop_key のターミナルを選択しないと,亀は動かないことを忘れないでください.

上矢印キーを押すと,次のように表示されるでしょう:

  • ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0
    ---
    linear: 2.0
    angular: 0.0

もしくは, hydroでは:

linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---
linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

rostopic echoturtle1/cmd_vel トピックを購読していることを確認するために,もう一度 rqt_graph を見てみましょう. rostopic echoで確認できるように, ここでは赤でturtle1/cmd_velトピックが購読されていることが示されています.

rqt_graph_echo_hydro.png

rostopic list を使う

rostopic list は現在購読・配信されている全トピックのリストを返します.

list サブ-コマンドに必要な引数を確かめましょう.新しいターミナルでこちらを実行します:

$ rostopic list -h
  • Usage: rostopic list [/topic]
    
    Options:
      -h, --help            show this help message and exit
      -b BAGFILE, --bag=BAGFILE
                            list topics in .bag file
      -v, --verbose         list full details about each topic
      -p                    list only publishers
      -s                    list only subscribers

rostopic listverbose オプションを使用します:

$ rostopic list -v

これは配信・購読されている,トピックとその型についての詳細なリストを表示します.

  • Published topics:
     * /turtle1/color_sensor [turtlesim/Color] 1 publisher
     * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
     * /rosout [rosgraph_msgs/Log] 2 publishers
     * /rosout_agg [rosgraph_msgs/Log] 1 publisher
     * /turtle1/pose [turtlesim/Pose] 1 publisher
    
    Subscribed topics:
     * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
     * /rosout [rosgraph_msgs/Log] 1 subscriber

ROS メッセージ

ノード間でのROS メッセージの送信により, トピック上での通信が生じます.配信者(turtle_teleop_key)と購読者(turtlesim_node)が通信するためには,配信者と購読者は同じのメッセージを送受信する必要があります.これは, トピックのがそのトピック上に配信されるメッセージのにより定義されるということを意味します. トピック上で送信されるメッセージのrostopic typeで確認することができます.

rostopic type の使い方

rostopic type は配信されているあらゆるトピックのメッセージ型を返します.

使い方:

rostopic type [topic]

試してみましょう(非hydro):

$ rostopic type /turtle1/command_velocity

以下のように表示されます:

  • turtlesim/Velocity

hydroでは, こちらを試します:

$ rostopic type /turtle1/cmd_vel

以下のように表示されます:

  • geometry_msgs/Twist

rosmsg を使用してメッセージの詳細を見ることができます(非hydro):

$ rosmsg show turtlesim/Velocity
  • float32 linear
    float32 angular

hydroでは:

$ rosmsg show geometry_msgs/Twist
  • geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z

これでturtlesimが要求するメッセージの型が分かり, turtleにコマンドを配信できるようになります:

その他のrostopic サブコマンド

前項でROS のメッセージについて学んだので、メッセージを使った rostopicのサブコマンド を使用してみましょう.

rostopic pub を使う

rostopic pub は現在立ちあがっているトピックへデータを配信します.

使い方:

rostopic pub [topic] [msg_type] [args]

例(非hydro):

$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8

hydroの例:

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

上記のコマンドでは turtlesim に直線速度 2.0 角速度 1.8 で移動するように指令する単一のメッセージを送信します.

  • ROS/Tutorials/UnderstandingTopics/turtle(rostopicpub).png

これはやや複雑な例なので, それぞれの引数の詳細を見てみましょう.

  • rostopic pub
    このコマンドは与えられたトピックへメッセージを配信します.
  •  -1 
    (dash-one) このオプションで rostopic は1つのメッセージを配信した後に終了させます.
  • /turtle1/cmd_vel
    これは配信するトピックの名前です.
  • geometry_msgs/Twist
    これはトピックで配信する際に使用されるメッセージの型です.
  • --

    (double-dash) これは後の引数を表示させなくするためのオプションです.これは,例えばどれかの引数がダッシュ - (負数のような)に続いている場合に使用します.

  •  2.0 1.8 

    前述の通り,geometry_msgs/Twistメッセージは linearangular という2つの浮動小数点要素を持っています.この場合は,2.0linear(並進速度)で,1.8angular(角速度) になります.これらの引数の実際はYAML構文となっており, 詳細はYAML command line documentationに記述されています.

亀の動きが止まったのは,亀は動き続けるために定期的な 1 Hz のコマンドを必要とするからです.定期的なコマンドは rostopic pub -r コマンドを使用して配信することができます(非hydro):

$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8

hydroでは:

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

これは速度トピックに 1 Hz で速度のコマンドを配信します.

  • ROS/Tutorials/UnderstandingTopics/turtle(rostopicpub)2.png

何が起こっているかは,rqt_graph でも見ることができます. rostopic pub node (ここでは赤色) が rostopic echo node (ここでは緑色) と通信しています:

rqt_graph_pub_hydro.png

亀を等速円運動させるためには,新しいターミナルで,turtlesim に配信されているデータを rostopic echo で見ることができます.

rostopic hz の使い方

rostopic hz は配信されたデータの更新頻度を調べます.

使い方:

rostopic hz [topic]

/turtle1/pose を配信して,turtlesim_node の速さがどれくらいか見てみましょう:

$ rostopic hz /turtle1/pose

以下のように表示されます:

  • subscribed to [/turtle1/pose]
    average rate: 59.354
            min: 0.005s max: 0.027s std dev: 0.00284s window: 58
    average rate: 59.459
            min: 0.005s max: 0.027s std dev: 0.00271s window: 118
    average rate: 59.539
            min: 0.004s max: 0.030s std dev: 0.00339s window: 177
    average rate: 59.492
            min: 0.004s max: 0.030s std dev: 0.00380s window: 237
    average rate: 59.463
            min: 0.004s max: 0.030s std dev: 0.00380s window: 290

turtlesim が turtle に配信するデータの更新頻度はおよそ 60 Hz だと言えます.トピックについての深い情報を得るために, rostopic typerosmsg show を結合して使うことができます(非hydro).

$ rostopic type /turtle1/command_velocity | rosmsg show

hydroでは:

rostopic type /turtle1/cmd_vel | rosmsg show

ここでは rostopic を使用してトピックを調査しました.他のツールも使用して,turtlesim が配信しているデータを見てみましょう:

rqt_plot の使い方

注意: electric, もしくは, それ以前のディストリビューションを使用している場合, rqtが提供されていません. 代わりに, rxplotを使用しましょう.

rqt_plot はトピックで配信されているデータの時間図を表示します.ここでは rqt_plot/turtle1/pose トピックで配信されているデータに対して使ってみましょう. まず, このように入力して新しいターミナルでrqt_plotを起動します:

$ rosrun rqt_plot rqt_plot

新しいウインドウが立ちあがり, 左上隅のテキストボックスで図に任意のトピックを追加する機能が提供されます. /turtle1/pose/xと入力すると, 無効化されていた+ボタンがハイライトされます. そのボタンを押して, /turtle1/pose/yのトピックにも同じ手順を繰り返し行います. そうすると, 亀のxy座標位置がグラフ上に表示されます.

ROS/Tutorials/UnderstandingTopics/rqt_plot.png

-ボタンを押すと, グラフから特定のトピックを非表示にするメニューが表示されます. 今追加した両方のトピックを非表示にして, /turtle1/pose/thetaを追加すると, 次に図示するような結果が得られます.

ROS/Tutorials/UnderstandingTopics/rqt_plot2.png

これでこのセクションは終わりです.Ctrl-C を使って rostopic を kill しましょう.ただし,turtlesim は起動したままにしておいてください.

ここでは ROS トピックがどのように働くかを理解しました.次はサービスとパラメータを理解するを見てみましょう.

Wiki: ja/ROS/Tutorials/UnderstandingTopics (last edited 2015-10-13 13:18:25 by s_ktr)