aptpod Advent Calendar 2022の16日目の担当は、開発本部ソリューションプロフェショナルGrの影山です。普段は組み込みソフト周辺の開発やインテグレーションを担当しています。
今日は、aptpodで取り組んでいる、ROSをインターネットに接続する技術について、これまでテックブログやデベロッパーズガイドで公開してきた情報だけでは分かりにくかった、導入の大まかなイメージをご紹介したいと思います。
本記事で思ったよりもROSxインターネットが簡単に実現できそう!と思って頂ければと思っています。
想定読者:ROSをインターネット経由で利用したい方、ロボットの遠隔管理、制御に興味のある方
ROSをインターネットにつなぐ技術
実際の導入の紹介の前に、前提となる弊社のプロダクトについて簡単にご紹介します。
aptpodではリアルタイム時系列データの可視化、蓄積を実現するintdashをこれまで開発して、様々なお客様に提供してきました。intdashにROSを接続することで、二つのROS空間があたかも同じローカルネットワーク上に存在するように扱えるようにすることを目的として、intdashへの接続のためのintdash Bridgeとノードを開発しました。
詳細は以下のエントリを見て頂くのが分かりやすいかと思います。
TurtleBot3をインターネット経由で制御してみる
本記事の細かい部分はそれぞれの弊社のデベロッパーズガイドやマニュアルを参照して頂くとして、作業全体の大きな流れをつかんでいただくことを第一の目標として説明していきたいと思います。
良くチュートリアルやデモで用いられるTurtleBot3とTurtleBot3が対応しているROS1を例にとって説明していますが、弊社の製品はROS2にも対応しております。
ステップ1 構成の検討
TurtleBot3では、Raspberry Piを制御用のコンピュータとして利用しています。TurtleBot3のマニュアルに従ってセットアップすると、開発元で提供されているTurtleBot3制御関連のROSノードがインストールされて、ゲームコントローラなどを接続して走行を制御できるようになります。
コントローラの入力は標準のパッケージのjoyをインストールできていれば、joy_nodeからコントローラの操作像情報を含んだjoyトピックがpublishされ、それをTurtleBot3のノードが受信して動作します。
遠隔制御を実現しようとする場合、上記のような構成を以下のように2つに分解して、遠隔制御を実現するのが一番シンプルかと思います。
intdash bridge nodeとintdash Edgeをセットで対象のデバイスにインストールすることで、ROSをintdash Serverに接続できるようになります。
intdash bridgeではROSのトピックをintdashの通信仕様に合わせて変換して、intdash Edgeを経由して、intdash Serverと送受信できるような機能を提供しています。
intdash bridgeを用いることで、joy_nodeとTurtleBot3関連ノード観点では、2つのROSの空間が透過的に繋がっているように見えるようになります。
以降のステップではこの構成を実現するために必要なステップを説明していきます。
ステップ2 intdashの環境を導入
intdash Edge*1とintdash Bridgeはそれぞれパッケージが公開されているのでLinux環境*2であれば簡単にインストールできます。
- intdash Edge(intdash Edge Agent)のインストール(詳細)
sudo apt-get install intdash-edge
- intdash Bridgeのインストール(詳細)
sudo apt-get install ros-noetic-intdash-bridge
(ROS1:Noeticの場合)
ステップ3 Edgeの作成
intdashではEdgeの管理や、アップロードされたデータの管理、可視化のために、各種Webアプリケーションも提供しています。 Edge Admin Console画面のGUI操作で、intdashサーバ上で仮想的なEdgeを簡単に生成できます。
Edgeの生成時には、各々のEdgeを識別するためのUUIDと、サーバ接続時に利用するシークレットIDのペアが発行されるので、それらのIDを手元に控えます
ステップ4 設定ファイルの書き換え
作成したEdge情報を踏まえて、関連する設定ファイルを書き換えていきます。 設定ファイルの全体ではなく、ポイントとなる部分を抜粋して例を記載しています。 設定対象ファイルのパスは代表的なものを示していますが、運用環境に応じて自由に変更可能です。
intdash Edge(コントローラ側)
編集対象:/etc/opt/intdash/manager.conf
空欄の部分に接続先のintdashサーバのアドレス、EdgeのUUIDとシークレットIDを記入します。
以下のようなloggersにintdash Bridgeで使用するFIFOの設定を追記します。
"connections": [ { "fifo_tx": "/var/run/intdash/logger_001.tx", 注:intdash Edgeとintdash Bridgeの間の通信で使うFIFOを指定しています "fifo_rx": "/var/run/intdash/logger_001.rx", "channel": 1 } ], "details": { "plugin":"fifo", "plugin_dir": "$LIBDIR/plugins" }
clientsのtype:realtimeに"dst_id": ["<TurtleBot3のEdge UUID>"]
を記載する。
intdash Edge(TurtleBot3側)
編集対象:/etc/opt/intdash/manager.conf
空欄の部分に接続先のintdashサーバのアドレス、EdgeのUUIDとシークレットIDを記入します。
loggersにintdash Bridgeで使用するFIFOの設定を追記します(コントローラと同じく)。
clientsのtype:controlを追加して、以下のようなコントローラEdgeからサーバにアップロードされたデータを受信する設定を行います。
"ctlr_id": "<コントローラのEdge UUID>", "ctlr_flt_ids": [ "/joy" 注:joyトピックを受け取るという意味 ], "ctlr_ch": 1, "ctlr_dtype": 14 注:バイナリデータを受け取るという意味の設定
intdash Bridge(コントローラ側)
編集対象:/etc/opt/intdash/params.yaml
サーバへ送信して他のEdgeと共有したいトピック名をここで指定します。
incoming: enabled: false # サーバからのデータは受信しない queue_size: 100 suffix: "" outgoing: enabled: true # サーバへデータを送信する max_array_size: 500 topics: - topic_name: "/joy" # アップロードしたいトピック名 send_mode: "raw" queue_size: 500
intdash Bridge(TurtleBot3側)
編集対象:/etc/opt/intdash/params.yaml
サーバからの受信を有効にします。
incoming: enabled: true # サーバから来るデータをROSに送り出す queue_size: 100 suffix: "" outgoing: enabled: false # サーバにデータは送らない
ROS launch(コントローラ側、TurtleBot3側共通)
既存のノードの起動設定に加えて、intdash Bridge のノードを起動する設定をlaunchファイルに追記します。
launchファイルの編集例
<arg name="paramsfile" default="/etc/opt/intdash/params.yaml" /> 注:前ステップで編集した設定ファイルをここで指定します <node pkg="intdash_bridge" name="intdash_bridge" type="intdash_bridge_node" output="screen" clear_params="true"> <param name="fifo_tx_raw" value="/var/run/intdash/logger_001.tx" /> 注:intdash Edgeの設定と合わせて、intdash Edgeとintdash Bridgeの間の通信で使うFIFOを指定しています <param name="fifo_rx_raw" value="/var/run/intdash/logger_001.rx" /> <rosparam command="load" file="$(arg paramsfile)" /> </node>
ステップ5 動作確認
次のようなステップで起動させることで、動作を確認できます。
- intdash Edgeの起動
- パッケージと共にインストールされている
/etc/systemd/system/intdash-edge.service
をsystemctlで起動させます*3。
- パッケージと共にインストールされている
- ROS launchの実行
- インターネットに接続した環境で、roslaunchコマンドを使い前のステップで設定した環境を起動させます。設定に問題なければ以下の動画のようにコントローラでの遠隔操作ができようになっているはずです。
終わりに
今日はaptpodのROSに関する取り組みをご紹介しました。いかがだったでしょうか? ネットワーク越えの設定は難しいように思われますが、intdashと組み合わせてステップを踏んで設定していくとで、意外と簡単にROSのネットワーク接続ができることが伝わっていると幸いです。
現在、aptpodでは、今日紹介したROSやその他の環境も想定してリアルタイムでインタラクティブな管制制御システムの迅速な構築を可能にするintdash CONTROL CENTERというソリューションフレームワークを開発しています。
昨日の記事に詳細が書かれていますので、気になった方はそちらも合わせてご覧ください。