MoriKen's Journal

MoriKen's Journal

アラサー社会人博士による徒然日記。技術についてつらつら。だけだとコンテンツが貧弱なので、会社公認で大学院博士課程進学したで経緯や、独学でTOEICを475→910にしたノウハウを共有します。気が向いたらエッセイとかも。

【ROS 2】複数の ROS 2 ミドルウェア実装を扱う(公式文書和訳)

Sponsored Link

ROS 2 公式文書(英語) 日本語訳シリーズです。

本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。

www.moriken254.com

※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_cpprmw_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実装のサポートが含まれていることを再確認してください。

翻訳元文書

index.ros.org

関連文書

www.moriken254.com

www.moriken254.com