DDSの通信プロトコルRTPS実装の一つFreeRTPSを試す (3)
昨日(といっても日を跨いでいますが)、一昨日のブログ投稿は時間が不定期であったため、投稿に気づかれていない方もいるかもしれません。
本日の記事は、以下の記事の続きですので、話が見えない方は先にご覧ください。
土曜日はDockerfileのプルリクエストと格闘していました。 ようやく終わりが見えました。
FreeRTPS
のソースコード・リーディング
前回の記事でDDS、RTPSの仕様を見ましたので、FreeRTPS
のソースコードを読んで実装の実情を見ていきます。
frudp_publish_user_msg
ROSメッセージのPulibsherは内部でfrudp_publish_user_msg
関数を呼び出します。
出来上がったパケットはUDPで送信されています。
serialize_std_msgs__string
上記関数のpayload
引数は、RTPSのプロトコルに従ってシリアライズされます。 単純な文字列メッセージのTalker/Listner実装の
https://github.com/ros2/freertps/blob/master/apps/talker/talker.c
の場合、serialize_std_msgs__string
関数で文字列メッセージをシリアライズしています。
絶妙なポインタルールとmemcpy
関数によって、効率的に変換されてそうなことは見て取れますが、実際に何をどうやっているのかは良くわかりません。RTPSプロトコルに従ったバイナリ配列に変換されているのかと思われます笑
これ以上の詮索にはRTPSの仕様書をガチで読む必要がありそうです。
http://www.omg.org/spec/DDSI-RTPS/
Subscriber、デシリアライザの仕組みも同様です。
しかし、このシリアライザ、デシリアライザがROSメッセージの型定義に従って自動生成されるメカニズムは圧巻ですね。
結論
@OTLさん、いかがでしょうか? FreeRTPS
は確かにROSメッセージをRTPSプロトコルに従ってバイナリ配列にシリアライズしてUDPで送信しているというのが私の見解です。
Comments powered by Disqus.