Data-sharing (zero-copy) 配送¶
英語版が正です。この文書は 2026-09-22 時点の英語版に対応しています。
writer と reader が同じホストにあり、型が bounded (サイズ上限あり) なら、Fast DDS はすべての
transport を迂回できます。reader が writer の履歴を直接マップする data-sharing 配送です。
ツールはこれを SHM transport とは区別して DATA_SHARING と表示します。
ROS 2 ノードが広告するもの¶
rmw_fastrtps_cpp は既定ですべてのエンドポイントに data-sharing OFF を広告するため、ROS 2 の
トピックは通常 SHM になり、DATA_SHARING にはなりません。Fast DDS は AUTO を型の boundedness
と履歴メモリポリシーに基づいて discovery の 前 に解決するので、ツールが広告 QoS で見るのは
実効的な設定です (std_msgs/String の writer は AUTO を指定しても OFF を広告します)。
bounded な型 (例: std_msgs/Int32) で有効にするには:
export FASTRTPS_DEFAULT_PROFILES_FILE=$(ros2 pkg prefix fastdds_transport_viz)/share/fastdds_transport_viz/config/datasharing_auto.xml
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
ros2 run fastdds_transport_viz bounded_pub &
ros2 run fastdds_transport_viz bounded_sub &
ros2 transport list -v # /bounded -> DATA_SHARING? (likely)
既定プロファイルには ON ではなく AUTO (XML では <kind>AUTOMATIC</kind>。どの Fast DDS でも
通る綴り) を使ってください。ON だと /rosout のような
unbounded な型で writer の作成が失敗します。
確信度¶
両エンドポイントが data-sharing を広告し、domain id に共通部分があれば (または少なくとも片方が
domain id を広告していなければ)、判定は likely (DATA_SHARING?) です。ただし例外が 2 つあります。
- writer と reader が別々の IPC 名前空間にある場合
(#110): Fast DDS はそれでも QoS だけで
両者をペアにしますが、reader は writer の履歴を開けず、何も届きません。ツールがそれを判別できる
とき (両方が SHM を持ち IPC 名前空間の分断 の SHM の
証拠がある場合、または 2 つの data-sharing セグメントの片方だけがツールの
/dev/shmにある場合。datasharing-reader-segment-not-visible/datasharing-writer-segment-not-visible) は、判定はNONE(certain) で警告shm-ipc-namespace-splitが付き、--statsでも変わりません (配送の 証明があればshm-ipc-namespace-split-but-deliveredが加わります)。 - writer と reader が同じプロセスにある場合
(#201): Fast DDS はサンプルを
data-sharing セグメント経由ではなくプロセス内で受け渡すので、理由は
datasharing-unverified-by-trafficではなくintra-processになり、判定はcertainになりません。 パケットもDATA_COUNTもセグメント経由の配送も無いので、確かめようがないためです。writer の participant から reader へのパケットが実測されたときだけintra-processの理由が外れ、以下の 規則が適用されます。
それ以外では、--stats を付けると次の 2 通りで certain になります。
HISTORY_LATENCYが配送を証明し、かつ reader の locator にパケットが 1 つも届いていない (datasharing-confirmed-no-traffic)。HISTORY_LATENCYが配送を証明し、かつ観測中に writer のDATA_COUNTが増えていない (datasharing-confirmed-no-data-submessages)。reliable な data-sharing エンドポイントは SHM 上で heartbeat を交換し続けますが、zero-copy 配送は DATA サブメッセージを一切生成しないので、この カウンタで両者を区別できます。観測対象ノードのFASTDDS_STATISTICSにDATA_COUNT_TOPICが 必要です。
export FASTRTPS_DEFAULT_PROFILES_FILE=$(ros2 pkg prefix fastdds_transport_viz)/share/fastdds_transport_viz/config/datasharing_auto_stats.xml
export RMW_FASTRTPS_USE_QOS_FROM_XML=1
export FASTDDS_STATISTICS="RTPS_SENT_TOPIC;RTPS_LOST_TOPIC;HISTORY_LATENCY_TOPIC;PHYSICAL_DATA_TOPIC;DATA_COUNT_TOPIC;RESENT_DATAS_TOPIC;HEARTBEAT_COUNT_TOPIC;ACKNACK_COUNT_TOPIC;NACKFRAG_COUNT_TOPIC;GAP_COUNT_TOPIC"
ros2 run fastdds_transport_viz bounded_pub &
ros2 run fastdds_transport_viz bounded_sub &
ros2 transport list -v --stats # /bounded -> DATA_SHARING (certain)
writer が data-sharing でない reader も相手にしている場合、その DATA_COUNT には両方の経路が
混ざるので判定は likely のままです (datasharing-ambiguous-mixed-readers)。別の IPC 名前空間にいる
data-sharing の reader (shm-ipc-namespace-split) には writer が DATA を送らないので、これには数えません。すべての reader が
data-sharing なのにカウンタが増える場合、Fast DDS は zero-copy を使っていません。判定は実測された
transport (reader へのパケットが帰属できなければ SHM?) に変わり、理由
datasharing-data-submessages-sent と警告 datasharing-not-used が付きます。DATA_COUNT_TOPIC が
無い場合、または HISTORY_LATENCY がまだ配送を証明していない場合、リンク上のトラフィックがあると
判定は likely のままです (datasharing-ambiguous-participant-traffic)。トラフィックも配送の証明も
無ければ datasharing-no-delivery-observed です。
JSON の measured オブジェクトには data_submessages (DATA_COUNT の増分。取得できなければ
null) と delivered_samples が入ります。
履歴のサイズ¶
data-sharing の writer は履歴を /dev/shm の fast_datasharing_<writer の GUID> というファイルに
置きます。ツールからそのファイルが見える (同じ IPC 名前空間) 場合、そのサイズを writer に紐付けて
JSON の datasharing_history_bytes と web viewer のエンドポイント詳細に出します。data-sharing の
エンドポイントのセグメント (writer の履歴、reader の通知ファイル) がそもそもそこにあるかは
datasharing_segment_visibility です (#163)。環境の共有メモリの
行はこうした履歴をすべて数えます (how-it-works.ja.md 参照)。
Fast DDS は writer が kill されてもこのファイルを消さないので、終了した writer の履歴は
fastdds shm clean を実行するまで unmatched として現れます。data-sharing の reader は通知セグメント
fast_datasharing_<reader の GUID> を作り、これは datasharing_notifications として数えます。writer の
履歴とその reader の通知セグメントの片方だけがツールの /dev/shm にあれば、2 つは別々の IPC 名前空間に
います (IPC 名前空間の分断 を参照)。