投稿日

ROSを外部ネットワークと安全に接続する方法

こんにちは、ソリューションアーキテクトの松永です。

自動運転や産業ロボットでも使われているROS(Robot Operating System)を使って遠隔にあるロボットからの映像をPCで閲覧する方法をご紹介します。

はじめに

ROSは同一ネットワークに配置されたノード間でメッセージのやり取りをして外部センサーやカメラ情報を処理しています。しかし、外部ネットワークのROSやROS以外のアプリケーションとそのメッセージをやりとりするためには、ノード間で以下のような課題があります。

  • 各PCのIPやホスト名解決の設定
  • ノード間で広範囲なポート(1025-65535)をすべて疏通させる設定

こういった課題を解決するのが Ros Bridgeです。Ros Bridgeはノード内のメッセージのやり取りをROS以外のシステムに連携するための仕組みで、メッセージをWebSocket経由で共有します。

このWebSocketのエンドポイントを外部に共有する必要がでてきますが、セキュリティについてもご安心ください。SORACOMは通常Public IPを持たないことから、このエンドポイントを共有してもインターネットからアクセスすることはできない仕組みとなっています。今回は閉域網サービスVirtual Private Gateway(VPG)を利用して構築していきます。

構成

今回の構成を見てみましょう。アプリケーションのプログラムはros-bridge-image-sharing-example@Githubにて公開しております。

  • RUT240ルーター + SORACOM SIM:ラズベリーパイが所属するネットワークで稼働するルーターです。
  • ラズベリーパイ:ラズベリー 4 Model Bを利用しました。ルーターの設定をするために、Desktop版を利用しています。
  • Robot App:Docker内で稼働する画像配信アプリケーションです。sensor_msgs/CompressedImage をPublishし、同時にRos BridgeがメッセージをJSONフォーマットにしてWebSocket経由で外部へ配信します。通常このタイミングで、画像のバイナリーデータはBase64にエンコードされ配信されています。
  • ウェブカメラ:画像配信アプローチが配信するカメラ画像を取得します。今回は、Wansview様のウェブカメラを使用いたしました。
  • PC: 今回はM1 Macを使用しております。
  • Operator App: 配信された画像データをAngularで可視化するアプリケーションです。
  • SORACOM Arc: PCからSORACOMのサービスを利用するための、VPNサービスです。PCからはSIMを利用せずに接続します。
  • Virtual Private Gateway(VPG):お客様の専用のネットワーク構成を組むためのサービスです。
  • SORACOM Gate:VPGのオプションサービスで、同一VPGに所属するSIM間でのネットワークアクセスを許可するサービスです。

手順

  1. SIMグループ、VPGの作成とGate設定
  2. ルーターRUT240設定
  3. RUT240 Firewall設定
  4. PC/Virtual SIM(SORACOM Arc)の設定
  5. SIMの確認
  6. Robot Appの実行
  7. PCでのOperator App設定
  8. 配信画像の確認
  9. パフォーマンスベンチマーク
  10. まとめ

1.SIMグループ、VPGの作成とGate設定

  1. グループ作成:ドキュメント「グループ作成」に従い、SIMグループを作成します。本ブログではグループ名をtaketo_gateとしています。
  2. VPG作成とGate設定:ドキュメント「デバイス間通信」に従ってSORACOM Gateを有効にしたVPGを作成してください。

2.ルーターRUT240設定

  1. 初期設定:こちらのガイドを従ってRUT240を初期設定してください。
  2. グループ設定:RUT240をドキュメント「グループの設定を変更する」に従って作成したグループに所属させます。
  3. Static IPの設定:SORACOMユーザーコンソールの Menu >> VPG から作成したVPGを選択し、「高度な設定」タブのIPアドレスマップからエントリを追加します。RUT240にに固定IPアドレスを割り当ててください。(例:10.198.97.225)
  4. 速度変更:ドキュメント「IoT SIM の速度クラスを変更する」に従い、通信速度をs1.4xfastに設定してください。
  5. セッションのリセット:設定を反映するために一度、セッションをリセットします。
VPGに所属するSIMへStatic IP設定

3.RUT240 Firewall設定

