複数のPCで処理する方法

目的

ROSは容易に分散処理できるように設計されています.本演習では,複数のPCで計算する方法について学びます.

複数のPCで処理する方法

PCのリソースに合わせて計算量をコントロールする,すなわち起動するノードを適切にPCに割り振ることで,効率的に分散処理することが可能になります.プログラムを並列に処理するためには手間と技術が必要とされていますが,ROSを介することで容易に並列分散処理が可能です.

0. VB環境のネットワークの設定

VB環境でubuntuを動かしている人は,こちらのページを参考にしてネットワークの設定を行ってください.

1. マスターとスレーブの決定
複数のPCで処理する場合においても,roscoreで立ち上がるマスターは1つのみです.マスター以外のPCは,全てスレーブとなります.どのPCをマスター,どのPCをスレーブにするか決定しましょう.1チーム2人で構成されていますので,1人のPCはマスター,もう1人のPCをスレーブとしましょう.

2. ROS_IPの設定
ROS_IPは,自身のPCのIPアドレスを表します.まずはPCに割り当てられているIPアドレスを調べましょう.IPアドレスを調べるためには,下記のコマンドを実行します.


$ ifconfig

実行すると下記のように出力されます.

[yuu@T440p:~]$ ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 28:d2:44:48:de:74
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)
          割り込み:20 メモリ:f1600000-f1620000 

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:21096996 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:21096996 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:419553401459 (419.5 GB)  TXバイト:419553401459 (419.5 GB)

wlan0     Link encap:イーサネット  ハードウェアアドレス dc:fb:02:58:d5:34
          inetアドレス:10.0.1.6  ブロードキャスト:10.0.1.255  マスク:255.255.255.0
          inet6アドレス: fe80::defb:2ff:fe58:d534/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:53488 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:46834 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:39587301 (39.5 MB)  TXバイト:6987130 (6.9 MB)

無線LANによりネットワークに接続している人は,IPはハイライトされた行に書かれているinetアドレスがIPアドレスになります.上記の場合では,”10.0.1.6″がIPアドレスとなります.自身のPCのIPアドレスを下記のように設定しましょう.

$ echo "export ROS_IP=10.0.1.6" >> ~/.bashrc

上記はIPアドレスが10.0.1.6の例です.自身のPCのIPアドレスを設定しましょう.

3. ROS_MASTER_URIの設定
ROS_MASTER_URIは,どのPCがマスターであるかを表す環境変数です.マスターとして使用するPCのIPアドレスを設定しましょう.ここでは,マスターのPCのIPアドレスが10.0.1.7とし,ROS_MASTER_URIを設定する方法を下記に示します.

$ echo "export ROS_MASTER_URI=http://10.0.1.7:11311" >> ~/.bashrc
$ source ~/.bashrc

IPアドレスのコロンの右側はポート番号です.以上で設定は終了です.

4. roscore
マスターとなるPCでroscoreを実行します.

$ roscore

マスターとしての役割を果たすPCは1台のみですので,スレーブとなるPCはroscoreを起動する必要はありません.以上で複数のPCで処理するための準備が整いました.

5. 確認
それでは,複数のPCで処理できることを確認してみましょう.ここでは,以前に使用したturtlesimを動かします.
まず,マスターのPCで下記を実行しましょう.

$ rosrun turtlesim turtlesim_node

次に,スレーブのPCで下記を実行しましょう.

$ rosrun turtlesim turtle_teleop_key

上記を実行後,スレーブのPCでマスターのPCで起動しているシミュレータ上のロボット(亀)を操作してみましょう.正しく設定されていればロボットを操作できます.ロボットが操作できることを確認後,マスターとスレーブで動かしていたノードを交換してみましょう.
ここでは,それほど計算量が多くないノードを動かしているため,複数のPCで並列に処理することの利点が感じ取れないかもしれません.しかしながら,このような簡単な設定で並列分散処理ができることは,とても大きな利点です.PCのリソースに合わせて計算量をコントロールし,ノードを設計すると良いでしょう.また,講義では1チーム2人でturtlebotを使用します.1つのPCをturtlebotに搭載し,もう1台のPCでプログラミング,デバック,実行をすると効率が良いです.

6. 設定の変更
接続するPCを変更する場合や,IPが変わった場合には,ホームディレクトリに存在する.bashrcを修正する必要があります.テキストエディターでホームディレクトリの.bashrcを開き,下記の行を探してください.

export ROS_IP=10.0.1.6
export ROS_MASTER_URI=http://10.0.1.7:11311

複数のPCを使用しない場合には,上記の2行を削除しましょう.IPが変更,もしくは接続先PCが変更の場合には,IPを変更してください.修正後は下記を実行しましょう.

$ source ~/.bashrc