昨日(といっても日を跨いでいますが)、一昨日のブログ投稿は時間が不定期であったため、投稿に気づかれていない方もいるかもしれません。

本日の記事は、以下の記事の続きですので、話が見えない方は先にご覧ください。

土曜日は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で送信しているというのが私の見解です。