ROS2メッセージの遠隔リアルタイムデータ伝送を実現する新プロダクトのご紹介

f:id:aptpod_tech-writer:20210728181223p:plain

Protocol/Robotics Teamの酒井 (@neko_suki) です。

今回は「ROS2メッセージの遠隔リアルタイムデータ伝送を実現する新プロダクトのご紹介」というタイトルでintdash_ros2bridgeという開発中の新プロダクトについてご紹介します。

弊社は、ROS1で任意トピックをC++ノードでPublish/Subscribeする方法を活用したROSメッセージの遠隔リアルタイムデータ伝送を行うintdash Bridge というプロダクトを提供しています。intdash Bridgeを使うことで遠隔地のROS1空間をつなぎROS1のメッセージをやり取りすることによる遠隔制御やモニタリングなどのユースケースが実現できます。

今回ご紹介するintdash_ros2bridgeは、ROS2上で「任意のROSトピック、サービス、アクションのブリッジ」を実現*1します。intdash_ros2bridgeによって遠隔地のROS2空間をつなぐことが可能になります。その結果ROS1と同様にROS2でも遠隔制御やモニタリングなどが実現できます。

現在、intdash_ros2bridgeは開発の最終段階を進めるとともに、将来のintdash_ros2bridgeの利用拡大やROSコミュニティへの貢献を視野に入れたOSS化に向けた計画も進めています。

本記事では実際に動作させてみたデモ動画と構成について紹介します。

デモ

トピック・サービス・アクションの伝送、JSON伝送の様子をキャプチャしたデモ動画を用意しました。

デモの構成とデモ画面の構成は以下のようになっています。

f:id:aptpod_tech-writer:20210729183234p:plain
デモ構成と画面構成

デモでは遠隔地を模倣するために2台のUbuntu上で別々にROS2ノードを動かします。図には書いていませんが実行を簡単に行うためにDockerコンテナを使用しています。Dockerコンテナはそれぞれ左右のターミナル上で実行されています。 それぞれのDockerコンテナはROS2で接続されないため直接トピック・サービス・アクションが届くことはありません。

tmuxコマンドでそれぞれのターミナルを分割し、「(トピック・アクション・サービスを実行する)ROS2ノード」、「intdash_ros2bridge」、「intdash Edge Agent (サーバーへのデータ伝送に使用する弊社プロダクト)」を実行します。

それでは動画をご覧ください。

intdash_ros2bridge によるROS2のトピック伝送デモ

左側のターミナルは文字列型のメッセージ "data: Hello world" をpublishします。右側のターミナルではブリッジされてインターネット経由で届いたメッセージをsubscribeします。

Dockerコンテナ間のROS2の接続が無いことを確認するために、左側のターミナルでpublishした文字列メッセージを右側のターミナルではsubscribeできないことも確認しています。

youtu.be

intdash_ros2bridge によるROS2のサービス伝送デモ

この動画では、3つの整数値を受け取り和を返すサービスを実行します。左側のターミナルで実行されるサービスクライアントは3つの整数を送信します。右側のターミナルで実行されるサービスは3つの値を加算した結果を返します。

この動画でも、Dockerコンテナ間のROS2接続が無いことを確認するために、左側のターミナルのintdash_ros2bridgeとintdash Edge Agentを停止した場合はサービスが実行されないことを確認しています。

youtu.be

intdash_ros2bridge によるROS2のアクション伝送デモ

この動画では、フィボナッチ数列を返すアクションを実行しています。 左側のターミナルで実行されるアクションクライアントはゴールリクエストとして整数値11を送信します。 右側のターミナルで実行されるアクションサーバーは、フィードバックとして長さを一つずつ増やしてフィボナッチ数列を返します。 ゴールリザルトは、長さ11のフィボナッチ数列です。

この動画でも、Dockerコンテナ間のROS2接続が無いことを確認するために、左側のターミナルのintdash_ros2bridgeとintdash Edge Agentを停止した場合はアクションが実行されないことを確認しています。

youtu.be

intdash_ros2bridge によるJSONの伝送デモ

