複数PCの接続設定#
班員のPCを複数台使うことで各処理を分散しながらJedyを動かすこともできる. Jedyがネットワークに接続されている状態で,それ以外の演習PC(遠隔PC)から指令値を送りセンサの表示を見るような構成になる. 本章では,そのような構成のための複数PC間でのROSのネットワーク通信方法について説明する.
また,ロボットPCにsshして作業する際に,ロボットPCにsshしている複数のPCでプログラムを実行しているbashターミナルの画面を共有できた方が便利である. そのためにtmuxやscreen,byobuといった便利なコマンドが用意されている. byobuコマンドについては付録で紹介しているので,ぜひ活用してみてほしい.
複数のPCでROSの通信を行う際の時刻同期#
複数PCを使うROSのネットワークでは,PC間で時刻の同期を行うことが重要である. topicなどのデータにはタイムスタンプという時刻のデータが付加されて送受信されるため,時刻がずれていると正常に動作しない場合がある. 以下のコマンドで時刻合わせの設定を行う. この作業は必ず同一ネットワークに接続して行うこと.
$ sudo ntpdate ntp.nict.jp
「コマンドが見つかりません」となる場合は以下でntpdateをインストールする:
$ sudo apt install ntpdate
ワイヤレスネットワーク接続#
複数PC間での通信は,それぞれのPCを同一のネットワークに接続することで行う. ROSでの通信はTCP/IPを利用しているため,IPアドレスが解決できない場合は通信ができない. 例えば,以下のような操作を行うと通信できなくなる:
ネットワークが変わるときには必ずroscore/roslaunchを一度シャットダウンし,ROS_MASTER_URIなどの再設定・確認を行う必要がある.
ROS_MASTER_URI, ROS_IP, ROS_HOSTNAMEの設定#
ROSの通信を行うには,以下の環境変数を設定する必要がある:
ROS_MASTER_URI: どこをマスタにするかの設定
ROS_IP / ROS_HOSTNAME: マスタに対する自分のIPアドレスの設定
これらの環境変数は手動で設定してもよいが(例: export ROS_IP=10.0.0.1),
本演習では,jsk_toolsパッケージで提供される便利なbash関数を利用する:
rossetlocal: ROS_MASTER_URIをlocalhostに設定する
rossetip: ROS_IPとROS_HOSTNAMEを現在のIPアドレスに設定する
rossetmaster: ROS_MASTER_URIを引数で指定されたアドレスに設定する(自分自身以外をマスタにする場合に利用)
ロボットPCの設定#
演習では,ロボットPC(JedyのUSBケーブルを接続するPC)をマスタとする. ロボットPCでは,自分がマスタになるように以下を実行する:
$ rossetlocal
$ rossetip
遠隔PCの設定#
遠隔PCでは,ロボットPCをマスタにする必要がある. まず,ロボットPCで以下のコマンドを実行して現在のIPアドレスを調べる:
$ ifconfig
もしくは
$ ip a
ロボットPCのIPアドレスが判明したら(例: 192.168.0.100),遠隔PCで以下を実行する:
$ rossetmaster 192.168.0.100
$ rossetip
環境変数の確認#
設定が正しく行われたか,以下のコマンドで確認できる:
$ echo $ROS_MASTER_URI
http://192.168.0.100:11311
$ echo $ROS_IP
192.168.0.101
重要な注意事項#
ROS_MASTER_URI,ROS_IPなどの環境変数は,ターミナルごとに設定する必要がある. つまり,新しいターミナルを開くごとに毎回実行しなければならない. また,ネットワークを切り替えた場合にも再度設定が必要である.
複数PC利用のメリットとデメリット#
ロボットPCと遠隔PCで起動するプログラムを分けることで,それぞれの計算機の処理負荷を分散できる. 一方で,PC間でネットワークを介した通信が必要となり,特に無線ネットワークを介する場合は,画像データなど大量のデータの通信は難しい.
実際に複数PCでロボットを動かす場合,計算負荷の分散というメリットと無線ネットワーク通信のデメリットのトレードオフを考えながら,どのノードをどのPCで起動すべきか判断する必要がある.
トラブルシューティング#
ネットワークの切り替え・複数PC利用時における注意点をまとめておく.
基本的な注意事項#
ROSで通信する複数のPCは同一のネットワークに接続する必要がある
wifiネットワーク切り替え時には必ずroscore/roslaunchを一度シャットダウンし,ROS_IPなどの再設定・確認を行う
IPアドレスや通信可能なネットワークが変わってしまうため
最も簡単な方法は,古いネットワークのターミナルを閉じて新しいターミナルを起動すること
ファイアウォールが有効になっていると通信ができないことがある
$ sudo ufw status
で確認し,有効化されている場合は以下を実行してファイアウォールを無効化する:
$ sudo ufw disable
その後,PCを再起動する.
EusLispで実機に接続できない場合#
EusLispで*ri*作成時に「Kinematics Simulator」と書かれた黒背景のビューワ(irtviewer)が現れた場合,実機に接続できていない状態である.
以下を確認すること:
ネットワーク接続が正しいか確認
ROS_MASTER_URIとROS_IPの設定を確認
実機側のlaunchファイル(jedy_bringup.launch.pyなど)が正常に起動しているか確認