たっきん(Twitter)です!
今日からROS通信の機能について紹介していこうと思います。
ROSアプリケーションは、ノードと呼ばれる実行可能な最小単位のプログラム同士がROS独自のメッセージ通信を介して接続されることで実現されます。
このメッセージ通信には、次の3種類が存在しますが、本記事では「トピック(Topic)」通信の機能に絞って解説していきます。
ROSメッセージ通信の種類
- トピック(Topic) ← 本記事で解説
- サービス(Service)
- アクション(Action)
トピック(Topic)通信
トピック(Topic)通信はあるノードから、別のノードへ一方向でメッセージを送信し続ける通信方式になります。
分かりやすく例えるなら、動画のライブストリーミング配信と同じ方式ですね!
ライブストリーミングは「配信者(パブリッシャー)」が「購読者(サブスクライバー)」に対して「動画データ」を定期的に送信する配信方法になります。
ライブストリーミング配信
トピック通信も仕組みは同じで、「送信側ノード(パブリッシャー)」が「受信側ノード(サブスクライバー)」に対して「Topicメッセージ」を定期的に送信し続けます。
トピック(Topic)通信
トピック通信は一方向にしかデータを送信できませんが、1対多数で通信ができるメリットがあります。
Topicメッセージ
トピック通信でデータを送信するときは「メッセージ」と呼ばれるデータ単位で送信されます。
この「メッセージ」は、.msg形式のファイルでデータ構造が定義されており、定義内容は、「データ型」と「変数名」のペアで構成されています。
# "int32"型、変数名"data"のメッセージ定義
int32 data
上記の例ですと、下記のようになります。
- データ型:int32
- 変数名:data
ROS2(Humble)で使用できるデータ型には上記以外にも実数型のfloatや、文字列型のstringなどがあります。
使用できるデータ型は下記リンクを参照してみてください。
ROSはこのメッセージ定義ファイルをもとに各プログラミング言語に対応したアクセスライブラリを自動生成します。
これにより、異言語で実装されたノード間でもメッセージ通信が可能になるわけです。
具体例を挙げて説明すると、送信側ノードはPythonで実装し、受信側ノードはC++で実装してもメッセージ通信が可能になるということです。
全てのノードを1つの言語に合わせて実装する必要がないこともROSのメリットの1つになります。
なんとなく、トピック通信のイメージを掴むことができましたでしょうか?
次のページから実際にトピックの送受信プログラムを書いて、動作を確認してみましょう!
コメント