Raspberry Pi Mouse / Catを中継サーバー経由で遠隔操作


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秒程度の遅延
  • 動画の通信容量が大きい

などがあるので,改善していきたいと思います.


Posted in Raspberry Pi Cat, Raspberry Pi Mouse, ブログ