ノード,トピックの理解

目的

トピックを用いたROSの通信方法を学びます.さらに,ROSのコマンドラインツールと簡易シミュレータであるturtlesimを用いて,ノードやトピックの概念,通信の仕組みを理解します.

ROSのコマンドラインを用いたトピック,ノードの理解

下記の手順によりROSを用いてロボットを動かします.今回は3まで行う予定です.

1. ノードの起動
2. トピックの確認
3. メッセージの確認
4. プログラミング

1. ノードの起動

まず,ノードやトピックを管理するマスターをroscoreにより立ち上げます.マスターの起動は必須です.

$ roscore

エラーが表示される場合にはこちらを参照してください.プロセスを終了する場合には,「cntl+c」を押します.

マスターが正常に起動したらROSを動かす準備が整いました.早速,ノードを起動しましょう.ノードの起動にはrosrunというコマンドを使用します.rosrunの書式は下記の通りです.

$ rosrun [package_name] [node_name]

上記をそのまま入力してもエラーとなるので注意してください.今回は,turtlesimパッケージに含まれるturtlesim_nodeノードを起動します.パッケージはソフトウェアを構成するプログラム及び関連ファイルの集合ノードはソフトウェアです.新たにターミナルを1つ立ち上げて,下記のコマンドを実行しましょう.ちなみに,tabキーによる補完が使用できるので,積極的に使用しましょう.

$ rosrun turtlesim turtlesim_node

エラーメッセージ「Failed to contact master at…」という出力が表示された場合には,マスターが起動できていない可能性があります.roscoreによってマスターを起動してから上記コマンドを実行しましょう.別ウィンドウで青い画面上に亀が表示されれば正常に起動しています.人によって亀の絵が異なりますが問題ありません.rosrunはノードを起動させるコマンドラインでした.確認のため,起動しているノードを見てみましょう.ROSのノードの情報を確認するためにはrosnodeを使用します.rosnodeのコマンドの情報を見てみましょう.

$ rosnode

rosnodeを起動すると,ノードの情報とコマンドの説明,使用例が出力されます.

yuu@VBUbuntu:~$ rosnode
rosnode is a command-line tool for printing information about ROS Nodes.

Commands:
	rosnode ping	test connectivity to node
	rosnode list	list active nodes
	rosnode info	print information about node
	rosnode machine	list nodes running on a particular machine or list machines
	rosnode kill	kill a running node
	rosnode cleanup	purge registration information of unreachable nodes

Type rosnode <command> -h for more detailed usage, e.g. 'rosnode ping -h'

起動しているノードを確認したいので,下記を実行します.

$ rosnode list

現在,起動しているノードの一覧が出力されます.

/rosout
/turtlesim

1行目はroscoreを起動した際に立ち上がるノードです.2行目は先ほどrosrunを用いて起動したノードです.rosoutは,標準ストリームに含まれる標準出力(stdout),標準エラー出力(stderr)と同等の機能です.詳細は次回以降の演習にて説明します.次に,turtlesim_nodeの情報を見てみましょう.

yuu@VB:~$ rosnode info /turtlesim
--------------------------------------------------------------------------------
Node [/turtlesim]
Publications:
 * /turtle1/color_sensor [turtlesim/Color]
 * /rosout [rosgraph_msgs/Log]
 * /turtle1/pose [turtlesim/Pose]

Subscriptions:
 * /turtle1/cmd_vel [unknown type]

Services:
 * /turtle1/teleport_absolute
 * /turtlesim/get_loggers
 * /turtlesim/set_logger_level
 * /reset
 * /spawn
 * /clear
 * /turtle1/set_pen
 * /turtle1/teleport_relative
 * /kill

contacting node http://VBUbuntu:35832/ ...
Pid: 2732
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound
    * transport: TCPROS

turtlesimノードが配信(Publication)と購読(subscription),さらにサービス(Services)を用いた幾つかの情報を受け渡ししていることが予想できます.配信,購読,サービスについて忘れた人はスライドを確認してください.ハイライトされた行は,配信と購読のトピック名及びメッセージ名を表しています.

* トピック名 [メッセージ名]

 

2. トピックの確認
ノードの情報が確認できました.次にトピックの情報を確認します.分かりやすく説明するために,もう一つノードを起動します.新しい端末を開き,下記のturtle_teleop_keyを実行してください.turtle_teleop_keyは,キーボードにより亀を動かすノードです.

$ rosrun turtlesim turtle_teleop_key

試しに,キーボードの方向キーを押してみてください.この時,上記のturtle_teleop_keyを起動した端末をアクティブにした状態でしか反応しないので注意してください.新たにノードを起動したので,起動しているノードは3つになっているはずです.先ほどの方法で確認してください.(分からない人は1.ノードの起動を復習してください.)

遠回りしましたが,ここからトピックのお話です.トピックの情報を確認にはrostopicを使用します.

$ rostopic

rostopicを起動すると,トピックの情報とコマンドの説明,使用例が出力されます.

yuu@VB:~$ rostopic
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
	rostopic bw	display bandwidth used by topic
	rostopic delay	display delay of topic from timestamp in header
	rostopic echo	print messages to screen
	rostopic find	find topics by type
	rostopic hz	display publishing rate of topic
	rostopic info	print information about active topic
	rostopic list	list active topics
	rostopic pub	publish data to topic
	rostopic type	print topic type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

通信しているトピックの一覧を確認したいので,下記を実行します.

$ rostopic list

現在,配信,購読しているトピックの一覧が出力されます.

yuu@VB:~$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

