LoginSignup
19
11

More than 1 year has passed since last update.

同一ネットワーク内で複数人がROS2を使用する場合

Last updated at Posted at 2019-05-31

ROS2関係トップページへ

問題提起

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さんのものとして使われたりするかもしれない...

解決方法

上記のような問題に対して,以下の解決方法がある.ここでは最初の方法を推奨する.

  1. ROS_DOMAIN_IDを設定・ROS_LOCALHOST_ONLYの設定
  2. node名・topic名などの命名規則を設定

ROS_DOMAIN_IDの設定

ROS_DOMAIN_IDに数値を設定すると,同一の値が設定されたところ(terminal)同士でしかノードなどを見ることが出来なくなる.よって他の人のノードなどに左右されないし,他の人に影響を与えない.

設定の仕方

下記はterminalから直接設定する方法である.

$ export ROS_DOMAIN_ID=1

下記のように.bashrcに記述する方法を推奨する.

$ 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を使うようにしましょう.

.bashrc
ID=0 # ここに自分固有の番号を入れる.分からなければ0とし,ROS_LOCALHOST_ONLYを使うようにしておく.
if [ $ID -eq 0 ]; then
  export ROS_LOCALHOST_ONLY=1
else
  export ROS_DOMAIN_ID=$ID
fi

参考

19
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
11