3. チュートリアルA: intdash Bridgeを使って2つのROS空間を接続する

このチュートリアルでは、intdash Bridge、intdash Edge Agent、intdashサーバーを使用することにより、インターネットを介して2つのROS空間を接続します。

publisherとsubscriberの例として、 ROS公式チュートリアル のtalkerとlistenerを使用します。

../_images/intdash-bridge-bidirectional.ja.png

図 2 2つのROS空間を接続する

  • 送信側のROS空間では、talkerが"chatter"というトピックにROSメッセージをパブリッシュします。

  • 受信側のROS空間では、listenerが、同じく"chatter"というトピックをサブスクライブします。

3.1. 送信側エッジを準備する

送信側の環境に、 使用方法 の手順に従ってintdash Edge Agentおよびintdash Bridgeをインストールしてください。 その上で、以下のように設定を行います。

3.1.1. ROSノードを設定する

  1. 以下のコマンドを実行し、ワークスペースとなるディレクトリを作成します

    $ mkdir -p ~/catkin_ws/src
    
  2. ワークスペース内に、beginner_tutorialsパッケージを作成します。

    $ cd ~/catkin_ws
    $ cd src/
    $ catkin_create_pkg beginner_tutorials
    
  3. ROS公式チュートリアルのtalkerノードのスクリプトをワークスペースにダウンロードします。

    $ cd beginner_tutorials/
    $ mkdir scripts
    $ cd scripts/
    $ wget \
      https://raw.github.com/ros/ros_tutorials/indigo-devel/rospy_tutorials/001_talker_listener/talker.py
    $ chmod +x talker.py
    
  4. ビルドを実行します。

    $ cd ~/catkin_ws/
    $ catkin_make
    
  5. launchファイル( ~/catkin_ws/sender.launch )を作成し、talkerノードとintdash_bridgeノードの起動を以下のように設定します。

    パラメーター fifo_tx_raw では、intdash Bridgeからintdash Edge Agentにデータを渡すためのFIFO(logger_001.tx)を設定しています。

    sender.launch

    <launch>
        <node name="talker" pkg="beginner_tutorials" type="talker.py" />
        <arg name="paramsfile" default="/opt/vm2m/etc/params.yaml" />
        <group ns="intdash">
            <node pkg="intdash_bridge" name="intdash_bridge" type="intdash_bridge_node"
                output="screen" clear_params="true">
            <param name="fifo_tx_raw" value="/opt/vm2m/var/run/intdash/logger_001.tx" />
            <param name="fifo_rx_raw" value="" />
            <param name="fifo_tx_json" value="" />
            <rosparam command="load" file="$(arg paramsfile)" />
            </node>
        </group>
    </launch>
    

3.1.2. 送信側intdash Edge Agentを設定する

intdash Edge Agentの設定ファイルmanager.confで、以下のように設定します。

