Main Content

ROS ネットワークへの接続

ROS ネットワークは、1 つの "ROS マスター" と複数の "ROS ノード" で構成されます。ROS マスターは、すべてのアクティブな ROS エンティティを追跡することにより、ROS ネットワーク内の通信を円滑にします。各ノードが残りのネットワークと通信できるようになるには、ROS マスターに登録する必要があります。MATLAB® で ROS マスターを起動することもできますが、マスターは MATLAB 以外 (別のコンピューター上など) から起動することもできます。

ROS を操作する場合、通常は以下の手順に従います。

  1. ROS ネットワークに接続します。ROS ネットワークに接続するには、MATLAB で ROS マスターを作成するか、既存の ROS マスターに接続します。どちらの場合も、MATLAB は独自の ROS ノード (MATLAB "グローバル ノード") も作成し、マスターに登録します。関数rosinitがこの処理を管理します。

  2. "データを交換" します。接続後、MATLAB は、パブリッシャー、サブスクライバーおよびサービスを介して他の ROS ノードとデータを交換します。

  3. "ROS ネットワークから切断" します。関数 rosshutdownを呼び出して、MATLAB を ROS ネットワークから切断します。

この例では、次を行う方法を説明します。

  • MATLAB での ROS マスターの作成

  • 外部 ROS マスターへの接続

前提条件:ROS 入門

MATLAB での ROS マスターの作成

  • MATLAB 内で ROS マスターを作成するには、引数を何も指定せずに rosinit を呼び出します。また、この関数によって、MATLAB が ROS ネットワーク内の他のノードとの通信に使用するグローバル ノードが作成されます。

rosinit
Launching ROS Core...
Done in 1.0269 seconds.
Initializing ROS master on http://172.30.102.182:60521.
Initializing global node /matlab_global_node_37410 with NodeURI http://dcc797901glnxa64:35835/ and MasterURI http://localhost:60521.

この時点で、MATLAB の外部の ROS ノードが ROS ネットワークに参加できます。MATLAB ホスト コンピューターのホスト名または IP アドレスを使用して、MATLAB 内の ROS マスターに接続できます。

ROS マスターおよびグローバル ノードをシャットダウンするには、rosshutdownを呼び出します。

rosshutdown
Shutting down global node /matlab_global_node_37410 with NodeURI http://dcc797901glnxa64:35835/ and MasterURI http://localhost:60521.
Shutting down ROS master on http://172.30.102.182:60521.

外部 ROS マスターへの接続

rosinitコマンドを使用して外部の ROS マスター (ロボットまたはバーチャル マシンで実行中のものなど) に接続することもできます。マスターのアドレスの指定方法は 2 つあり、マスターを実行しているコンピューターの IP アドレスまたはホスト名を使用します。

rosinit の各呼び出しの後は、別の構文で rosinit を呼び出す前にrosshutdownを呼び出さなければなりません。簡潔にするために、これらの例ではこのような rosshutdown の呼び出しを省略します。

外部 ROS マスターで、'master_host' はホスト名の例で、'192.168.1.1' は IP アドレスの例です。これらのアドレスは、ネットワーク内の外部マスターの場所に従って調整してください。指定したアドレスにマスターが見つからない場合、これらのコマンドは失敗します。

rosinit('192.168.1.1')
rosinit('master_host')

rosinitへのいずれの呼び出しでも、マスターがポート 11311 (標準の ROS マスター ポート) でネットワーク接続を受け入れると仮定します。マスターが別のポートで実行されている場合は、それを 2 番目の引数として指定できます。ホスト名 master_host、ポート 12000 で実行している ROS マスターに接続するには、次のコマンドを使用します。

rosinit('master_host',12000)

マスターの完全な Uniform Resource Identifier (URI) がわかっている場合は、グローバル ノードを作成し、次の構文を使用して、このマスターに接続できます。

rosinit('http://192.168.1.1:12000')

ノード ホストの指定

