ROS 2 公式文書(英語) 日本語訳シリーズです。
本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。
※2019/05/07 現在のものです。
このページでは、デフォルトの RMW 実装と代替方法の指定方法について説明します。
前提条件
既に ROS 2 に対応する様々な DDS / RTPS ベンダ(本ブログ和訳版)を読んでいることを前提とします。
複数のRMW実装
現在の ROS 2 バイナリリリースでは、いくつかのRMW 実装をそのままサポートしています(執筆時点では Fast RTPS、RTI Connext Pro、および ADLink OpenSplice)。
追加インストールなしで動作するのは Fast RTPS(デフォルト)のみで、唯一バイナリパッケージと一緒に配布されています。
OpenSplice や Connext のような他のものは追加のパッケージをインストールすることで使用可能ですが、既存のパッケージを置き換えたり再構築したりする必要はありません。
また、ソースからビルドした ROS 2 ワークスペースは、同時に複数の RMW 実装をビルド・インストールすることがあります。コアの ROS 2 コードのコンパイル中に、関連する DDS / RTPS 実装が正しくインストールされ、関連する環境変数が構成されていれば、検出された RMW 実装はすべてビルドされます。
例えば、RTI Connext 用の RMW パッケージのコードがワークスペースにある場合、RTI の Connext Pro のインストールも見つかるとビルドされます。多くの場合、さまざまな RMW 実装を使用しているノードが通信できますが、必ずしも全ての組み合わせで通信ができるとは限りません。サポートされているベンダー間通信設定のリストは近日公開予定です。
デフォルトのRMW実装
ROS 2ワークスペースに複数の RMW 実装がある場合、デフォルトの RMW 実装が使用可能であれば Fast RTPS が選択されます。 Fast RTPS RMW 実装がインストールされていない場合は、アルファベット順で最初の RMW 実装 ID を持つ RMW 実装が使用されます。実装識別子は、RMW 実装を提供する ROS パッケージの名前です(例:rmw_fastrtps_cpp
)。
rmw_opensplice_cpp
とrmw_connext_cpp
の両方の ROS パッケージがインストールされている場合は、rmw_connext_cpp
がデフォルトになります。 rmw_fastrtps_cpp
がインストールされている場合は、それがデフォルトになります。 ROS 2 の例を実行するときにどのRMW実装を使用するかを指定する方法については、以下を参照してください。
RMW 実装の指定
複数の RMW 実装を使用可能にするには、バイナリと特定の RMW 実装に対する追加の依存関係をインストールするか、ワークスペースに複数の RMW 実装を含むソースから ROS 2 を構築し(デフォルトで含まれる)、それらの依存関係を満たす必要があります。サンプルは、インストール(本ブログ和訳版)を参照してください。
Beta 2 以降では、C++ ノードと Python ノードの両方で環境変数RMW_IMPLEMENTATION
がサポートされています。異なるRMW 実装を選択するには、環境変数RMW_IMPLEMENTATION
を特定の実装識別子に設定します。
RMW 実装として connext を使用した、C++ による talker と、python による listener のデモを実行するには、次のコマンドを実行します。
- bash
RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker # Run in another terminal RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_py listener
- Windows cmd.exe
set RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker REM run in another terminal set RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_py listener
ワークスペースへの RMW 実装の追加
ROS 2 ワークスペースに Fast RTPS のみがインストールされており、Fast RTPS RMW 実装のみがビルドされた状況を考えてみます。一旦ワークスペースがビルドされてしまうと、他の RMW 実装パッケージ(例えば、rmw_connext_cpp
)は、関連するDDS実装のインストールを検出できない場合があります。
そこで、Connext などの追加の DDS 実装をインストールする場合は、Connext RMW 実装のビルド時に発生する Connext インストールのチェックを再トリガする必要があります。
具体的には、ワークスペースのリビルド時に、--cmake-force-configure
フラグを指定することで、RMW 実装パッケージが新しくインストールされた DDS 実装用にビルドが走ります。
--cmake-force-configure
オプションを使用して追加の RMW 実装でワークスペースを「リビルド」すると、デフォルトの RMW 実装が変更されたことを示すメッセージが表示されることがあります。これを解決するには、RMW_IMPLEMENTATION CMake
引数を使用してデフォルトの実装を以前の実装に設定するか、そのメッセージを出すパッケージのビルドフォルダを削除して--start-with <パッケージ名>
を使用してビルドを続行します。
トラブルシューティング
特定のRMW実装を確実に利用する
ROS 2 Ardent 以降
RMW_IMPLEMENTATION
環境変数が、インストールされていない RMW 実装に設定されている状況を想定します。インストール済みの実装が1つしかない場合には、次のようなエラーメッセージが表示されます。
Expected RMW implementation identifier of 'rmw_connext_cpp' but instead found 'rmw_fastrtps_cpp', exiting with 102.
複数の RMW 実装がインストール済みで、インストールされていないものの使用を要求した場合は、次のように表示されます。
Error getting RMW implementation identifier / RMW implementation not installed (expected identifier of 'rmw_connext_cpp'), exiting with 1.
このような場合は、ご使用の ROS 2 インストール環境に、RMW_IMPLEMENTATION
環境変数で指定したRMW実装のサポートが含まれていることを再確認してください。