複数の端末を用いた分散処理

端末間のデータ通信について学びます.

目的

ROS2では簡単に複数の端末間で分散処理ができるように設計されています. 本演習では,複数の端末で処理する方法について学びます.

仮想マシンを使用している場合の設定

VirtualBoxやVMwareなどの仮想マシンを使用している人は,ネットワークの接続設定を行ってから演習に取り組んでください. デフォルトでは,ネットワークの接続方式がNAT接続となっていますが,ブリッジ接続(ブリッジネットワーク)に変更する必要があります. また,設定変更を反映するために再起動してください.

ネットワークの設定

ROS2では,同一ネットワーク内のノードを検出してデータ通信が容易にできる仕組みとなっています. 同一ネットワークとは,各端末が同じルーターに接続された状態を表します. 限定したグループ内だけでデータ通信したい場合には,異なるドメインIDを割り当てる必要があります. なお,ドメインIDで設定する値の範囲は0~65532となります. 例えば,2人でグループを作成した場合,2人だけが使用するドメインIDを設定することで2端末間だけでデータ通信ができるようになります. 下記は環境変数であるROS_DOMAIN_ID1という値を設定する場合の例です.

1
$ export ROS_DOMAIN_ID=1

実際に割り当てるドメインIDの値については講義中に指示します. 上記のコマンドを実行したターミナルのみ設定が有効です. ターミナルを起動する度に上記のコマンドを実行することが手間な場合には, ホームディレクトリに存在する.bashrcに書き込むことで起動した際に自動的に環境変数が設定されます.

確認

2人でペアを作り,同じドメインIDに設定した時の挙動を確認します. 1人はシミュレータturtlesimを起動します.

1
$ ros2 run turtlesim turtlesim_node

もう1人はキーボードでロボットを操作するノードを起動します.

1
$ ros2 run turtlesim turtle_teleop_key 

node listコマンドを用いてお互いが起動したノードが表示されることを確認しましょう. そして,キーボードを用いてシミュレータ上のロボットを遠隔操作できることを確認してください.

複数端末間でデータ通信を行わない設定

他の端末とのデータ通信を行わないことを明示的に設定することも可能です. 環境変数ROS_LOCALHOST_ONLY1に設定します. これによりローカルホスト(自身の端末のみ)に限定できます.

1
2
$ echo "export ROS_LOCALHOST_ONLY=1" >> ~/.bashrc
$ source ~/.bashrc