ROS(Robot Operating System)を使う
安曇野の森から > 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のGUI画面が表示されます。
最初はブランクの画面が表示されます。
rqt_plotの「Topic:」テキストエリアにメッセージが発行されているトピック名「/sample/sin」を入力すると以下のようにメッセージで送られている値がサイン波としてグラフ表示されます。
ここでメッセージ送信サンプルプログラムを起動したターミナルへ戻って「Ctrl + C」キーで送信プログラムを止めるとrqt_plotのグラフ表示も受信側ターミナルの表示も止まります。