ROS2 (Robot Operating System) を活用した開発で、デフォルト設定では通信内容を同じネットワーク内に垂れ流してしまいます。
混線させたり、負荷を掛けたり、情報漏洩してしまったりして周りに迷惑をかけないようにする設定Tipsを紹介します。
【追記】
ここに記載している方法は、ROS2のironから非推奨になり、jazzyでは使えなくなったため、代替方法を最後に追記しました。(2024.11.21)
通常の挙動
ROS2は、デフォルトの設定では、同一ネットワーク内にTOPIC通信を垂れ流すので、研究室や企業内などで実行する際には注意が必要です。
これに対し、通信をコントロールする仕組みはしっかりと準備されています。貢献者の方々に感謝します。
1つ目は、複数のROS2を同じネットワーク上に共存させるための仕組みがあります。
2つ目は、ネットワーク上に情報を配信せずに、ローカルホストからのアクセスのみに制限する仕組みがあります。
今回は、後者を中心に紹介したいと思います。
設定方法(~humble)
今回、想定した環境は次のとおりです。
試験環境:
- Ubuntu 20.04 LTS
- ROS2 Foxy
まずは、試験環境は下記URLの通りに、セットアップしました。
さて、ここからが本番ですが、正直なところ、下記公式ドキュメント通りです。はい。
ポイントは、環境変数の「ROS_LOCALHOST_ONLY」を設定して終わりです。
公式文書はここ。
繰り返しになりますが、次の通りに設定します。
セットアップファイルを設定
ROS 2を有効にするには、新しいシェルを起動するたび以下のコマンドを実行する必要があります。
$ source /opt/ros/foxy/setup.bash
シェル起動時に自動設定
シェルを起動するたびにsetup.bashを実行するのは手間なので、起動時に.bashrcで実行するよう追記しておく。
$ echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
これにより、シェルを起動した際に、ROS 2関連の環境変数が設定されます。
環境変数を確認
ここでは、どんな環境変数が設定されているのか、printenvで確認してみます。
$ printenv | grep -i ROS
実行結果は下記のようになりました。
ROS_DISTROやROS_VERSIONが設定されているはずです。
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DOMAIN_ID=1
ROS_LOCALHOST_ONLY=0
ROS_DISTRO=foxy
環境変数「ROS_DOMAIN_ID」
複数のROS2を同じネットワーク上に共存させるための仕組みのようです。
ROS_DOMAIN_IDに数値を設定します。
ROS_DOMAIN_IDを設定すると、マルチキャストに使用するポートが変更されるようです。
詳細は下記URLに詳しく書かれています。
一時的に設定する際には、下記のようにexportするとよいです。
$ export ROS_DOMAIN_ID=<your_domain_id>
また、恒常的に設定したい場合は、先のsetup.bashと同様に、.bashrcに記載しておくとシェル起動時に自動設定されます。
$ echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc
環境変数「ROS_LOCALHOST_ONLY」
デフォルト状態では、ROS 2で配信される情報は同じネットワーク上の端末で受信することができます。
これは便利ですが、一方で、ネットワーク上に情報を配信せずに、ローカルホストからのアクセスのみに制限したい場合には、ROS_LOCALHOST_ONLYを1に設定します。
一時的に設定する際には、下記のようにexportするとよいです。
$ export ROS_LOCALHOST_ONLY=1
また、恒常的に設定したい場合は、.bashrcに記載しておくとシェル起動時に自動設定されます。
$ echo "export ROS_LOCALHOST_ONLY=1" >> ~/.bashrc
念のため、同じLAN上に接続された別のWindows PCから、ネットワークトラフィックを解析できるソフト「Wireshark」を使って、効果を確認してみました。ROS_LOCALHOST_ONLYの0 / 1に応じて、ちゃんとUDP通信がON/OFFされる状況を検証しました。
設定方法(iron, jazzy~)
ROS2のironから非推奨になり、jazzyでは使えなくなったため、代替方法をここでは紹介します。
ROS_LOCALHOST_ONLY の代替として、ROS_AUTOMATIC_DISCOVERY_RANGE を使用して設定できるようになりました。
設定は次のように行います。
export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST
一方で、設定を無効にするには、次のように設定します。デフォルトではこの設定になっています。
export ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET
# または、 unset ROS_AUTOMATIC_DISCOVERY_RANGEß
まとめ
ROS2を活用した開発で、ネットワーク上に情報を配信せずに、ローカルホストからのアクセスのみに制限したい場合の方法をROS2のバージョン別に紹介しました。
- ROS2 ~humble
- ROS_LOCALHOST_ONLY を 1 に設定
- ROS2 iron, jazzy~
- ROS_AUTOMATIC_DISCOVERY_RANGE を LOCALHOST に設定
最後までお読み頂きありがとうございました。
この記事が参考になったと思われたら、ぜひコメント欄でご意見・ご感想をお聞かせください。また、ソーシャルメディアでシェアしていただけると嬉しいです!
コメント