これを書いた2019年10月からかなりシステムの様相は変わっていて、様々な機能を追加したりSDKを作成したりしています。この記事に書いてある内容は古くなっていてほとんど正しくないので詳しくは以下のQiitaを参照してください。 Rowma: ROSロボットネットワーク化システム
M1の末永です。
ROSベースロボットの遠隔操作をサポートするためのシステムであるRowma(ROS Web Manager)を作りました。なお、ソースコードはGitHub上で公開されています。
このシステムのコンセプトです。
Webクライアントライブラリをnpmパッケージとして配布することで誰でも使えるようにしています。 また、各ロボットの接続管理用WebSocketサーバーをこちらで提供することで簡単に使えるようにしています。
このシステムはROSベースのロボットにおいて、実行可能なroslaunchコマンドを遠隔実行するものです。例えばあるロボットで自律移動するためにroslaunch automobile automobile.launch
というコマンドを実行する必要があるとき、別のマシンのGoogleChrome上でこの端末のUUIDと上のコマンドを指定して実行ボタンを押せば該当ロボットでこのコマンドが実行されるというものです。
今までも、ROSベースで動くロボットの遠隔実行に関しては実装が数多くあるのですが、特定システムへの実装を前提としたものだったり古くて使えなかったりで、**「今ある環境に」「簡単に」「誰でも使える」**システムというものがなかったので作りました。
以下の手順で使います。
まずはロボットで以下のようにコマンドを実行していきます。なお、ROS_PACKAGE_PATH
が正しく設定されていることを確認して実行してください。
$ git clone git@github.com:asmsuechan/rowma.git
$ cp -rf rowma/rowma_ros ~/catking_ws/src
$ cd ~/catkin_ws
$ pip install "python-socketio[client]" requests Geohash
$ catkin_make
$ rosrun launch_runner launch_runner.py
次にWeb Managerを起動するPC上で以下を実行します。
$ git clone git@github.com:asmsuechan/rowma_sample.git
$ cd rowma_sample
$ npm i
$ npm run start
localhost:3000
にアクセスするとこのような画面が表示されます。
ここで表示された画面でConnect
-> Show Connection List
の順で押すとその隣のセレクトボックスに接続可能なロボットのUUID一覧が表示されます。roslaunchを実行するロボットを選択したらその隣にあるセレクトボックスで実行したいコマンドを選択肢、Execute
ボタンを押します。これによりそのロボットで指定したコマンドが実行されます。
このシステムは以下の3つのコンポーネントから構成されています。
この3つに関して少し説明します。
管理用WebSocketサーバーに接続してコマンドを受信するためのWebSocketクライアントの役割を果たすROSパッケージです。Python 2.7とROS Kineticで動作の確認をしています。GitHubリポジトリ上だとrowma_ros/
フォルダ以下のスクリプトです。
管理用WebSocketサーバーをnodejsから操作するためのnpmライブラリです。GitHubリポジトリ上だとclient_js/
フォルダ以下のスクリプトです。
このシステムを自分で使おうと思ったらこのnpmパッケージを自分のプロジェクトにnpm installしてから自前で実装する必要があります。一応サンプルアプリケーションは準備していて一通りの操作はできますがあくまでサンプルですのでこれ以上手を加えていい感じのUIにするということはしないと思います。
EC2上にConnection Managerと呼ぶWebSocketサーバーを設置しています。ROSパッケージとWebクライアントはデフォルトでこのサーバーに接続するようにしています。GitHubリポジトリ上だとconnection_manager/
フォルダ以下のスクリプトです。なおWebSocketのスクリプトはsocket.ioに頼りました。
t2.microのインスタンスを使っているのであんまりたくさんの接続があると落ちそうです。。。ちなみにこのサーバーはforeverを使ってデーモン化しています。
このシステムはWebSocketを全体で使用することでロボットに対するpush型の通信を実現しています。下の図にこのシステムの概要を示します。
各ロボットでrowmaを実行するとconnection managerに割り当てられたUUIDと実行可能なlaunchコマンド一覧を送信します。
まず、rowma_rosがUUIDとgeohashとともにConnection Managerに接続します。
そしてブラウザがUUIDと実行コマンドを指定してroslaunchコマンドを実行します。
「誰でも使える」をコンセプトとしているので、ドキュメントの充実という点については気を配りました。GitHubのREADME.mdを見れば誰でも実行できるようになっているはずです。
nodejsクライアントについては、分かりやすいAPIドキュメントにするためにasyncのドキュメントを参考にしました。
このシステムは現在IPアドレスからGeohashという場所ごとに割り当てられる文字(参考: Geohash)を使用しているのですが、精度に問題があるので別の方法で場所を特定できるようにも拡張したいと思っています。
ドキュメントの充実、とは書いたもののまだ不十分な部分はあるので適宜アップデートしていきたいです。
あと、現状ROSのKineticでしか動作確認をしていないのでMelodicなどでも動作確認をしておきたいです。
10時間くらいでガガッと組んだシステムなのですが、思ったより良い出来になったかな?と思っています。たぶんsocket.ioがWebSocketに関する諸々のめんどくさいハンドリングを引き受けてくれているからだと思います。
また、コード書いている時間よりドキュメントなどの書き物の時間が圧倒的に長くてドキュメント類も結構書いているというのも良かった点だと思っています。これから多くの人に使われるようなシステムにしていきたいです。
なお、このシステムは第20回計測自動制御学会システムインテグレーション部門講演会(SI2019 高松)で発表するものになります。