目的
トピックを用いた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
コマンドを実行しても何も出力されません.先ほど,新しく開いたウィンドウでキーボードから亀を動かしてください.何が表示されたでしょうか?下記は前進し,左回転した時の画面です.
出力された内容は人それぞれ異なりますが,キーボードで亀を動かした際に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を実行すると下記のようなウィンドウが表れます.
上記の例では,ノード/teleop_turtleからノード/turtlesimにトピック/turtle1/cmd_vel を配信していることを表しています.楕円はノード,矢印はトピックということがわかります.カーソルをノードやトピックに合わせると,関連するノードとトピックがカラー表示されます.青色は配信しているノード,緑色は購読しているノード,赤色はトピックを表します.このようにノードやトピックの関係性をグラフにより表すことで,それぞれの関係を容易に把握することができます.非常に便利なツールですので,是非とも有効活用してください.
課題
下記の4つの問題に取り組みなさい.
- ノードとトピックについて説明しなさい.
- 演習にて使用したrosnode,rostopicに関するコマンドを説明しなさい.
- rostopic hz,rostopic bwを使用し,トピックの通信量及び通信周期を調べなさい.
- パッケージturtlesimのノードturtlesim_nodeとノードturtle_teleop_keyを起動後,ターミナルにてトピック/turtle1/cmd_velを購読し,rqt_graphによりノード及びトピックの関係を確認しなさい.rqt_graphで表示されたグラフを必ずレポートに加え,グラフを用いてノードとトピック間の関係性を説明しなさい.その際に,不明なノードが起動している場合には,コマンドによりノードの情報を確認しなさい.
Q&A
-
- roscoreが立ち上がらない
ホームディレクトリの.bashrcの環境変数を設定していない可能性があります.bashrcを確認しましょう.設定していない場合には,下記のコマンドを実行してください.
- roscoreが立ち上がらない
$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc $ source ~/.bashrc