Contents
ROSは分散コンピューティングの環境です。実行しているROSのシステムは、複数のマシンにまたがって広がっている何ダースかまたは、数百のnodeによって構成できる。システムがどのように構成されているかに依存して、いつでも他のすべてのnodeと通信できる必要があります。
結果として、ROSは、ネットワークの設定にいくらかの要求があります。:
- どのマシンのどのポートに関しても完全に双方向な接続が存在すること。
- どのマシンも他のすべてのマシンが名前解決できるような名前を自分から提供できなければなりません。
以下のセクションでは、以下の二つのホストネームとIPアドレスをもつ二つのマシンでROSのシステムを実行したいと仮定しています。
- marvin.example.com : 192.168.1.1
- hal.example.com : 192.168.1.2
マスターは一つのみ起動すればいいことに注意してください;ROS/Tutorials/MultipleMachinesをご覧ください。
完全な接続
まず、hal と marvinは、完全に双方向な接続を各ポートに必要とします。
基本的な確認1: self ping
基本的な接続はpingで確認できます。
それぞれのマシンに大して自分自身にpingするように試してください、つまり halからhalにpingします:
ssh hal ping hal
問題: halをpingできない: これはつまりhalが適切に設定できていないことを意味します。
- 以下の"Name Resolution"のセクションをご覧ください。
基本的な確認 2: マシン間でping
halから marvinにpingします:
ssh hal ping marvin
以下のようなものが見えると思います.:
PING marvin.example.com (192.168.1.1): 56 data bytes 64 bytes from 192.168.1.1: icmp_seq=0 ttl=63 time=1.868 ms 64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=2.677 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=1.659 ms
逆も試します。
ssh marvin ping hal
Problem: お互いにpingができない. これはお互いのマシンを見つけられてないことを意味します。
- 更なる確認: ホスト名の代わりにIPアドレスをpingしてみます。もしそれもうまくいかないのなら、それらのマシンは同じネットワーク上に居らず、ネットワークを再構築する必要があります。 その確認も通れば、以下の"Name Resolution"をご覧ください。
更なる確認: netcat
ping はICMPパケットがマシンの間でとれるかしか確認しないのでまだ確認は十分ではありません。全てのポートで通信ができることを確かめる必要があります。これを完全に行うのは、65Kもあるポートを交互に確認しなくてはならないので、難しいです。
完全なチェックの変わりに、netcatを使って任意に選択されたポートの通信を確認することができます。1024より大きなポートを使っていることを確かめてください。1024以下は、スパーユーザの権限が必要です。netcatの実行ファイルは違うディストリビューションではncかもしれないので注意してください。
まず、hal から marvinへ通信してみます。marvinでnetcatを起動しましょう
ssh marvin netcat -l 1234
そしたらhalからつなげます:
ssh hal netcat marvin 1234
もし接続が成功したなら、2つのコンソール間で、古いチャットプログラムのように行ったり来たりタイプすることが可能になるはずです。
さて、反対で行って見ましょう。
netcatを halで起動しましょう:
ssh hal netcat -l 1234
Then connect from marvin:
ssh marvin netcat hal 1234
名前解決
ROSのnodeがtopicをアドバタイズするとき、他のnodeがtopicをサブスクライブしたいときに接続するhostname:port(URI)の組み合わせを提供します。nodeが提供するホスト名は、それにコンタクトを取りたい全てのほかのnodeによって使われうることは大切です。ROSのクライアントライブラリは、マシンが申告する名前をそのホスト名に使います。これは、hostnameコマンドによって返される名前です。
明示的に名前を設定する
もし、他のマシンによってアクセスできないホスト名を申告しているなら、ROS_IP や ROS_HOSTNAMEの環境変数(more)をセットする必要があります。
例
marvin と halの例を続けます。第3のマシンを導入したいとします。新しいartooと呼ばれるマシンはDHCPアドレスを使う(例えば10.0.0.1)ため、他のマシンは、ホスト名のartooを正しくIPアドレスに名前解決をすることができません。(これは、正しく設定されたDHCPの管理しているネットワークでは起こりえませんが、よくある問題となっています。).
この場合、marvin も halも名前によって artooに対してpingすることができませんので、 artooで実行されているアドバタイズをしているnodeにコンタクトをすることができません。解決策は、artooでnodeを始める前に環境変数のROS_IPを設定することです。:
ssh 10.0.0.1 # We can't ssh to artoo by name export ROS_IP=10.0.0.1 # Correct the fact that artoo's address can't be resolved <start a node here>
似たような問題は、マシン名は解決できても、マシンが自分の名前を知らないときにも起こります。例えば、artooは正しく10.0.0.1に解決されますが、artoo上でhostnameを実行するとlocalhostを返します。そこでROS_HOSTNAMEをセットする必要があります。
ssh artoo # We can ssh to artoo by name export ROS_HOSTNAME=10.0.0.1 # Correct the fact that artoo doesn't know its name <start a node here>
単一マシンの設定
もし、ローカルマシンでのみ実行のテストを行いたいなら( ROS Tutorialsを実行したいなら)、 , これらの環境変数を設定する必要があります。:
$ export ROS_HOSTNAME=localhost $ export ROS_MASTER_URI=http://localhost:11311
そしたらroscoreが正しく初期化するはずです。
/etc/hostsを構成する
他のオプションは/etc/hostsファイルにマシンがお互いを見つけられるように、エントリを加えることです。hostsファイルは、お互いのマシンが特定の名前をIPアドレスにどのように変換するかを教えます。 hostsファイルに関するより詳細な情報は、 this external tutorialをご覧ください。
ファイアワォールについて
もし、ファイアワォールまたはROSで使いたいマシンの間に他の障壁がある場合、それらをつなげるためにバーチャルネットワークを作成する必要があります。 openvpnをわれわれは推奨します.
ネットワークの問題をデバッグする
タイミングの問題, 未来への外挿についてのTFの問題点
いくらかのマシンのシステム時間の矛盾をもっているかもしれません。ほかのマシンに対してあるマシンの状態をチェックできます。
ntpdate -q other_computer_ip
もし矛盾があれば、chronyをインストールして(Ubuntuでは, sudo apt-get install chrony)、
そしたら、あるマシン上のchronyの構成ファイル(/etc/chrony/chrony.conf)を他のサーバを加えるように編集します。 例えば、pr2上で、コンピュータc2はc1からその時間を取得して、以下のようなラインを持ちます。:
server c1 minpoll 0 maxpoll 5 maxdelay .0005
あのマシンは、サーバに対して、その時間だけ遅くなっています。 もしずれが大きいのであれば、それをすぐにあわせることが以下を使用することで可能です。
/etc/init.d/chrony stop ntpdate other_computer_ip /etc/init.d/chrony start
(ルートとして)しかし、多くのジャンプは問題を引き起こすので、必要でなければ、これは推奨されません。