1.はじめに
こんにちは.鈴本です.
Raspberry Pi MouseとCatを遠隔操作するためのシステムを作りました.
- 同一LANにいなくても操作できる
- 複数台あったとしても中央集権的に管理できる
などの要求から,中継サーバーを挟んでPCから遠隔地のロボットを操作できるようにします.
2.全体像と要求
全体像は上図のような感じです.
遠隔地のLAN間でも操作できるように,PCとロボットがそれぞれ中継サーバー(ここではRaspberry Pi)につなぎに行きます.
そこでデータなどをやり取りして,遠隔操作を行おう,というものです.
要求は,
- ロボット,操作PCは静的グローバルIPを必要としない.
- 中継サーバー1台あれば,複数の通信セッションも開設できる.
- データを中央で管理できる.
- LANをまたいだ遠隔操作(NAT超え)も可能である.
- 可能な限りリアルタイム性を追求する.
です.
3.構成
ロボット
- Raspberry Pi Mouse / Cat
- Ubuntu Server 16.04.5 LTS (Xenial Xerus)
- Node.js v10.14.2
- ROS kinetic
- UVC対応カメラ:LOAS MCM-15W or C270 HD WEBCAM
PC
- Microsoft Windows 10 Home 1803 (64bit)
- Google Chrome 71.0.3578.80 (Official Build) (64bit)
中継サーバー
- Raspberry Pi 3 Model B
- Ubuntu Server 16.04.5 LTS (Xenial Xerus)
- Node.js v10.14.2
通信プロトコル
- WebSocket
のような構成にしました.
操作コンソールにはブラウザを用いて,リアルタイム性より通信プロトコルはWebSocketを採用しました.
Webを使うので,サーバーサイドとロボットサイドのコードはNode.jsで実装しています.
4.環境構築
ロボットと中継サーバーへのUbuntu Serverインストール
ロボットも中継サーバーもRaspberry Piなので,公式ページよりRaspberry Pi用のイメージファイルをダウンロードしてきて,SDカードに展開します.
ここでは Unofficial images の Raspberry Pi 3: ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz (4G image, 252M compressed)
をダウンロードし,ダウンロードページに沿ってインストール,初期設定を行いました.
ロボットへデバイスドライバとRosをインストール
ロボット(Raspberry Pi Mouse / Cat)へのデバイスドライバやRosのインストールは,「Raspberry Piで学ぶ ROSロボット入門」が詳しく,それをそのまま進めただけ,かつ,ここでは本質的ではないので割愛します.
ロボットとサーバーにNode.jsをインストール
ここでNode.jsと必要なライブラリをインストールします.
ロボット側は,
$ cd $ git clone git://github.com/creationix/nvm.git ~/nvm $ ./nvm/install.sh # 再ログイン $ nvm install --lts $ nvm use --lts $ nvm alias default lts/* $ mkdir node_modules $ npm install ws $ npm install socket.io $ sudo apt install fswebcam $ npm install --save node-webcam $ npm install mic $ sudo apt install alsa-utils $ npm install pcm
で,中継サーバー側は,
$ cd $ git clone git://github.com/creationix/nvm.git ~/nvm $ ./nvm/install.sh # 再ログイン $ nvm install --lts $ nvm use --lts $ nvm alias default lts/* $ mkdir node_modules $ npm install socket.io
でいけます.
5.実装
ソースコード
ソースコードを GitHub で公開します.
/src/pi_mouse
がロボット搭載ソフトウェアで,中継サーバーからの司令に従ってロボットを操作し,またロボット側の情報を中継サーバーへ送信します.
ロボット上で,
$ node node_app_pimouse.js
で起動します.
/src/relay_server
が中継サーバーのソフトウェアで,操作コンソールをブラウザに表示させ,クライアントとロボットを対応付けし,クライアント – ロボット間のコマンド・テレメトリをやり取りします.
クライアント(PCのWebブラウザ)に対するWebサーバーとしても動作します.
中継サーバー上で,
$ node node_app_relay_server.js
で起動します.
詳細
pimouse.js / html / css
クライアントに表示するWebコンテンツです.
レイアウトはBootstrapで適当に作っています.
基本的には,ユーザーの操作に従って,それに紐付けられたイベント名とデーターを socket.emit
し,
受信したデータはイベント名と紐付けられた場所に描画(画像だったりグラフだったりコンソールだったり)しているだけです.
node_app_pimouse.js
ロボット側ソフトウェアです.
こちらも,受信したイベント名に紐付けられた操作を受信したデータに合わせて行うだけです.
ロボットの操作は,ここではデバイスファイルを通して行っています.
また,各種ロボットの内部データや音声,動画を中継サーバーに送信しています.
動画はbase64で符号化してパラパラ漫画として送り,
音声は16bitの符号付き整数でエンコードしたのをそのまま送り,クライアント側で復号しています.
node_app_relay_server.js
中継サーバーです.
パケットを中継するのがメインですが,
ロボットとクライアントの接続も管理しています.
複数のクライアント,ロボットにアクセスされても耐えられるように,
クライアントとロボットの対応付けを管理しています.
6.デモ動画
PCのブラウザでロボットを操作している動画です.
ここには写っていませんが,中継サーバーとしてRaspberry Piが部屋のコンセントの近くに転がっています.
7.今後
課題として,
- 1秒程度の遅延
- 動画の通信容量が大きい
などがあるので,改善していきたいと思います.