アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

自宅のWifiネットワーク環境をHusarnetでVPN化。ROSでホストPCとJetson nanoのVPN遠隔操作

wifiの代わりにVPNのHusarnetを設定した。このおかげで、ホストPCとjetson nano遠隔通信がほぼどこでも行えるようになった。



f:id:trafalbad:20220221171929j:plain
OpenVPN、WireGuardとかSoftEther VPNでもいいけど、HusarnetがROSをターゲットにしててかなり相性がいい。



VPNネットワーク図
f:id:trafalbad:20220220003723p:plain

注意:HusarnetではROS MASTER側(roscoreを実行するデバイス側)からしか、データ送信できないので注意。


今までのネットワーク図
f:id:trafalbad:20220220003748p:plain


環境
ホストPC: ubuntu 20.04
Jetson Nano (JetPack 4.3)



目次
1. ホストPCとJetsonにHusarnetのインストール
2. ホストPCからjetsonにデータ送信
3. JetsonからホストPCにデータ送信
4. Husarnetの作成したネットワークをリセット


1. ホストPCとJetsonにHusarnetのインストール

Husarnetにサインインする。
月額いくらか決められる。今回は実験なので月額10ドルのコースにした。

サインインしたら、デバイスやPCにHusarnetをインストール。x86とかarmとかアーキテクチャに関係なく、このサイトの通りのコマンドで簡単にインストールできる。


Husarnetは個人のネットワークを作り、その中に対象デバイスを登録して通信する仕組み。

Husarnetのインストール

# Husarnetのインストール
$ curl https://install.husarnet.com/install.sh| sudo bash

# Husarnetの自分のネットワークにデバイスを登録
$ sudo husarnet websetup


ネットワークを作り、デバイスを登録する。
Husarnetではroscoreを実行する側からデータ送信できないので注意。

# デバイスでHusarnetのネットワーク初期化
# roscoreがうまく実行できない時の初期化コマンド
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOSTNAME=localhost

2. ホストPCからJetsonにデータ送信

ホストPCをROS MASTER側にして、Jetson nanoにデータを送信。

# ホストPCの設定
export ROS_MASTER_URI=http://192.168.10.111:11311
export ROS_IP=192.168.10.111
export ROS_HOSTNAME=192.168.10.111
export ROS_IPV6=on

# Husarnetにネットワークを作成 & デバイスを登録
$ sudo husarnet websetup
>>>
#### Go to https://app.husarnet.com/husarnet/************************50eacb8a to manage your network from web browser.

$ sudo husarnet join fc94:b01d:1803:8dd8:***********************************66i mydevice
>>>
#### [154127] joining...
#### [156128] done.

hostcoreという名前のネットワークを作って、ホストPCを登録。
f:id:trafalbad:20220220005021j:plain

roscoreを実行するデバイスにはROS MASTERにチェックを入れる。
f:id:trafalbad:20220220005043j:plain

# Jetson nanoの設定
export ROS_MASTER_URI=http://192.168.10.111:11311
export ROS_IP=192.168.10.102
export ROS_HOSTNAME=192.168.10.102
export ROS_IPV6=on


Jetson nanoも同じように登録。

$ sudo husarnet websetup

$ sudo husarnet join fc94:****************************************************66i mydevice
#### [945407] joining...
#### [947408] done.

f:id:trafalbad:20220220005126j:plain

あとはホストPCからjetson nanoにデータ送信。
使うスクリプトは過去記事を参照。
trafalbad.hatenadiary.jp


# host PCからデータを送信
$ roscore
$ rosrun ros_start velocity_client.py 1.0 2.0
>>>
#### [INFO] [1645278553.788376]: set [1.000000, 2.000000] success

# Jetson nano側で受信
$ rosrun ros_start velocity_server.py
>>>
# linear: 
#   x: 1.0
#   y: 0.0
#   z: 0.0
# angular: 
#   x: 0.0
#   y: 0.0
#   z: 2.0


ちゃんとJetson nanoに座標情報が届いた。



3. JetsonからホストPCにデータ送信

Jetson nanoをROS MASTER側にして、ホストPCにデータを送る。

Jetson nanoからUSBカメラの画像を圧縮して、ホストPCに送ってみる。

今度はjetcoreというネットワークを作り、Jetson nanoとホストPCを登録。
やりかたは前と同じ。

使うスクリプトは過去記事を参照。
trafalbad.hatenadiary.jp


# Jetson nanoの設定
$ sudo husarnet websetup

$ sudo husarnet join fc94:b01d:******************************************Jq5 mydevice
#### [1610145] joining...
#### [1612146] done.

export ROS_MASTER_URI=http://192.168.10.102:11311
export ROS_IP=192.168.10.102
export ROS_HOSTNAME=192.168.10.102
export ROS_IPV6=on
# ホストPCの設定
export ROS_MASTER_URI=http://192.168.10.102:11311
export ROS_IP=192.168.10.111
export ROS_HOSTNAME=192.168.10.111
export ROS_IPV6=on

$ sudo husarnet websetup

$ sudo husarnet join fc94:b〜
#### [1610145] joining...
#### [1612146] done.
# jetson nano側でUSBカメラ画像を圧縮送信
$ roscore
$ roslaunch ros_start usb_cam.launch
$ roslaunch ros_start image_republish.launch use_compressed:=true

# ホストPC側でUSBカメラ画像を受信
$ rosrun ros_start color_vel.py
>>>
### cost time is  0.7035732269287109 [ms]
### cost time is  2.7604103088378906 [ms]
### avg time is 55.704593658447266

f:id:trafalbad:20220220005143j:plain



VPNを介してるせいか画像30枚の合計時間が自宅のwifiと比べて遅いのがわかる。

結果

  
ネットワーク環境別:30枚の合計処理時間Latency
同一wifi内(近距離) 15.2616 [ms]
VPN環境(遠距離) 55.7045 [ms]



4. Husarnetの作成したネットワークをリセット

Husarnetで作ったネットワークを削除する場合はここの上の「Dashboard」から削除やデバイスの登録などの操作ができる。


ネットワークが増えたら掃除したほうがいい。
WireGuardでもルーティングを設定すればVPNとして使えるけど、圧倒的にhusarnetの方が使いやすかった。



参考サイト

ROS.ansers:rosbridge websocket server over internet