MENU

溶けかけてるうさぎ HP GALLERY BLOG TOP RECENT ARTICLES POPULAR ARTICLES ABOUT THIS BLOG

CATEGORY

大学 (140) 仕事 (17) 航空宇宙 (104) 写真 (77) 旅行 (32) 飯・酒 (17) コンピュータ (118) その他 (44)

TAG

ARCHIVE

RECENT

【カメラ】X100 シリーズが好きすぎる(主にリーフシャッタ) 【カメラ】X100V から X100VI に買い替えました 【自宅サーバー】Google Domains から Cloudflare にドメインを移管 【カメラ】FUJIFILM XF レンズのサイズ比較ができるようにしてみた 【写真】自作写真閲覧ページにてフィルムシミュレーションで写真をフィルタできるようにした

【WebRTC】Raspberry Pi搭載ロボットをWebRTCで遠隔操作しようとして失敗した

事象発生日:2018-12-05

記事公開日:2018-12-12

アクセス数:8509

Raspberry Piを積んだロボットを,遠隔PCからWebRTCで操作しようとして失敗した.

最終的にはRaspberry Pi上でROSを動かしたかったためUbuntu Serverを入れていたのだが,それが原因かもしれない.

 

トップ画像の出典はこちら

1.動作環境

ロボット

Raspberry Pi Mouse

Raspberry Pi 3

Ubuntu Server 16.04.5 LTS (Xenial Xerus)

Ruby 2.5.3p105 (2018-10-18 revision 65156) [armv7l-linux-eabihf]

遠隔PC

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にいる.

2.やろうとしたこと

Raspberry Pi搭載ロボットであるRaspberry Pi Mouse(以下,ラズパイマウス)を,遠隔PCで動かしたい.

ラズパイマウスは(ubuntu上で動く)ROSによって制御され,Webカメラも積んでいる.

また,プラットフォームに依存させたくないので,PC側はブラウザアプリにしたい.

 

イメージとしては,遠隔PCでブラウザを立ち上げると,ラズパイマウスが撮影した動画とパラメタがみえ,こちらからもろもろ操作できるようなシステムである.

3.構成

リアルタイム性を確保する,また枯れてきている技術を使う,などの目的から,通信はWebRTCで行う.
プロトタイプであるので,ロボットもPCも同一LANにおり,中間サーバーを介さない.
RebRTCはそもそもブラウザ同士の通信のためのAPI群であり,Raspberry PiのようなマイコンのGPIOやデバイスファイルを直接叩くことはできない.そこで,SkyWay社の低レベルなWebRTCエンジンであるSkyWay WebRTC Gatewayを用いる.
シグナリングサーバーにもSkyWayを用いる.

4.やったことと詰まったところ

やったこと

基本的には,のチュートリアルを適宜環境に合わせながら進めていった.

 

まず,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."
      }
    ]
  }
}

5.原因と今後

考えられる原因は,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を叩かない限り情報が流れてこない,つまりリアルタイム性が悪いという問題がある.

 

他にも,動画配信は別の方法を組み合わせないと行けなさそう.

 

 

軽量なテキストと動画などのメディアを両方包括的にリアルタイムで相互に通信できるいい手段ってないかなぁ.プラットフォーム非依存で.

6.出典

RT MicroMouse. Raspberry Pi Mouse. Retrieved December 12, 2018, from https://products.rt-net.jp/micromouse/raspberry-pi-mouse
GitHub. SkyWay WebRTC Gateway. Retrieved December 12, 2018, from https://github.com/skyway/skyway-webrtc-gateway
Qiita. SkyWay WebRTC Gatewayハンズオン. Retrieved December 12, 2018, from https://qiita.com/nakakura/items/faeb4f6df82677139761
swagger. SkyWay WebRTC Gateway REST API. Retrieved December 12, 2018, from http://35.200.46.204/
Qiita. UbuntuにRubyをインストールした話. Retrieved December 12, 2018, from https://qiita.com/toshi726/items/f212916dfc9a103f7cfa

関連記事

コメントを投稿

名前

Email (※公開されることはありません)

コメント