事象発生日:2018-12-05
記事公開日:2018-12-12
アクセス数:8772
Raspberry Piを積んだロボットを,遠隔PCからWebRTCで操作しようとして失敗した.
最終的にはRaspberry Pi上でROSを動かしたかったためUbuntu Serverを入れていたのだが,それが原因かもしれない.
トップ画像の出典はこちら.
Raspberry Pi 3
Ubuntu Server 16.04.5 LTS (Xenial Xerus)
Ruby 2.5.3p105 (2018-10-18 revision 65156) [armv7l-linux-eabihf]
Microsoft Windows 10 Home 1803 (64bit)
Google Chrome 71.0.3578.80 (Official Build) (64bit)
WebRTCのシグナリングのために,ローカルにWeb Server for ChromeでWebサーバーを建てる.
Cygwin 2.9.0(0.318/5/3) 2017-09-12 10:18 x86_64
Raspberry PiへのSSHは,WindowsコマンドプロンプトのSSHで
ロボット,PC,ともにWiFiによって同一LANにいる.
Raspberry Pi搭載ロボットであるRaspberry Pi Mouse(以下,ラズパイマウス)を,遠隔PCで動かしたい.
ラズパイマウスは(ubuntu上で動く)ROSによって制御され,Webカメラも積んでいる.
また,プラットフォームに依存させたくないので,PC側はブラウザアプリにしたい.
イメージとしては,遠隔PCでブラウザを立ち上げると,ラズパイマウスが撮影した動画とパラメタがみえ,こちらからもろもろ操作できるようなシステムである.
リアルタイム性を確保する,また枯れてきている技術を使う,などの目的から,通信はWebRTCで行う. | |
プロトタイプであるので,ロボットもPCも同一LANにおり,中間サーバーを介さない. | |
RebRTCはそもそもブラウザ同士の通信のためのAPI群であり,Raspberry PiのようなマイコンのGPIOやデバイスファイルを直接叩くことはできない.そこで,SkyWay社の低レベルなWebRTCエンジンであるSkyWay WebRTC Gatewayを用いる. | |
シグナリングサーバーにもSkyWayを用いる. |
基本的には,のチュートリアルを適宜環境に合わせながら進めていった.
まず,SkyAPIを取得.
遠隔PCのブラウザから,SkyWayへシグナリングができることを確認.
次になどを参照しながらRaspberry PiのUbuntu ServerにRubyをインストール.
そのあと,Raspberry Pi内部で$ echo "on" | nc -u localhost 10000
などと,UDP経由でロボット内部のGPIOがいじれるスクリプトを作成し,さらには遠隔PCのCygwinからも同様に$ echo "on" | nc -u ${RasPi_IP} 10000
などでできることを確認した.
Raspberry Pi側からSkyWay WebRTC GatewayへPeer作成要求をするところでつまった.
チュートリアルのスクリプトを動かすと,SkyWay WebRTC Gatewayが異常終了した.
問題を切り分けるため,最も簡易な構成として,UbuntuのコンソールからSkyWay WebRTC Gateway APIへ以下(1枚目)のようにPOSTした.
その時,SkyWay WebRTC Gatewayを動かしているコンソールは以下(2枚目)のように落ちた.
ubuntu@ubuntu:~/ruby_src$ curl -X POST "http://localhost:8000/peers" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"key\": \"${key}\", \"domain\": \"localhost\", \"peer_id\": \"test1\", \"turn\": false}" curl: (52) Empty reply from server
ubuntu@ubuntu:~/skyway/bin$ sudo ./gateway_linux_arm # # Fatal error in ../../webrtc/media/engine/webrtcvoiceengine.cc, line 264 # last system error: 0 # Check failed: 0 == voe_wrapper_->base()->Init(adm_.get(), nullptr, decoder_factory_) (0 vs. -1) # # ==== C stack trace =============================== ./gateway_linux_arm() [0x288c88] ./gateway_linux_arm() [0x47a0c8] ./gateway_linux_arm() [0x479a36] ./gateway_linux_arm() [0x465ee0] ./gateway_linux_arm() [0x46610a] ./gateway_linux_arm() [0x328a80] ./gateway_linux_arm() [0x32b372] ./gateway_linux_arm() [0x28c402] ./gateway_linux_arm() [0x3805f2] ./gateway_linux_arm() [0x28c0e8] ./gateway_linux_arm() [0x28beac] 中止 (コアダンプ)
なお,他のAPIなどでは落ちなかった.
ubuntu@ubuntu:~/ruby_src$ curl http://localhost:8000/peers/hoge/status?token=p4omg8n2rv -X GET -H "accept: application/json" { "command_type": "PEERS_STATUS", "params": { "errors": [ { "field": "peer_id", "message": "peer_id is not exists." } ] } }
考えられる原因は,OSの違い.
SkyWay WebRTC GatewayのARM版は,
想定動作環境:
・ハードウェア: Raspberry Pi 3B, 3B+
・ソフトウェア: Raspbian Version 9以降
とある.
RaspbianもUbuntuもDebian系であるので,本当に原因を切り分けるのであれば,Raspbianで再現実験をしてみるべきである.
(Ubuntuにはraspi-config
とかないし,意外と互換性ないのかも?)
なお,SkyWay WebRTC Gatewayのバージョンを変えても同様な結果となった.
他にも,webrtcvoiceengine.cc
はちゃんと調べてみたほうがよさそうかも.
ぱっとぐぐると,どうやらWebkitのmediaエンジンの一部のようだが,ちょっとまだ調べきれていない.
ハードウェアにからみそうだし,環境依存はあるかも.
メディアと聞いてちょっと気になったのは,のチュートリアルでRasbian用のカメラモジュールであるgst-rpicamsrc-masterのインストールに失敗したこと.
具体的には,$ ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/
でコケた.
今後としては,めんどくさいのでとりあえずラズパイマウス上にRailsかなにかでAPIサーバーを建てて,ブラウザ側でJavaScriptでAPIを叩いて操作するのがいいのかなぁと.
ただ,こちらから操作するのはいいのだけれど,ラズパイマウスが障害物を検知したときとか,その他緊急な事があったときに,ブラウザ側からAPIを叩かない限り情報が流れてこない,つまりリアルタイム性が悪いという問題がある.
他にも,動画配信は別の方法を組み合わせないと行けなさそう.
軽量なテキストと動画などのメディアを両方包括的にリアルタイムで相互に通信できるいい手段ってないかなぁ.プラットフォーム非依存で.
名前
Email (※公開されることはありません)
コメント