トピックの書き方
Last updated
Last updated
トピックの書き方 ←今ここ
ROSでは、使用するプログラム言語として主にPythonとC++が用いられますが、このチュートリアルではPythonを使用したいと思います。
ROSの通信方式は主にトピック、サービス、アクションの3つあります。この章では最も使用されることが多いトピックから説明していきます。
まず、トピックで使用されるパブリッシャ(publisher)とサブスクライバ(subscriber)ついて説明します。
この2つは、ノード間をトピックを介してデータをやり取りするときに使用され、 簡易的に説明するとこうなります。
パブリッシャ : データを配信
サブスクライバ : データを受け取る
やり取りするデータはメッセージの指定された型に入れ配信されます。
詳しくはROSでよく使用する用語を御覧ください。
メッセージは、標準パッケージのstd_msgsの他に、自分で定義することもできます。
それではパブリッシャとサブスクライバを書いていきましょう。
まずROSパッケージの作り方で作成したros_tutorial
に移動します。ディレクトリ移動にはroscd
という便利なコマンドがあります。このコマンドはどこからでも指定のパッケージに移動できます。
詳しくはよく使用するROSコマンドのroscdを御覧ください。
Pythonのプログラムはscriptsディレクトリの中で作成します。 scriptsディレクトリが無い場合は作成しましょう。
今回は、現在時刻を送るプログラムを書いていきます。
プログラム名はtime_pub.py
とします。
書いたプログラムには以下のコマンドを実行してください。
これはプログラムに実行権限を与えています。
Pythonの場合は、プログラムに対しchmod +x <プログラム名>
を行い、一度実行権限を与えれば、変更のたびにcatkin_make
は必要ありません。
Pythonでプログラムを書くときのお約束で、シバンといいます。
rospy
というモジュールをインポートしています。rospy
はPythonでROSを扱うときに使用します。
std_msgs
のFloat64
という型のメッセージをインポートしています。Float64
は浮動小数点変数の64ビットという意味です。
time_pub
というノードを定義しています。
UnixTime
というトピック名、Float64
というメッセージの型、queue_size
が1のパブリッシャを定義しています。queue_size
はバッファの数で、10 [Hz]周期でパブリッシュするときは1でも大丈夫です。10 [Hz]以上の周期でパブリッシュするときや複数のメッセージをパブリッシュするときは大きい値にするといいでしょう。
now = rospy.get_time()
はnow
という変数に現在のUnixTimeを代入しています。
pub.publish(now)
はnow
をパブリッシュしています。
シャットダウンされるまで10 [Hz] 周期で上記の2つを行っています。
次にサブスクライバを書きます。
サブスクライバはtime_sub.py
とします。
パブリッシャと同様に以下のコマンドを実行してください。
ここまでパブリッシャと同じです。
callback関数を定義しています。
message.data
というのは、Float64の中のdataを参照するという意味です。
Pythonではプログラムがインポートされた場合、関数を自動で実行してしまいますが、 このif文内に書いた関数は自動で実行されなくなります。
time_sub
というノードを定義しています。
サブスクライバの宣言をしています。
パブリッシャがUnixTime
という名前のトピック、Float64
という型で配信しているため、こちらも合わせる必要があります。
最後のcallback
は、受け取ったFloat64
型のデータを渡す関数を書く部分であり、今回はcallback関数に渡しています。
プログラムを終了させないようにしています。
それぞれ別のターミナルでそれぞれを起動します。
time_sub.py
を起動したとき、以下のように出力されたら正常に動作しています。
出力されているこの数値はUNIX時間というもので、 1970年1月1日午前0時0分0秒からの経過秒数になります。