リモートVNCなどでRUT240にWifiで接続したラズベリーパイにアクセスしてください。RUT240の管理コンソール(デフォルト: http://192.168.1.1)へアクセスし、以下を設定してください。

  • WANからのForwardを許可
  • Firewall Fowarding設定:WANから9090ポートのアクセスをラズベリーパイのport 9090に転送します。

*注意:本番ではラズベリーパイをStatic IPに設定することをお勧め致します。

Firewall WANのForwardを許可
Firewall Forward設定(9090をラズベリーパイへ転送)

4.PC/Virtual SIM(SORACOM Arc)の設定

MacからSORACOMのサービスを利用するために、SORACOM Arcを有効にします。また、ラズベリーパイへアクセスするために、デバイスサブネットのルーティング設定を行います。

  1. バーチャルSIM作成:ドキュメント「バーチャル SIM/Subscriber で接続する」に従い、SORACOM Arcを有効にしてください。また、PCから同一VPGのデバイスにアクセスするために、arc.jsonを編集して作成したVPGのデバイスサブネット(例:10.128.0.0/9)をarcAllowedIPsに設定してください。
  2. グループ設定:ドキュメント「グループの設定を変更する」に従って作成したグループに所属させます。グループを変更した後には、Virtual SIMのセッションリセットが必要です。
taketomatsunaga@TAKETOnoMacBook-Pro arc % cat arc.json
{
  "privateKey": "***********************",
  "publicKey": "***********************",
  "simId": "89000010999***********************",
  "logLevel": 2,
  "enableMetrics": false,
  "interface": "utun",
  "profile": {
    "authKey": "secret-ZZEugP94RR***********************",
    "authKeyId": "keyId-***********************",
    "endpoint": "https://api.soracom.io"
  },
  "arcSessionStatus": {
    "arcServerPeerPublicKey": "cx***********************",
    "arcServerEndpoint": "54.150.168.252:11010",
    "arcAllowedIPs": ["100.127.0.0/16", "{作成したVPGのデバイスサブネット 例)10.128.0.0/9}"],
    "additionalAllowedIPs": [],
    "arcClientPeerIpAddress": "10.149.124.229"
  }
}

5.SIMの確認

SIMの設定をした後、SORACOMユーザーコンソールにて SIM一覧を確認してください。

  • RUT240のSIMとPCの Virtual SIMが同一のグループ(例:taketo_gate)に所属していること
  • 状態が全てオンラインであること
  • RUT240の速度クラスがs1.fxfastになっていること
設定後SIMのリスト

6.Robot Appの実行

ウェブカメラを接続した状態でラズベリーパイにsshし、次のコマンドを実行してRobot Appのコンテナを実行します。

  1. ウェブカメラをラズベリーパイに接続
  2. SSHしてRobot Appを実行:下記のコマンドを実行してアプリケーションを実行してください。
git clone git@github.com:soracom-labs/ros-bridge-image-sharing-example.git
cd ros-bridge-image-sharing-example/RobotApp/
docker build -t ros_bridge_dev:1.0 .
docker run --name=ros_bridge_dev -it \
    --volume="$PWD/:/workspace/share:rw" \
    --device=/dev/video0:/dev/video0 \
    --net=host\
    ros_bridge_dev:1.0

Dockerコンテナ内部で次のコマンドを実行して、Robot Appを実行します。

export WORKSPACE=/workspace/share
cd $WORKSPACE/catkin_ws
catkin build
source $WORKSPACE/catkin_ws/devel/setup.bash

export APP_IMAGE_FPS=5
export APP_IMAGE_QUALITY=30
export APP_CAMERA_ID=0
sudo chmod 666 /dev/video0
roslaunch app.launch
Robot App起動例

7.PCでのOperator App設定

以下のコマンドを実行してプログラムをクローンしてください。

git clone git@github.com:soracom-labs/ros-bridge-image-sharing-example.git

「SIMの確認」で確認したRUT240のIPアドレスで OperatorApp/src/environments/environment.tsの値を書き換えてください。

export const environment = {
  production: false,
  robotIp: '{RUT240のIPアドレス 例:10.198.97.225}', 
  robotPort: '9090',
};

以下のコマンドでプログラムを実行します。また、npm versionはv14.x.xであれば問題ありません。

cd ros-bridge-image-sharing-example/OperatorApp
nvm install v14.17.3
nvm use v14.17.3
npm install
ng serve

8.配信画像の確認

PC側でOperator Appのhttp://localhost:4200/にアクセスしてください。下のようにラズベリーパイからウェブカメラの映像が転送されてきているのが確認できます。

ラズベリーパイから配信されている画像

9.パフォーマンスベンチマーク

今回の結果でパフォーマンスは以下の通りでした。Robot Appの実行時に APP_IMAGE_FPS (送信頻度)や APP_IMAGE_QUALITY(画像圧縮レベル:1~100)値を変更することも可能です。

項目実績値備考
FPS(Frame Per Second)5.0APP_IMAGE_FPS=5で実行し、遅延なしでした。
画像大きさ640 × 480
画像サイズ16KバイトAPP_IMAGE_QUALITY=30で実行しました。

10.まとめ

今回は別のネットワーク(遠隔地)に所属するROSの情報を遠隔から取得する方法をご紹介しました。動画配信SaaSなどを利用せず、直接ROSの画像メッセージデータを取得し、PCで可視化する方法でした。

ROSのメッセージを外部ネットワークに共有する際には、ROS Topicをそのまま使うのではなくRos Bridgeの利用をお勧めいたします。そして、SORACOMのサービスで拠点間をセキュアに繋げましょう。

冒頭でもご紹介しましたが、プログラムはros-bridge-image-sharing-example@Githubにて公開しておりますので是非試してみてください。

松永