ROS 2

ROS 2のQoS設計入門:センサー通信と制御通信の信頼性・遅延をどう両立するか

センサーデータの継続的な流れと、期限管理を伴う制御指令を抽象的なノードと接続線で表したイメージ
目次

QoSは設定項目が多く、通信できない原因と遅延の原因が同じ場所に見えやすい点が気になります。

先に結論

ROS 2のQoSは、通信の種類ではなく「古いデータを待つべきか」「欠落を許せるか」「一定時間届かなければ停止すべきか」で決める。カメラ、LiDAR、IMUなどの高頻度センサーは、最新データを処理し続けることを優先し、まずはSensorDataQoS(KEEP_LAST、深度5、BEST_EFFORT、VOLATILE)を候補にする。一方、cmd_velのような制御指令は、受信側との互換性を確認したうえで、浅いキュー、RELIABLE、VOLATILEを出発点に検討する。ただし、再送による古い指令の到着を避けたい場合は、BEST_EFFORTや短いLIFESPANの方が適することもある。

RELIABLEを設定するだけでハードリアルタイム性や安全性が得られるわけではない。DEADLINE、LIFESPAN、受信タイムアウト、ウォッチドッグを、アプリケーションやモーター制御側の停止処理へ接続して初めて、通信断や古い指令に対する動作を設計できる。

なぜQoSの使い分けが必要か

ROS 2のQoSは、パブリッシャーとサブスクライバーという各通信エンドポイントに設定される。メッセージ型やトピック名が同じでも、両者のQoSが互換でなければ通信は成立しない。反対に、通信が成立しても、キューに古いデータを蓄積したり、再送を待ったりする設定では、ロボットの処理に必要な鮮度を失う可能性がある。

センサーと制御指令では、失われたデータの意味が異なる。高頻度センサーでは、処理が追いつかないときに過去のフレームを順番に処理するより、最新フレームへ追従したい場合が多い。制御指令では、確実な配送が必要な場面がある一方、停止後の古い指令を遅れて適用することも避けなければならない。したがって、信頼性と低遅延を単純な優劣で比較するのではなく、データの有効時間と欠落の影響を基準にする。

QoSポリシーの基本用語

ポリシー意味設計時の問い
HISTORY保存方式。KEEP_LASTは直近の一定数を保持する過去データをどれだけ残すか
DEPTHKEEP_LASTで保存するサンプル数処理遅延を許容して何件待つか
RELIABILITY配送保証の方式。RELIABLEは再送を含む保証、BEST_EFFORTは届いたものを扱う欠落と待ち時間のどちらを重く見るか
DURABILITY新しく参加した受信者へ過去データを保持する方式購読開始前の値が必要か
DEADLINEデータ到着間隔への期待値周期が途切れたことを検知したいか
LIFESPANサンプルが有効でいられる期間古いデータを破棄したいか
LIVELINESS / LEASE_DURATION送信者の生存確認に関する設定送信ノードの停止を監視するか

VOLATILEは過去データを新規参加者へ引き渡す用途ではなく、現在流れているデータを扱う通信に向く。設定値は単独で意味を持つのではなく、送信周期、処理能力、ネットワーク条件と組み合わせて評価する。

センサー通信の設計

JazzyのSensorDataQoSは、KEEP_LAST、深度5、BEST_EFFORT、VOLATILEを基本値とする事前定義プロファイルである。カメラやLiDARのようにデータ量と頻度が大きい通信では、多少の欠落よりも処理の停滞や古いデータの蓄積を避けることが優先される場合がある。そのため、浅いキューとBEST_EFFORTを出発点にし、処理が常に新しい入力へ追従できるかを確認する。

ただし、すべてのセンサーに同じ設定を適用してよいわけではない。欠落が許されないセンサー入力や安全判断に使う低頻度データでは、RELIABLEを個別に検討する。DEPTHを大きくすれば一時的な処理遅延を吸収できる可能性があるが、古いサンプルを処理する時間も増える。実機や対象ネットワークを確認せず、深度の最適値を決めることはできない。

制御通信の設計

cmd_velには、ROS 2全体で強制された単一のQoS標準値はない。ドライバーやノードが選択したQoSに依存するため、トピック名だけからRELIABLEやBEST_EFFORTを推定してはいけない。

