はじめに
ROS 2 Humble環境において、Fast DDSとCyclone DDSを混在させた場合の通信制約について確認した結果を記載する。
動作確認環境
- ROS 2 Humble
- DDS
- Cyclone DDS
- ros-humble-cyclonedds 0.10.5-2jammy.20260213.230758
- ros-humble-rmw-cyclonedds-cpp 1.3.4-1jammy.20260217.034014
- Fast DDS
- ros-humble-fastcdr 1.0.29-1jammy.20260213.225749
- ros-humble-fastrtps 2.6.11-1jammy.20260214.005144
- ros-humble-fastrtps-cmake-module 2.2.4-1jammy.20260214.004026
- ros-humble-rmw-fastrtps-cpp 6.2.10-1jammy.20260217.033625
- ros-humble-rmw-fastrtps-shared-cpp 6.2.10-1jammy.20260217.033034
- ros-humble-rosidl-typesupport-fastrtps-c 2.2.4-1jammy.20260214.020147
- ros-humble-rosidl-typesupport-fastrtps-cpp 2.2.4-1jammy.20260214.015657
- Cyclone DDS
方法
Fast DDS と Cyclone DDSで以下のテストを実施した。
- トピック送受信 (
ros2 topic pub/ros2 topic echo) - サービス呼び出し (
ros2 service call {service_name}) - パラメータ一覧取得 (
ros2 param list) - パラメータ取得 (
ros2 param get {node_name} {param_name}) - パラメータ設定 (
ros2 param set {node_name} {param_name} {value})
クライアント側で上記コマンドを実行して、サーバー側の機能を利用できるかを確認した。また、クライアント側とサーバー側のDDSを入れ替えて確認した。
各DDSの設定には以下のコマンドを使用した。
Cyclone DDSの設定
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
Fast DDSの設定
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
結果
| クライアント | サーバー | テスト内容 | 結果 | 詳細 |
|---|---|---|---|---|
| Fast DDS | Cyclone DDS | トピック送受信 | 〇 | Fast DDS(送信)⇒ Cyclone DDS(受信) |
| Cyclone DDS | Fast DDS | トピック送受信 | 〇 | Cyclone DDS(送信)⇒ Fast DDS(受信) |
| Fast DDS | Cyclone DDS | サービス呼び出し | × | サーバー側の実行はできるが、クライアントへ戻り値が返ってこない。 |
| Cyclone DDS | Fast DDS | サービス呼び出し | × | サーバー側の実行はできるが、クライアントへ戻り値が返ってこない。 |
| Fast DDS | Cyclone DDS | パラメータ一覧 | × |
ros2 param listコマンドで以下の例外となる。Exception while calling service of node '/{node_name}': None
|
| Cyclone DDS | Fast DDS | パラメータ一覧 | × |
ros2 param listコマンドで以下の例外となる。Exception while calling service of node '/{node_name}': None
|
| Fast DDS | Cyclone DDS | パラメータ取得 | × |
ros2 param get {node_name} {param_name}コマンドで応答が返らず、パラメータ値の取得ができない。 |
| Cyclone DDS | Fast DDS | パラメータ取得 | × |
ros2 param get {node_name} {param_name}コマンドで応答が返らず、パラメータ値の取得ができない。 |
| Fast DDS | Cyclone DDS | パラメータ設定 | × |
ros2 param set {node_name} {param_name} {value}コマンドで応答が返らず、パラメータ値の設定ができない。 |
| Cyclone DDS | Fast DDS | パラメータ設定 | × |
ros2 param set {node_name} {param_name} {value}コマンドで応答が返らず、パラメータ値の設定ができない。 |
上記から、本記事で検証したFast DDSとCyclone DDSの組み合わせでは、以下の制約があることが分かった。
- ROSサービスの戻り値が返ってこない
- ROS 2サービス自体は呼び出せるが、応答が返ってこない
- ROSパラメータコマンドが使えない
- ROS 2のパラメータ機能は内部的にサービス通信を利用しているため、サービス通信が正常に動作しない環境では、パラメータ操作も利用できない
まとめ
ROS 2 Humble環境において、Fast DDSとCyclone DDSを組み合わせた通信試験を実施した。その結果、トピック通信(Pub/Sub)は正常に動作した一方で、サービス通信は応答を受信できず、ROS 2パラメータ機能も利用できなかった。
ROS 2ではDDS実装の違いをRMW層が吸収する設計となっているが、異なるDDS実装間ではPub/Sub以外の機能に制約が存在する場合がある。
そのため、異なるDDS実装を混在させるシステムを構築する場合は、サービス通信やパラメータ機能について事前に十分な動作確認を実施することを推奨する。
なお、Connext DDSとCyclone DDSの組み合わせについても、公式ドキュメントでService通信の制約が報告されている。
また、今回確認した現象は、ROS 2 Humbleおよび記事執筆時点のDDS実装の組み合わせによる結果であり、ROS 2やDDS実装のバージョンによって挙動が変わる可能性がある。
参考