問題提起
ROS2はネットワーク内で自動的にnodeを発見し,構成する.そのため同一ネットワーク内であれば複数のPCでnodeを実行させて分散処理することが容易にできる.
一方,同一ネットワークで複数人が「それぞれの目的」に従ってROS2のプログラムを作成してnodeを実行させると以下のような問題が生じる.特に研究室で.
- Aさんがシミュレーション用の音声処理をnode名"processing"で作成.データをtopic名double resultで公開
- Bさんがラズパイに接続している距離センサをnode名"processing"で作成.データをtopic名double resultで公開
- Cさんが画像処理をnode名"processing"で作成.データをtopic名double resultで公開
結果,Aさんの処理結果がCさんのものとして使われたりするかもしれない...
解決方法
上記のような問題に対して,以下の解決方法がある.ここでは最初の方法を推奨する.
- ROS_DOMAIN_IDを設定・ROS_LOCALHOST_ONLYの設定
- node名・topic名などの命名規則を設定
ROS_DOMAIN_IDの設定
ROS_DOMAIN_IDに数値を設定すると,同一の値が設定されたところ(terminal)同士でしかノードなどを見ることが出来なくなる.よって他の人のノードなどに左右されないし,他の人に影響を与えない.
設定の仕方
下記はterminalから直接設定する方法である.
$ export ROS_DOMAIN_ID=1
下記のように.bashrcに記述する方法を推奨する.
$ echo "export ROS_DOMAIN_ID=1" >> ~/.bashrc
値の範囲
ROS_DOMAIN_IDで設定できる値の範囲は0~65532まで.例えば2000000とか与えてros2 node listとやると,エラーメッセージが出て範囲を教えてくれる.
ROS_DOMAIN_ID=0はどうも「全体に見える値」のような気がする.検証としては,以下のとおり.
-
実験設定
- 端末A,端末B,端末Cを用意
- 端末A,端末Bで同じROS_DOMAIN_IDを設定
- 端末CではROS_DOMAIN_IDを設定せず
- 端末Aでnodeを実行
- 端末B,Cでros2 node listを実行し,端末Aのノードが表示されるか確認
-
ROS_DOMAIN_ID=1で設定した場合(ただしくは0以外で何通りか実験)
- 端末B : 端末Aのノードが表示される
- 端末C : 端末Aのノードが表示されない
-
ROS_DOMAIN_ID=0で設定した場合
- 端末B : 端末Aのノードが表示される
- 端末C : 端末Aのノードが表示される
ROS_LOCALHOST_ONLYの設定
もし自分一人がROS2を動かすPCを使っており,ネットワークごしに他のPCのノードとやりとりしないのなら,以下のように設定するのがよい.
export ROS_LOCALHOST_ONLY=1
まとめ
基本的に.bashrcの中に以下を記述しましょう.値は管理者に相談して決めましょう.
ローカルで使用する場合には,ID=0にしてROS_LOCALHOST_ONLYを使うようにしましょう.
ID=0 # ここに自分固有の番号を入れる.分からなければ0とし,ROS_LOCALHOST_ONLYを使うようにしておく.
if [ $ID -eq 0 ]; then
export ROS_LOCALHOST_ONLY=1
else
export ROS_DOMAIN_ID=$ID
fi
参考
-
Overview of ROS 2 Concepts
- Discoveryの章
- 公式のdiscourse
- キーワード
- ROS_DOMAIN_ID,DDS domain IDなど