先ほどrosnode infoで確認したトピックの一覧が出力されました.それでは,トピックが配信,購読しているメッセージを見てみましょう.メッセージを確認するためにはrostopic echoを実行します.幾つかのトピックがアクティブですが,ここでは/turtlel/cmd_velが配信しているメッセージを見てみます.

$ rostopic echo /turtle1/cmd_vel

コマンドを実行しても何も出力されません.先ほど,新しく開いたウィンドウでキーボードから亀を動かしてください.何が表示されたでしょうか?下記は前進し,左回転した時の画面です.

ex_rostopic_cmd_vel

出力された内容は人それぞれ異なりますが,キーボードで亀を動かした際にlinear及びangularのx,y,zが出力されました.linearは並進速度,angularは角速度を表します.rostopic echoでは,購読しているトピックの内容を確認することができます.

ubuntuにて上記のような画面のスクリーンショットを得るためには,キーボードの「PrintScreen」を叩くか,もしくは下記のコマンドを実行してください.

$ gnome-screenshot

もし,画面の一部分のみを画像として保存したい場合には,端末にてgnome-screenshot -aと入力し,カーソルが十字になったことを確認した後に,画像として保存した領域をドラッグしましょう.

3. メッセージの確認

ノード間で通信するためには,お互いが同じメッセージ型で配信,購読しなければなりません.メッセージの型名から構成する変数群を調べましょう.まずは,メッセージの型名を確認します.

$ rostopic type /turtle1/cmd_vel

下記が出力されます.

geometry_msgs/Twist

メッセージの型名がわかりました.geometry_msgs/Twistというメッセージの型が,どのような変数から構成されるか確認します.メッセージの情報を確認するためにはrosmsgを使用します.

yuu@VB:~$ rosmsg
rosmsg is a command-line tool for displaying information about ROS Message types.

Commands:
	rosmsg show	Show message description
	rosmsg list	List all messages
	rosmsg md5	Display message md5sum
	rosmsg package	List messages in a package
	rosmsg packages	List packages that contain messages

Type rosmsg <command> -h for more detailed usage

ここでは,rosmsg showによりgeometry_msgs/Twistの情報を確認します.

$ rosmsg show geometry_msgs/Twist

下記が出力されます.

yuu@VB:~$ 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

linear及びangularは,それぞれ64ビットのfloat型の変数を3つ持っていることがわかります.linearは並進速度,angularは角速度を表します.

本日最後の内容です.実は,rostopicを用いてコマンドラインでトピックを配信することができます.それでは,トピックを配信して亀を動かしましょう.

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

亀が左回転しました.上記のコマンドがどのように働くかを説明する前に,rostopic pubのヘルプを見てみます.

yuu@VB:~$ rostopic pub -h
Usage: rostopic pub /topic type [args...]

Options:
  -h, --help            show this help message and exit
  -v                    print verbose output
  -r RATE, --rate=RATE  publishing rate (hz).  For -f and stdin input, this
                        defaults to 10.  Otherwise it is not set.
  -1, --once            publish one message and exit
  -f FILE, --file=FILE  read args from YAML file (Bagy)
  -l, --latch           enable latching for -f, -r and piped input.  This
                        latches the first message.

亀を動かした際に入力したコマンドを見ると,-1は1度メッセージを送って終了するオプション,/turtle1/cmd_velはトピック,geometry_msgs/Twistはメッセージ名,'[1.0, 0.0, 0.0]’ ‘[0.0, 0.0, 2.0]’はそれぞれ引数ということがわかります.ちなみに,連続して配信する場合には,オプションにrを加えます.

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

一連の手順でノード,トピック,メッセージの情報を獲得し,配信することでシミュレータ上の亀(ロボット)を動かすことができました.

ここまではコマンドを実行してノードやトピックの情報を獲得しました.まだノードやトピックの数が少ないため,それぞれの関係を整理できていると思います.しかし,ロボットを動かす場合には,数十のノードやトピックがを扱うこともあります.このような場合には,それぞれの関係を把握することが困難となります.そこで,ノードやトピックの関係性をグラフにより表現することができるrqt_graphという便利なツールが存在します.
roscore以外を全て終了させ,各端末で下記を実行しましょう.

$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
$ rosrun rqt_graph rqt_graph

rqt_graphを実行すると下記のようなウィンドウが表れます.

rqt_turtlesim

上記の例では,ノード/teleop_turtleからノード/turtlesimにトピック/turtle1/cmd_vel を配信していることを表しています.楕円はノード,矢印はトピックということがわかります.カーソルをノードやトピックに合わせると,関連するノードとトピックがカラー表示されます.青色は配信しているノード,緑色は購読しているノード,赤色はトピックを表します.このようにノードやトピックの関係性をグラフにより表すことで,それぞれの関係を容易に把握することができます.非常に便利なツールですので,是非とも有効活用してください.

課題

下記の4つの問題に取り組みなさい.

  1. ノードとトピックについて説明しなさい.
  2. 演習にて使用したrosnode,rostopicに関するコマンドを説明しなさい.
  3. rostopic hz,rostopic bwを使用し,トピックの通信量及び通信周期を調べなさい.
  4. パッケージturtlesimのノードturtlesim_nodeとノードturtle_teleop_keyを起動後,ターミナルにてトピック/turtle1/cmd_velを購読し,rqt_graphによりノード及びトピックの関係を確認しなさい.rqt_graphで表示されたグラフを必ずレポートに加え,グラフを用いてノードとトピック間の関係性を説明しなさい.その際に,不明なノードが起動している場合には,コマンドによりノードの情報を確認しなさい.
Q&A

    • roscoreが立ち上がらない
      ホームディレクトリの.bashrcの環境変数を設定していない可能性があります.bashrcを確認しましょう.設定していない場合には,下記のコマンドを実行してください.
$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc