ROSロボットの遠隔操作をサポートするシステムを作った

2019年10月11日

追記 (2020.06.01)

これを書いた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ベースで動くロボットの遠隔実行に関しては実装が数多くあるのですが、特定システムへの実装を前提としたものだったり古くて使えなかったりで、**「今ある環境に」「簡単に」「誰でも使える」**システムというものがなかったので作りました。

使い方

以下の手順で使います。

  1. ROSのワークスペースにrowma_rosをインストール
  2. roslaunch launch_runner launch_runner.launchを実行する
  3. サンプルWeb Managerをダウンロード&起動する

まずはロボットで以下のようにコマンドを実行していきます。なお、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にアクセスするとこのような画面が表示されます。

img1

ここで表示された画面でConnect -> Show Connection Listの順で押すとその隣のセレクトボックスに接続可能なロボットのUUID一覧が表示されます。roslaunchを実行するロボットを選択したらその隣にあるセレクトボックスで実行したいコマンドを選択肢、Executeボタンを押します。これによりそのロボットで指定したコマンドが実行されます。

システム概要

このシステムは以下の3つのコンポーネントから構成されています。

  • rowma_ros(管理用ROSパッケージ)
  • npmパッケージ
  • Connection Manager(管理用WebSocketサーバー)

この3つに関して少し説明します。

rowma_ros

管理用WebSocketサーバーに接続してコマンドを受信するためのWebSocketクライアントの役割を果たすROSパッケージです。Python 2.7とROS Kineticで動作の確認をしています。GitHubリポジトリ上だとrowma_ros/フォルダ以下のスクリプトです。

npmパッケージ

管理用WebSocketサーバーをnodejsから操作するためのnpmライブラリです。GitHubリポジトリ上だとclient_js/フォルダ以下のスクリプトです。

このシステムを自分で使おうと思ったらこのnpmパッケージを自分のプロジェクトにnpm installしてから自前で実装する必要があります。一応サンプルアプリケーションは準備していて一通りの操作はできますがあくまでサンプルですのでこれ以上手を加えていい感じのUIにするということはしないと思います。

Connection Manager

EC2上にConnection Managerと呼ぶWebSocketサーバーを設置しています。ROSパッケージとWebクライアントはデフォルトでこのサーバーに接続するようにしています。GitHubリポジトリ上だとconnection_manager/フォルダ以下のスクリプトです。なおWebSocketのスクリプトはsocket.ioに頼りました。

t2.microのインスタンスを使っているのであんまりたくさんの接続があると落ちそうです。。。ちなみにこのサーバーはforeverを使ってデーモン化しています。

仕組み

このシステムはWebSocketを全体で使用することでロボットに対するpush型の通信を実現しています。下の図にこのシステムの概要を示します。

img2

各ロボットでrowmaを実行するとconnection managerに割り当てられたUUIDと実行可能なlaunchコマンド一覧を送信します。

まず、rowma_rosがUUIDとgeohashとともにConnection Managerに接続します。 img3

そしてブラウザがUUIDと実行コマンドを指定してroslaunchコマンドを実行します。 img4

ドキュメントについて

「誰でも使える」をコンセプトとしているので、ドキュメントの充実という点については気を配りました。GitHubのREADME.mdを見れば誰でも実行できるようになっているはずです。

nodejsクライアントについては、分かりやすいAPIドキュメントにするためにasyncのドキュメントを参考にしました。

改善点

このシステムは現在IPアドレスからGeohashという場所ごとに割り当てられる文字(参考: Geohash)を使用しているのですが、精度に問題があるので別の方法で場所を特定できるようにも拡張したいと思っています。

ドキュメントの充実、とは書いたもののまだ不十分な部分はあるので適宜アップデートしていきたいです。

あと、現状ROSのKineticでしか動作確認をしていないのでMelodicなどでも動作確認をしておきたいです。

まとめ

10時間くらいでガガッと組んだシステムなのですが、思ったより良い出来になったかな?と思っています。たぶんsocket.ioがWebSocketに関する諸々のめんどくさいハンドリングを引き受けてくれているからだと思います。

また、コード書いている時間よりドキュメントなどの書き物の時間が圧倒的に長くてドキュメント類も結構書いているというのも良かった点だと思っています。これから多くの人に使われるようなシステムにしていきたいです。

なお、このシステムは第20回計測自動制御学会システムインテグレーション部門講演会(SI2019 高松)で発表するものになります。