ROS2 (Robot Operating System) を活用した開発で、デフォルト設定では通信内容を同じネットワーク内に垂れ流してしまいます。
混線させたり、負荷を掛けたり、情報漏洩してしまったりして周りに迷惑をかけないようにする設定Tipsを紹介します。
目次
通常の挙動
ROS2は、デフォルトの設定では、同一ネットワーク内にTOPIC通信を垂れ流すので、研究室や企業内などで実行する際には注意が必要です。
これに対し、通信をコントロールする仕組みはしっかりと準備されています。貢献者の方々に感謝します。
1つ目は、複数のROS2を同じネットワーク上に共存させるための仕組みがあります。
2つ目は、ネットワーク上に情報を配信せずに、ローカルホストからのアクセスのみに制限する仕組みがあります。
今回は、後者を中心に紹介したいと思います。
設定方法
今回、想定した環境は次のとおりです。
試験環境:
- 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される状況を検証しました。
まとめ
ROS2を活用した開発で、ネットワーク上に情報を配信せずに、ローカルホストからのアクセスのみに制限したい場合には、ROS_LOCALHOST_ONLYを1に設定すればよい、というTipsをご紹介しました。
最後までお読み頂きありがとうございました。
この記事の内容が役に立ったと思ったらソーシャルメディアで共有してください。
コメント