場合によっては、コンピューターが複数のネットワークに接続され、複数の IP アドレスをもっていることがあります。次の図に例を示します。

左下のコンピューターは MATLAB を実行していて、2 つの異なるネットワークに接続されています。一方のサブネットでの IP アドレスは 73.195.120.50, で、もう一方での IP アドレスは 192.168.1.100 です。このコンピューターを、IP アドレス 192.168.1.1 の TurtleBot® コンピューター上の ROS マスターに接続するとします。マスターへの登録の一環として、MATLAB グローバル ノードでは、他の ROS ノードから到達可能な IP アドレスまたはホスト名を指定しなければなりません。TurtleBot 上のすべてのノードが、このアドレスを使用して MATLAB のグローバル ノードにデータを送信することになります。

マスターの IP アドレスを指定してrosinitが呼び出されると、マスターとの接触に使用するネットワーク インターフェイスが検出され、それがグローバル ノードの IP アドレスとして使用されます。この自動検出が失敗する場合は、rosinit の呼び出しで NodeHost の名前と値のペアを使用することにより、IP アドレスまたはホスト名を明示的に指定できます。NodeHost の名前と値のペアは、既に示した他の任意の構文で使用できます。

これらのコマンドでは、コンピューターの IP アドレスを ROS ネットワークに 192.168.1.100 としてアドバタイズします。

rosinit('192.168.1.1','NodeHost','192.168.1.100')
rosinit('http://192.168.1.1:11311','NodeHost','192.168.1.100')
rosinit('master_host','NodeHost','192.168.1.100')

ROS ネットワークにノードが登録されたら、コマンド rosnode info <nodename> を使用して、アドバタイズしているアドレスを確認できます。登録されているすべてのノードの名前を確認するには、rosnode list を呼び出します。

ROS 環境変数

高度な使用例では、ROS マスターのアドレスおよびアドバタイズされたノード アドレスを、標準の ROS 環境変数を使用して指定する場合があります。大半の使用例では、これまでの節で説明した構文で十分です。

rosinitに引数が指定されていない場合、関数は標準の ROS 環境変数の値もチェックします。これらの変数は、ROS_MASTER_URIROS_HOSTNAME および ROS_IP です。現在の値は、getenvコマンドを使用して確認できます。

getenv('ROS_MASTER_URI')
getenv('ROS_HOSTNAME')
getenv('ROS_IP')

これらの変数は、setenvコマンドを使用して設定できます。環境変数を設定した後、rosinit を引数なしで呼び出します。ROS マスターのアドレスは ROS_MASTER_URI, によって指定され、グローバル ノードのアドバタイズされたアドレスは ROS_IP または ROS_HOSTNAME によって得られます。rosinit に追加の引数を指定した場合、その引数が環境変数内の値をオーバーライドします。

setenv('ROS_MASTER_URI','http://192.168.1.1:11311')
setenv('ROS_IP','192.168.1.100')
rosinit

ROS_HOSTNAMEROS_IP の両方を設定する必要はありません。両方を設定した場合は、ROS_HOSTNAME が優先されます。

接続の検証

ROS 接続を正常に機能させるには、すべてのノードがマスターと通信でき、相互にも通信できることを確認しなければなりません。個々のノードは、サブスクライバー、パブリッシャーおよびサービスを登録するために、マスターと通信しなければなりません。また、データを送受信するために、ノード間でも通信できなければなりません。ROS ネットワークが正しく設定されていない場合は、データを送信できても受信できない (またはその逆) 可能性があります。

次の図は、1 つの ROS マスターとそのマスターに自身を登録している 2 つの異なるノードを備えた ROS ネットワークを示しています。各ノードはマスターに接続し、ROS ネットワーク内のもう一方のノードのアドバタイズされたアドレスを見つけます。各ノードがもう一方のノードのアドレスを認識したら、マスターを介さずにデータ交換を確立できます。

次のステップ

関連するトピック