安曇野の森から > ROS(Robot Operating System)を使う > メッセージ

メッセージ

他ノードに伝えたいデータはメッセージという形にパッキングして送信側ノードがトピック上に送信し、受信側ノードはノードに流れてくるメッセージのうち必要なもののみを拾い上げます。


コマンドによるメッセージ操作

以下ではメッセージを操作するコマンドについて説明します。


トピックにメッセージ送信

指定したトピックにメッセージを送信することが出来ます。




トピック上のメッセージ表示

指定したトピックに流れるメッセージを表示することが出来ます。




メッセージタイプの表示

指定したメッセージタイプの情報を表示することが出来ます。
メッセージタイプ名は「パッケージ名/タイプ名」で表されます。




全メッセージの表示

パッケージの全メッセージを表示します。




パッケージの全メッセージを表示します。




パッケージの全メッセージを表示します。




メッセージタイプ構造の表示

メッセージタイプの構造を表示します。




プログラムによるメッセージ送受信

以下のプログラムにより指定したトピックにメッセージを送受信することが出来ます。


メッセージ送信サンプルプログラム

以下はメッセージ送信するサンプルプログラムです。メッセージとして1Hzのサイン波のデータを送信します。




メッセージ送信サンプルプログラムの説明

次の2行はノードを作る際に、お約束で必ず呼び出さないといけないAPIです。

詳しくは「簡単なプログラムを作って動かしてみる」の「プログラムの簡単な説明」を見てください。



次のAPIでノードハンドルからパブリッシャーを生成します。

メッセージタイプはテンプレートでstd_msgs::Float64を指定しています。
std_msgs::Float64メッセージはメッセージ内にFloat64型アレイのdataが入っています。
1つ目の引数「test/sin」で発行先ノード名、2つ目の引数「1000」でキューサイズを指定しています。



次の1行目のAPIでstd_msgs::doubleメッセージを作成し、2行目のAPIで上記で生成したパブリッシャーからメッセージを発行します。




メッセージ受信サンプルプログラム

以下は上記メッセージ送信サンプルプログラムから送られたメッセージを受信し表示するサンプルプログラムです。




メッセージ受信サンプルプログラムの説明

メッセージ受信の場合、ros::spin()でメッセージ受信を待ち、メッセージを受信したら登録されているコールバック関数を呼び出すという仕組みになっています。

次のAPIでノードハンドルからサブスクライバを生成します。

1つ目の引数「test/sin」で受信元ノード名、2つ目の引数「1000」でキューサイズ、3つ目の引数「&messageCallBack」でメッセージ受信時のコールバック関数を指定しています。



次のプログラムでメッセージ受信時に呼ばれるコールバック関数を定義しています。

コールバック関数では受信したメッセージmsgからデータmsg.dataを取り出して表示しています。




送受信プログラムのビルド

上記、送信プログラムをpub_test.cpp、受信プログラムをsub_test.cppとして~/sample_ws/src/sample/srcディレクトリへ保存します。
次に~/sample_ws/sample/CMakeLists.txtに以下の4行を追加します。



~/sample_wsへディレクトリへ戻って以下のコマンドでビルドを実行します。




送受信プログラムの実行と表示

新しくターミナルを開き、ワークスペースへ移動して以下のようにマスターを実行します。



新しくターミナルを開き、ワークスペースへ移動して以下のようにメッセージ受信サンプルプログラムを実行するとターミナルには以下のように表示された後、メッセージ受信待ちになり何も表示されません。



新しくターミナルを開き、ワークスペースへ移動して以下のようにメッセージ送信サンプルプログラムを実行するとターミナルには以下のように20Hz→0.05秒毎に計算されたサイン値が繰り返し表示されます。



この時、メッセージ受信側ターミナルにも以下のように0.05秒毎に受信されたサイン値が繰り返し表示されるようになります。



rqt_plotによるグラフ表示

新しくターミナルを開き、ワークスペースへ移動して以下のようにrqt_plotを実行すると以下のようなrqt_plotのGUI画面が表示されます。



rqt_plotブランク画面

最初はブランクの画面が表示されます。


rqt_plotサイン画面

rqt_plotの「Topic:」テキストエリアにメッセージが発行されているトピック名「/sample/sin」を入力すると以下のようにメッセージで送られている値がサイン波としてグラフ表示されます。

ここでメッセージ送信サンプルプログラムを起動したターミナルへ戻って「Ctrl + C」キーで送信プログラムを止めるとrqt_plotのグラフ表示も受信側ターミナルの表示も止まります。




inserted by FC2 system