主な設定内容:

  • 送信側エッジの認証情報(クライアントシークレット)とUUID( my_secretmy_id

  • intdashサーバーのホスト名+ドメイン名(FQDN) ( host )

  • 受信側エッジのUUID( dst_id

  • intdash Bridgeからデータを受け取るFIFO( logger_001.tx を使用し、チャンネル1を付与)

注釈

旧来のエッジの認証情報(トークン)を使用する場合は、 my_secret の代わりに my_token をご使用ください。

manager.conf

{
   "manager":{
      "workdirs":[
         "/opt/vm2m/var/lib/intdash/meas",
         "/opt/vm2m/var/run/intdash"
      ],
      "rawdir":"/opt/vm2m/var/lib/intdash/raw",
      "meas_root":"/opt/vm2m/var/lib/intdash/meas",
      "basetime":"/opt/vm2m/var/run/intdash/basetime",
      "stat":"/opt/vm2m/var/run/intdash/manager.stat",
      "system_stat":"/opt/vm2m/var/run/intdash/system.stat",
      "process_stat":"/opt/vm2m/var/run/intdash/process.stat",
      "wwan_stat":"/opt/vm2m/var/run/intdash/wwan.stat",
      "filters":[]
   },
   "clients":[
      {
         "protocol":"mod_websocket.v2",
         "type":"realtime",
         "my_secret":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
         "my_id":"XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
         "connection":{
            "host":"xxxxxxx.intdash.jp",
            "path":"/api/v1/ws/measurements"
         },
         "dst_id":[
            "YYYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY"
         ],
         "fifo_rx":"/opt/vm2m/var/run/intdash/client_realtime.rx",
         "fifo_tx":"/opt/vm2m/var/run/intdash/client_realtime.tx",
         "path":"/opt/vm2m/sbin/intdash-edge-client",
         "stat":"/opt/vm2m/var/intdash/client_realtime.stat",
         "fast_net_check_cmd":"/opt/vm2m/bin/intdash-edge-networkd.sh -q -t"
      },
      {
         "protocol":"mod_http",
         "type":"resend",
         "my_secret":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
         "my_id":"XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
         "connection":{
            "host":"xxxxxxx.intdash.jp",
            "path":"/api/v1/measurements"
         },
         "fifo_rx":"/opt/vm2m/var/run/intdash/client_resend.rx",
         "fifo_tx":"/opt/vm2m/var/run/intdash/client_resend.tx",
         "path":"/opt/vm2m/sbin/intdash-edge-client",
         "stat":"/opt/vm2m/var/run/intdash/client_resend.stat",
         "fast_net_check_cmd":"/opt/vm2m/bin/intdash-edge-networkd.sh -q -t"
      }
   ],
   "loggers":[
      {
         "devicetype":"intdash_bridge",
         "path":"",
         "connections":[
            {
               "fifo_tx":"/opt/vm2m/var/run/intdash/logger_001.tx",
               "channel":1
            }
         ],
         "details":{
            "plugin":"fifo"
         }
      }
   ]
}

3.1.3. 送信側intdash Bridgeを設定する

intdash Bridge用パラメーター設定ファイル( /opt/vm2m/etc/params.yaml )を以下のように作成します。

ここでは、トピック "/chatter"を、rawモードでintdashに送信するように設定しています。

params.yaml

outgoing:
  enabled: true
  buffering: false
  advertise_interval: 5
  max_array_size: 500
  topics:
  - topic_name: "/chatter"
    send_mode: "raw"
    queue_size: 100

incoming:
  enabled: false
  queue_size: 100
  suffix: ""

3.2. 受信側エッジを準備する

受信側の環境にも、 使用方法 の手順に従ってintdash Edge Agentおよびintdash Bridgeをインストールしてください。 その上で、以下のように設定を行います。

3.2.1. ROSノードを設定する

  1. 以下のコマンドを実行し、ワークスペースとなるディレクトリを作成します

    $ mkdir -p ~/catkin_ws/src
    
  2. ワークスペース内に、beginner_tutorialsパッケージを作成します。

    $ cd ~/catkin_ws
    $ cd src/
    $ catkin_create_pkg beginner_tutorials
    
  3. ROS公式チュートリアルのlistenerノードのスクリプトをワークスペースにダウンロードします。

    $ cd beginner_tutorials/
    $ mkdir scripts
    $ cd scripts/
    $ wget \
      https://raw.github.com/ros/ros_tutorials/indigo-devel/rospy_tutorials/001_talker_listener/listener.py
    $ chmod +x listener.py
    
  4. ビルドを実行します。

    $ cd ~/catkin_ws/
    $ catkin_make
    
  5. launchファイル( ~/catkin_ws/receiver.launch )を作成し、listenerノードとintdash_bridgeノードの起動を以下のように設定します。

    パラメーター fifo_rx_raw では、intdash Bridgeがintdash Edge Agentからデータを受け取るためのFIFO(logger_001.rx)を設定しています。

    receiver.launch

    <launch>
        <node name="listener" pkg="beginner_tutorials" type="listener.py" output="screen" />
        <arg name="paramsfile" default="/opt/vm2m/etc/params.yaml" />
    
        <node pkg="intdash_bridge" name="intdash_bridge" type="intdash_bridge_node"
            output="screen" clear_params="true">
            <param name="fifo_tx_raw" value="" />
            <param name="fifo_rx_raw" value="/opt/vm2m/var/run/intdash/logger_001.rx" />
            <param name="fifo_tx_json" value="" />
        <rosparam command="load" file="$(arg paramsfile)" />
        </node>
    </launch>
    

3.2.2. 受信側intdash Edge Agentを設定する

intdash Edge Agentの設定ファイルmanager.confで、以下のように設定します。

主な設定内容:

  • 受信側エッジの認証情報(クライアントシークレット)とUUID( my_secretmy_id

  • 送信側エッジのUUID( ctlr_id

  • intdashサーバーのホスト名+ドメイン名(FQDN) ( host )

  • intdashから受け取るデータの設定( ctlr_filts

  • intdash Edge Agentからintdash Bridgeにデータを渡すためのFIFO(チャンネル1のデータを、 logger_001.rx に渡す)

注釈

旧来のエッジの認証情報(トークン)を使用する場合は、 my_secret の代わりに my_token をご使用ください。

manager.conf

{
   "manager":{
      "meas_root":"/opt/vm2m/var/intdash/meas",
      "rawdir":"/opt/vm2m/var/intdash/raw",
      "basetime":"/opt/vm2m/var/intdash/basetime",
      "stat":"/opt/vm2m/var/intdash/manager.stat",
      "logger_stat":"/opt/vm2m/var/intdash/logger_%03hhu.stat",
      "process_stat":"/opt/vm2m/var/intdash/process.stat",
      "intdash_stat":"/opt/vm2m/var/intdash/intdash.stat",
      "network_stat":"/opt/vm2m/var/intdash/network.stat",
      "system_stat":"/opt/vm2m/var/intdash/system.stat",
      "wwan_stat":"/opt/vm2m/var/intdash/wwan.stat",
      "workdirs":[
         "/opt/vm2m/var/lib/intdash/meas",
         "/opt/vm2m/var/run/intdash"
      ],
      "filters":[]
   },
   "clients":[
      {
         "path":"/opt/vm2m/sbin/intdash-edge-client",
         "protocol":"mod_websocket.v2",
         "type":"control",
         "fifo_rx":"/opt/vm2m/var/intdash/client_control.rx",
         "fifo_tx":"/opt/vm2m/var/intdash/client_control.tx",
         "stat":"/opt/vm2m/var/intdash/client_control.stat",
         "my_secret":"YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
         "my_id":"YYYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
         "connection":{
            "host":"xxxxxxxx.intdash.jp",
            "port":443,
            "path":"/api/v1/ws/measurements",
            "ca":"/opt/vm2m/etc/ssl/certs/cacert.pem",
            "ssl":"secure",
            "opts":[]
         },
         "ctlr_id":"XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
         "ctlr_flts":[
            {
               "channel":1,
               "dtype":14,
               "ids":[
                  "/chatter"
               ]
            }
         ]
      }
   ],
   "loggers":[
      {
         "devicetype":"system",
         "path":"",
         "connections":[
            {
               "channel":255
            }
         ],
         "details":{
            "plugin":"status",
            "plugin_dir":"/opt/vm2m/lib/plugins",
            "plugin_arg":{
               "mc7430_cli":"/opt/vm2m/sbin/mc7430_cli",
               "stintd":{
                  "meas_root":"/opt/vm2m/var/intdash/meas"
               },
               "stsys":{
                  "storage_dir":"/"
               }
            }
         }
      },
      {
         "connections":[
            {
               "fifo_rx":"/opt/vm2m/var/run/intdash/logger_001.rx",
               "channel":1
            }
         ],
         "details":{
            "plugin":"fifo"
         }
      }
   ]
}

注釈

受信するデータの指定

上記の例のとおり、受信するデータはControlクライアントに関する設定の ctlr_flts で指定しています。

  • dtype では、受信するデータのiSCPデータタイプを十進法で指定します。上の設定で指定されている 14 はデータタイプ「Bytes」を指します。

  • ids では、受信するデータIDを指定します。

3.2.3. 受信側intdash Bridgeを設定する

intdash Bridge用パラメーター設定ファイル( /opt/vm2m/etc/params.yaml )を以下のように作成します。

intdash Bridgeは、intdash Edge Agentから受け取ったメッセージをすべてROS空間へパブリッシュするため、トピックの指定は必要ありません。

params.yaml

outgoing:
  enabled: false

incoming:
  enabled: true
  queue_size: 100
  suffix: ""

3.3. メッセージの送信を開始する

送信側エッジと受信側エッジをそれぞれ起動します。

送信側

ワークスペースで setup.bash を実行することによりワークスペースの設定を有効にし、 roslaunch によりtalkerと送信側intdash Bridgeを起動します。

$ cd ~/catkin_ws
$ source devel/setup.bash
$ roslaunch sender.launch

別のターミナルで、以下のコマンドを実行してintdash Edge Agentを起動します。

$ sudo LD_LIBRARY_PATH=/opt/vm2m/lib /opt/vm2m/sbin/intdash-edge-manager -C manager.conf

受信側

ワークスペースで setup.bash を実行することによりワークスペースの設定を有効にし、 roslaunch によりlistenerと受信側intdash Bridgeを起動します。

$ cd ~/catkin_ws
$ source devel/setup.bash
$ roslaunch receiver.launch

別のターミナルで、以下のコマンドを実行してintdash Edge Agentを起動します。

$ sudo LD_LIBRARY_PATH=/opt/vm2m/lib /opt/vm2m/sbin/intdash-edge-manager -C manager.conf

受信側で以下のような出力が出力されれば成功です。

[INFO] [1624435399.116440641]: Upstream disabled.
[INFO] [1624435399.117253533]: Downstream enabled.
[INFO] [1624435399.612276354]: Advertising to /chatter
[INFO] [1624435399.706018]: /listenerI heard hello world 1624435399.67
[INFO] [1624435399.809872]: /listenerI heard hello world 1624435399.77