Edited at

ROS講座20 複数のPCでROS接続1


環境

この記事は以下の環境で動いています。

項目

CPU
Core i5-8250U

Ubuntu
16.04

ROS
Kinetic

インストールについてはROS講座02 インストールを参照してください。

またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。


概要

ここまではROSを1つのPC上で動作させてきました。しかし、ロボット開発では複数のPCを使用することが多々あります。

そのような場合でも1つのPCで実行している時と変わらないように複数のロボットでも動作させることができます。この設定を説明します。


ROSの接続

基本的な構成ではROSは1つのPCで動きます。ROS講座2でも出てきたtalkerとlistenerの例では以下の図のようにmaster、talker、listenerの3つのプログラムが動作しています。masterはROSの起動後に必ず起動するプログラムでざっくりいうとROSノードの管理を行います。


単一PC内でのROS

ROSノードであるtalkerやlistenerは起動したらまず最初にmasterに接続して、そのROSノードのPublusherやSubscriberがどのROSノードと接続すべきかなどの情報を取得し(図中の点線)、その後にROSノード同士が通信を開始します(図中の実線)。


複数PC間でのROS

一方複数のPCにまたいだROSの実行でも基本的なことは変わりませんが、一部違うところがあります。便宜的に今回は手元のPCをnote1、リモートで操作するPCをrobot1と呼びます。


  • robot1のROSノードが起動するときにnote1上で実行しているROS masterに接続すること

  • note1のtalkerとrobot1のlistenerがPC間での通信を行うこと


ネットワーク構成

note1とrobot1はネットワークで接続する必要があります。これは有線(Ethernet)でも、無線(Wifi)でもかまいません。基本的にLAN内での通信でなら問題はありませんが、多くのポートでの通信があるためにインターネット越しでの通信はブロックされる可能性があるので難しいです。


  1. 固定アドレスの場合

    各PCに固定アドレスを設定する場合です。通信するPCのIPアドレスが固定されるために構成が楽です。一方IPアドレス固定の作業が面倒、ネットワーク構成が変わった時への対処が面倒です。

  2. DHCPの場合(PCのIPアドレスを固定する)

    DHCPを使いますがDHCPサーバーに設定をして、各PCのMacアドレスを見て固定のIPを設定する方法です。ネットワーク構成の変更が容易で、使いやすいですが、DHCPサーバーの設定をいじらないといけないです。

  3. DHCPの場合(PCのIPアドレスを固定しない)
    IPアドレスが固定されていないので名前解決をしなければなりません。これにはAvahiを使います。しかし、この方法はmulti castを行うためにネットワーク機器によってはブロックされてよく問題が起きる部分でトラブルの元です。

個人的には(1)や(2)のアドレスを固定することを強く推奨します。


ネットワークの設定

以下の手順で複数PCでのROS通信を設定します。


各ノードのIPアドレスの確認

以下のコマンドを実行して


note1、robot1の両方のターミナルで

ifconfig



pingで接続確認

以下の手順で通信ができるか確認します。

以下のコマンドを実行して


note1のターミナルで

ping 192.168.1.20



robot1のターミナルで

ping 192.168.1.10



ROS通信の確認

ROSの通信を行うには環境変数の設定が必要です。まずROS_MASTER_URIの設定です。これは起動時にmasterに問い合わせを行うが、どこのmasterに問い合わせるかというものです。デフォルトではhttp://localhost:11311になっていて、自分のPC上のmasterに問い合わせます。今回robot1のROSノードはnote1のmasterに問い合わせるのでrobot1ではこの部分の書き換えを行います。

またROS_IPの設定をします。ROS_IPはROSの通信時に使うそのマシンのIPアドレスです。デフォルトでは空欄なので、設定する必要があります。合わせると以下のコマンドを打てばよくなります。

今回はnote1でroscoreを立ち上げて、robot1からそのroscoreにアクセスしてみます。


note1のターミナルで

export ROS_IP=192.168.2.10

roscore


robot1のターミナルで

export ROS_MASTER_URI=http://192.168.2.10:11311

export ROS_IP=192.168.2.20
rosnode list

これらの設定はターミナルを閉じると消えてしまいます。ターミナルを開くごとに上記のコマンドを打つ必要があります。


自分のIPアドレスの自動取得

上記の例ではexport ROS_IP=192.168.2.10のように自分のIPアドレスをハードコーティングしています。しかしネットワーク接続が変わる(例えばwifi接続とEther接続の時)ことでIPアドレスも変わるので、できるだけハードコーティングは避けたいですね。そこで自分のアドレスをコマンドで取得します。

まず自分に割り振られているコマンド一覧をhostname -Iで取得します。すると192.168.2.10 192.168.2.52 2408:52:c731:0:1576:1344:65f6:7aabのように割り当てられているアドレスがスペース区切りのリストとして来ます。これをcutコマンドを使って取り出します。

shell:自分のIPアドレスを取得

hostname -I| cut -d' ' -f1



これで192.168.2.10のような値が取り出せます。

このコマンドを使うと上記のコマンドは


note1のターミナルで

export ROS_IP=`hostname -I | cut -d' ' -f1`

roscore


robot1のターミナルで

export ROS_MASTER_URI=http://192.168.2.10:11311

export ROS_IP=`hostname -I | cut -d' ' -f1`
rosnode list

と書けます。


ROSの分散実行

まずnote1側でmasterを立てます。後はいつもと同じように実行するだけです。今回はROS講座03でも出てきたシンプルなpub,sub通信をします


note1の1つ目のターミナルで

roscore



note1の2つ目のターミナルで

rosrun basic_lecture simple_talker 



robot1のターミナルで

export ROS_MASTER_URI=http://192.168.2.10:11311

rosrun basic_lecture simple_listener


目次ページへのリンク

ROS講座の目次へのリンク