ROS 使い方メモ

ROSネットワーキング

本章ではネットワークを用いて複数台の計算機上にあるROSノード間で通信する方法を説明する。
例えば、2台の計算機roomba(Roombaに搭載するラップトップパソコン)とdesktop(命令処理用のデスクトップパソコン)の接続を考える。2台のPCは共に同じLANに接続されている必要がある。

.1 IPアドレスにホスト名を割り当てる。

ネットワーク上の計算機を識別にはIPアドレスが使用されるが、これは人間にとって理解しがたい。そこでIPアドレスにホスト名を割り振り、各Terminalをホスト名で管理する。

まずは各計算機においてifconfigを実行し、ipアドレスを確認する。

$ ifconfig

eth0      Link encap:イーサネット  ハードウェアアドレス 00:1a:a0:bb:38:53  
          inetアドレス:192.168.1.21  ブロードキャスト:192.168.1.255
          マスク:255.255.255.0
          inet6アドレス: fe80::21a:a0ff:febb:3853/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:39972 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:28601 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:48538165 (48.5 MB)  TXバイト:4022694 (4.0 MB)割り込み:16

ここでroombaのIPアドレスが192.168.1.21、desktopのIPアドレスが192.168.1.27であるとする。

ホスト名の登録は各Terminalのホスト名リストを編集することで行われる。
次のコマンドでエディタが起動し、hostsを編集することができる。

$ sudo gedit /etc/hosts

リストに2台のIPアドレスと割り振るホスト名を記述し、保存する。

192.168.1.21 roomba
192.168.1.27 desktop

pingを用いてホスト名による接続確認を行う。
desktopからroombaにpingする場合、desktopに次のコマンドを入力する。

$ ping roomba

通信が成功している場合、次のように表示される。

64 bytes from roomba (192.168.1.21): icmp_seq=1 ttl=64 time=422 ms
64 bytes from roomba  (192.168.1.21): icmp_seq=2 ttl=64 time=0.849 ms
64 bytes from roomba  (192.168.1.21): icmp_seq=3 ttl=64 time=1.53 ms
64 bytes from roomba (192.168.1.21): icmp_seq=4 ttl=64 time=0.938 ms
64 bytes from roomba (192.168.1.21): icmp_seq=5 ttl=64 time=1.48 ms

pingはエンドレスに行われるため、CTR+zで終了する。

.2 接続

最初に、ROSノード間で通信をする場合、ubuntuのファイアウォールを無効にする必要がある。
ファイアウォールの無効化は

$ sudo ufw disable

ファイアウォールの有効化は

$ sudo ufw enable

で行える。

ROSノードを実行する場合、ノードやトピックなどを管理するマスターであるroscoreを起動しなければならない。今回のように複数台の計算機上で一つのシステムを構築する場合では、いずれか1台の計算機上でroscoreを動作させる。ここではdesktop上でroscoreを起動するとする。

まずはdesktop上でroscoreを起動する。

desktopのTerminalを起動し、次のコマンドで自分のホスト名とマスターのホスト名を入力する。 その後、desktop自身がマスターであるのでroscoreを起動する。

$ Export ROS_HOSTNAME=desktop
$ export ROS_MASTER_URI=http://desktop:11311
$ roscore

次にroomba上でノード(turtlesim_node)を起動する。

先ほどと同様に自分のホスト名とマスターのホスト名を入力する。 ただし、マスターはroscoreを起動しているdesktopである。
そしてturtlesim_nodeを起動する。roomba上でroscoreが起動していないにも関わらず、ノードが動作していることが分かる。

$ Export ROS_HOSTNAME=roomba
$ export ROS_MASTER_URI=http://desktop:113::
$ rosrun turtlesim turtlesim_node

最後にdesktopでノード(turtle_teleop_key)を起動する。

新しいTerminalを起動し、次のコマンドで自分のホスト名とマスターのホスト名を入力する。 このホスト名の登録はTerminal毎に行う必要がある。

$ Export ROS_HOSTNAME=desktop
$ export ROS_MASTER_URI=http://desktop:11311
$ rosrun turtlesim turtle_teleop_key

desktopの矢印キー操作によりroomba上の亀のグラフィックが操作できれば成功だ。

.3 できないとき

Pingが失敗するようになった

→IPアドレスが変化していないか?
DHCPにより動的なIPアドレスの割り振りを行っている場合は、接続の際に各計算機のIPアドレスが変化する可能性がある。今後接続トラブルが発生した場合、IPアドレスとホスト名との対応付けをチェックする必要がある。また、固定IPアドレスを推奨する。

roscoreが起動できなくなった。

→Hostsファイルの編集の際に、デフォルトで記述されていたホストの割り当てを書き換えていないか?
デフォルトのホスト名を変更してしまうと、ROSが計算機を参照できない。必ずデフォルトの下方に追加記述する。

ノードが正しく起動しない

→ファイアウォールは無効になっているか?


HOME > ROS 使い方メモ > ROS ネットワーキング