このページの目的
前回までの中でROS2を使う基礎をてでを動かしながら学んで来ました。
ここからは下記のチュートリアルページを参考に、ROS2のノード・トピック・サービス・パラメータ・アクションの概要をまとめていきたいと思います。
●公式ページへのリンク
ノードやトピック それぞれの概念
##ROSノードとは?
私の認識では「ある機能を持ったプログラムの一つの塊」(つまりクラスや関数に近いイメージ)といった理解をしています。詳細はあっていないかもしれませんが、__大外しはしていない__と思っています。
この、ROSノードがROSネットワーク上にいくつか点在していて、そのノード間で決められたプロトコル(つまりトピックやサービスなど)を使って通信し、お互いの機能を実行するために必要な入力を受け取ったり、出力結果を渡したりしています。
##トピックとは
書籍等には非同期のデータ送信などと説明されていますが、端的に言うと一方的なデータ送信です。
ノードAからノードBに対して、ノードAの好みのタイミングで何かしらのデータを送りつける。そんな形のものです。
私自身のイメージで一番しっくりきているのは__「地上波のTV放送」__ です。
ノードA「テレビ局」はノードB「一般家庭のTV」に対して「こんなニュースがあったよ」とか「こんな食べ物が健康にいい?!」などの__情報__ を(利用者の需要に関係なく)ノードAが活性化中は絶えず送信しています。
トピックの場合、多少データが欠損していても問題ないようなデータ、重要度があまり高くないようなデータを蔵受信するのに向いていると思います。
##サービスとは
同期式のデータ通信とよく説明されています。
これは、あるノードがデータ送信の要請を出して、その要請に従う形で別のノードがその情報を要請元のノードに送付します。
私自身のイメージは__「電話で在庫を確認する」__シーンがしっくりきます。
ノードA「 ノードBさん、商品Xの在庫がいくつあるか教えて」
ノードB「 ノードAさん、現在の商品Xの在庫は100個ですよ」
ノードA「 OKありがとう」
こんな感じのやり取りをしています。
基本はあるタイミングの最新情報を確実に取得したいデータをやり取りするときに使うのがいいとおもっています。
例えば、現在の速度とか障害物の位置や大きさの様な安全のために必要なデータを取り扱う際に良いと思います。
##パラメータとは
ROSネットワークで共有される様なデータ(変数など)を指します。
個人的にはパブリックな変数に近いイメージを持っていまです。
ROS1では ROSCoreにのみパラメータサーバがあったのですが、
ROS2からは各ノードにパラメータサーバが用意された様です。
アクセスの仕方が違うようなので、今後トライしてみたいと思います。
##アクションとは
アクションはトピックとサービスのいいとこを組み合わせてできたハイブリッドな通信といったイメージです。
ある通信を実施した際、通信に引数と戻り値があります → サービスのイメージ。
ただし、画像認識のように処理時間が長くかかるような処理の場合、処理の進捗状況を知りたくなってきます。
なので、進捗状況などの途中経過でのデータを定期的に配信することができます。
私自身のイメージですが__「ソフトウエアインストール中の画面」__がしっくりきます。
ノードA「XXXXをインストールして!(引数)」
ノードB「はい、インストール開始します」
ノードB「1/N (YY%)インストール完了したよ」
ノードB「2/N (YZ%)インストール完了したよ」
・・・
・・・
ノードB「N/N (100%)インストール完了したよ」
ノードB「インストールすべて完了!(戻り値)」
実際はもうちょっと違うことをやってるのだと思うのですが
なんとなくこんな感じかなとおもったいます
##終わり
今回は、ROS2の通信の種類について整理していました。
次は実際に 簡単なソフトを書いて、各通信を試してみたいと思います。
※ もしかしたら先にGazeboをROS2で動かす方法の整理をするかもしれません。。。