概要
最近,研究室で「モーションキャプチャでロボットの動きをトラッキングしてそのデータとロボット上のLiDARのデータをもとにリアルタイムにロボットを動作させる」必要がありました.複数のネットワークを跨いでROSを動作させる必要があったのですが,できて当然なのか,単に誰もやろうとしないのか,調べてもちょうど同じようなことをしようとしている例が見つからず若干苦戦したので,メモしておきます.なお,文章中に登場するipアドレスなどは,実物とは異なります.
条件
- ロボットにはPC1(Ubuntu 16.04LTS)が搭載されており,ethernetのポートが1つ(enp3s0)ある他,wifi(wlp112s0)を利用できる.ethernet側は固定ipアドレスが設定済み(192.168.0.100)である.このipアドレスは変更しない
- ロボットにはLiDARが1台搭載されており,ロボットのethernetポートにLANケーブル1本で接続されている.ipアドレスは192.168.0.110で,このipアドレスは変更しない
- モーションキャプチャはethernet hubを経由してPC2(Ubuntu 16.04LTS)に接続されている.PC2にはehternetのポートが1つ(enp4s0)あり,wifi(wlp114s0)も利用できる.ethernet側は固定ipアドレスが設定済み(192.168.10.200)である.このipアドレスは変更しない
- PC1とPC2は,無線で直接(市販のwifiアクセスポイントなどを介さずに)接続したい
手順
接続
まず,PC1とPC2をwifiで接続するため,Ubuntu16.04 でのアクセスポイント化を参考に,PC2をアクセスポイントとしました.これにPC1を接続すると,新たなネットワーク(10.42.0.0/24)が作られました.
PC1のwifi側ipアドレスは,10.42.0.100に固定しておきました.
これで,接続自体はできましたが,まだ各ネットワーク間のpingは通りません.
以下,複数のネットワーク間を跨いだ通信を行う環境を簡易的に作成するを参考に,設定を進めていきます.
ipフォワーディング
両PCにおいてethernet,wifiのそれぞれに来るパケットをもう一方に流して欲しいので,ipフォワーディングの設定を行います.
# iptableの設定を削除(共通.不要?)
$ iptables -t nat -F
$ iptables -F
# 双方向のipフォワーディングを設定(PC1)
$ iptables -A FORWARD -i enp3s0 -o wlp112s0 -j ACCEPT
$ iptables -A FORWARD -o enp3s0 -i wlp112s0 -j ACCEPT
# 双方向のipフォワーディングを設定(PC2)
$ iptables -A FORWARD -i enp4s0 -o wlp114s0 -j ACCEPT
$ iptables -A FORWARD -o enp4s0 -i wlp114s0 -j ACCEPT
ルーティングテーブルの設定
両PCでゲートウェイの設定を行い,もう一方のPCのethernet側ネットワークにアクセスできるようにします.
# PC1
$ ip route add 192.168.10.0/24 via 10.42.0.1 dev wlp112s0
# PC2
$ ip route add 192.168.0.0/24 via 10.42.0.100 dev wlp114s0
これで,相手PCのethernet側ネットワークへのアクセスができるようになりました.
確認
両PCのROS_MASTER_URIをPC2に設定します.
$ export ROS_MASTER_URI=http://192.168.10.200:11311
ROS_IPも設定します.
# PC1
$ export ROS_IP=192.168.0.100
# PC2
$ export ROS_IP=192.168.10.200
PC2でroscoreを起動し,rostopic pub/echo等で疎通が確認できたら,成功です.
備考
今回はUbuntuのアクセスポイント化をGUIで行いましたが,この方法だとIEEE802.11gでの接続になっているらしく,少々速度に不安があります(PointCloudのやり取りにもたついている様子.tfも怪しい).もしかしたら通信速度に起因するものでは無いかもしれませんが,create_apを使うとIEEE802.11acが使えるらしいので,いずれ試してみようと思います.