この動画では、弊社プロダクトの「Edge Finder」を使用して、/chatter メッセージをJSONに変換して伝送させたものを表示させています。

youtu.be

記事本文では、デモの構成と技術的な実現方法を簡単に説明します。

デモ構成

デモは以下のような構成で動いています。

f:id:aptpod_tech-writer:20210729183120p:plain
デモ構成図

デモでは、2台のUbuntu上で別々にROS2を動かします。この2台のUbuntuは弊社プロダクトのintdash Edge Agent というソフトウェアによって、弊社プロダクトのintdash Server経由で双方向のデータのやり取りを行います。

intdash_ros2bridgeがROS2空間とintdash Edge Agentをつなぐ役割を担います。

具体的には、intdash_ros2bridgeは、ROS2ノードからトピック、サービス(サービスリクエスト・サービスレスポンス)、アクション(ゴールリクエスト・ゴールレスポンス、フィードバック、リザルト)を取得しシリアライズしてintdash Edge Agentに渡します。

また、intdash Edge Agentから受け取ったシリアライズされたROS2のトピックのpublish、サービス、アクションのメッセージをデシリアライズしてROS2空間内に送信します。

トピックは以下のような流れで伝送されます。

  1. 左側のUbuntu上で実行しているintdash_ros2bridgeは、ROS2ノードがpublishしたトピックをCDR(Common Data Representation)という形式にシリアライズされた状態でsubscribeします。

  2. intdash_ros2bridgeはシリアライズされたデータをintdash Edge Agentに渡します。

  3. intdash Edge Agentに渡されたデータはintdash Serverを経由して右のUbuntuで動作しているintdash Edge Agentに渡されます。

  4. 右側のUbuntu上で実行しているintdash_ros2bridgeは、intdash Edge AgentからCDRにシリアライズされたROS2のトピックを受け取ります。

  5. intdash_ros2bridgeは、CDRにシリアライズされているトピックをpublishします。

このような流れで直接接続されていないROS2空間の間でトピックの伝送を実現しています。

サービス・アクションは以下の流れ伝送されます。

  1. 左側のUbuntu上で実行しているintdash_ros2bridgeは遠隔先で動いているサービス・アクションと同名のサービス・アクションを提供します。これによって、左側のUbuntuのROS2ノードが実行したサービスリクエスト・ゴールリクエストを受け取ることが可能になります。

  2. intdash ros2bridgeは受け取ったサービスリクエスト・ゴールリクエストをCDRという形式にシリアライズし、intdash Edge Agentに渡します。

  3. intdash Edge Agentに渡されたデータはintdashサーバーを経由して右側のUbuntuで動作しているintdash Edge Agentに渡されます。

  4. 右側のUbuntu上のintdash_ros2bridgeはintdash Edge Agentから受け取ったシリアライズされたサービスリクエスト・ゴールリクエストをデシリアライズし、サービスリクエスト・ゴールリクエストを送信します。

  5. 右側のUbuntuのROS2ノードで実行されているサービス・アクションは、intdash_ros2bridgeが発行したサービスリクエスト・ゴールリクエストを受け取り、処理を行います。そして処理した結果(サービスレスポンス、ゴールレスポンス/ゴールフィードバック/ゴールリザルト)をintdash_ros2bridgeが受け取ります。intdash_ros2bridgeはここまでの流れと逆の流れで左側のUbuntuにメッセージを送信します。

このような流れで、直接接続されていないROS2空間の間でサービス・アクションの伝送を実現しています。

まとめ

今回は「ROS2メッセージの遠隔リアルタイムデータ伝送を実現する新プロダクトのご紹介」というタイトルで、intdash_ros2bridgeという「ROS2で任意のROSトピック、サービス、アクションのブリッジ」が行える開発中のプロダクトについてご紹介しました。

次回は技術にフォーカスして、9月頃に技術的な詳細を含めた進捗を紹介します。

最後までご覧いただきありがとうございました。

*1:pythonによる実装は、rosbridge_serverがありますが、本プロダクトはc++で実装しています