初期案としては、RELIABLE、VOLATILE、KEEP_LASTの深度1が考えられる。これは制御指令を確実に届けることと、キューに多数の古い指令を残さないことを両立させる方向である。ただし、通信損失時の再送で古い指令が遅れて届くことを避けたいシステムでは、BEST_EFFORTや短いLIFESPANも候補になる。最終判断は、受信側の要求QoS、ネットワーク損失、指令の有効時間、モーターコントローラーのタイムアウト仕様を確認して行う。

センサー通信では最新データへの追従を、制御通信ではQoS互換性、指令の有効期限、停止監視を重視する設計の流れを示す。図中の制御QoSは初期候補であり、単一の標準解を示すものではない。

図では、センサー経路を「最新データの継続処理」、制御経路を「指令の期限管理と停止監視」として分けると理解しやすい。QoS不一致の場合は、各種の遅延調整以前に通信経路そのものが成立しない。

通信種別ごとの比較

通信種別主な優先事項初期候補注意点
高頻度センサー鮮度、低遅延SensorDataQoS欠落が許されない用途ではRELIABLEを検討
cmd_velなどの制御指令有効な指令の配送、古い指令の排除RELIABLE、VOLATILE、深度1受信側との互換性を必ず確認。BEST_EFFORTや短いLIFESPANも候補
状態フィードバック欠落許容度と鮮度のバランス用途に応じて選択周期、処理遅延、必要な履歴を確認
新規参加者にも過去値が必要なデータ過去値の保持DURABILITYを個別検討現在値だけを扱うセンサー通信とは目的が異なる

互換性と不具合の切り分け

QoS互換性は、パブリッシャーが提供するQoSと、サブスクライバーが要求するQoSの組み合わせで決まる。たとえば、BEST_EFFORTを要求するサブスクライバーは、RELIABLEを提供するパブリッシャーとも接続できる。一方、RELIABLEを要求するサブスクライバーは、BEST_EFFORTを提供するパブリッシャーとは互換にならない。

通信が見えないときは、まず次の順で確認する。

  1. ros2 topic info <topic> --verboseで、実際のパブリッシャーとサブスクライバーのQoSを確認する。
  2. RELIABILITYとDURABILITYの非互換を確認する。
  3. DEPTHとキューの蓄積、送信周期、受信側の処理遅延を確認する。
  4. LIFESPANが短すぎないか、受信タイムアウトが厳しすぎないかを確認する。
  5. DEADLINEイベントやタイムアウトを、停止処理へ接続できているか確認する。

SYSTEM_DEFAULTに依存する設定は、RMW実装やミドルウェア設定に左右される可能性がある。重要なセンサー経路や制御経路では、対象ディストリビューション、RMW実装、ネットワーク条件を固定して、QoSを明示的に設定・確認する方が再現性を確保しやすい。

採用判断の基準

まず、データが欠落したときに「次のサンプルで置き換えられるか」を判断する。置き換えられるなら、BEST_EFFORT、VOLATILE、浅いKEEP_LASTが候補になる。欠落が重大ならRELIABLEを検討するが、再送による待ち時間と古いデータの到着を評価する。

次に、データの有効時間を決める。期限を超えたサンプルを使うべきでないならLIFESPAN、期待周期の途切れを検知したいならDEADLINEを使う。ただし、どちらもモーターを自動停止する機能ではない。受信タイムアウト、ゼロ指令、アプリケーション側の停止処理、またはハードウェアウォッチドッグへ明示的に接続する必要がある。

まとめ

ROS 2のQoS設計では、センサーを常にBEST_EFFORT、制御を常にRELIABLEと決め打ちしないことが重要である。センサーは鮮度、制御は指令の有効時間と停止動作を中心に考え、提供QoSと要求QoSの互換性を実行時に確認する。特にcmd_velの設定には全体共通の正解がない。QoSの値、実際の通信状態、タイムアウト時の安全動作を一体として設計することが、信頼性と遅延を両立する基本になる。

参考情報

最終的なQoSの妥当性は、値の選択だけでなく、期限切れや通信断の際にロボットがどう停止するかまで含めて確認したいところです。

AI利用に関する注記

本サイトの記事は、複数のAIエージェントによる調査・執筆・レビューを経て公開しています。正確性と品質の向上に努めていますが、内容については必ず一次情報をご確認ください。

参考にした一次情報