はじめに
「Raspberry Pi用赤外線カメラPi NoIRの映像をandroidで表示してみた」で、Raspberry Piの赤外線カメラの映像をandroidにストリーミングしてみましたが、
Raspberru Piの性能では解像度320x240、フレームレート10fps程度が安定に動作する限界でした。
USBカメラを用いてもこれは大差ないと思います。
2014/3/21(金)に秋葉原で開催されるAndroid Bazaar and Conference 2014 Spring (ABC2014S)
でもこのような動画のストリーミングを用いた展示を行おうと考えているのですが、
320x240の10fpsでは動画のクオリティとしては少し物足りないです。
そのため、Raspberry Piよりも高性能なボードが必要になります。
気になるのはBeagleBoneBlackだったのですが、ABC2014Sではコンセントが使えるので、
より高性能なボードを使って確実な動作を目指すことにしました。
そこで用いたのが、職場で余っていたPandaBoard ESです。
以下、PandaBoard ESにUbuntuを導入し、mjpg-streamerを動かすまでの解説です。
OSのインストール
Omap4用のUbuntu 12.04 Serverをこちらの解説に従いインストールします。SDカードへの書き込みは私の場合PC上のUbuntuで下記のように行いました。
/dev/sdeの部分は環境に応じて書き換えます。
$ sudo dd bs=4M if=ubuntu-12.04-preinstalled-server-armhf+omap4.img of=/dev/sde
書き込んだSDカードをPandaBoard ESに差します。
さらに、シリアルケーブルでPCとPandaBoard ESを接続し、
115200bpsでPCからPandaBoardにシリアル接続しておきます。
以上の準備の元、電源を投入すると、インストールが始まります。
デフォルトのネットワークインターフェイスはここでは有線のeth0を選択しましたが、
後でWifiドングルの設定を行うので、ここではネットワークの設定をスキップしました。
途中、インストールするパッケージを聞かれますので
- Basic Ubuntu server
- OpenSSH server
Wifiの設定
まず、ネットワークの接続にWifiを用いたかったのでその設定をします。Ubuntuをインストールするとボード上のWifiデバイスがwlan0として使えるのですが、
技適の問題があることと、パフォーマンスがあまり良くないらしい(ただし試してない)ことの
2点より、市販のWifiドングルを用いることにしました。
用いたのはIO-DATAのWN-G150Uです。
まず、ボード上のWifiデバイスを無効にするために、 /etc/modprobe.d/blacklist.conf の末尾に
下記の内容を追記します。
blacklist wl12xx_sdio
記述したら再起動し、Wifiドングルをさします。
$ ifconfig -a
を実行し、wlan0が存在することを確認します。
wlan1となっていたら、 /etc/udev/rules.d/70-persistent-net.rules を編集して
wlan0として認識されるようにします。
次に、 /etc/network/interfaces の末尾にに下記の内容を追記します。
これは192.168.1.9という固定IPアドレスとするための設定なので、
環境に応じて書き換えます。
auto wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet static address 192.168.1.9 netmask 255.255.255.0 gateway 192.168.1.1
次に、/etc/wpa_supplicant/wpa_supplicant.confを作成し例えば下記のように記述します。
接続先のSSID、暗号化プロトコル、パスフレーズなどは環境に応じて変更します。
network={ ssid="YOUR SSID" proto=RSN key_mgmt=WPA-PSK pairwise=CCMP group=CCMP psk="YOUR_PASSPHRASE" }
最後に、/etc/resolv.confを作成してDNSサーバーを記述します。例えば下記の通り。
本当はresolvconfに自動生成させるらしいのですが
Server版のためかうまくいかなかったので手作業で記述しました。
nameserver 192.168.1.1
以上の設定がうまくいくと、再起動によりWifiでネットワークに接続されているはずです。
mjpg-streamerのインストール
まず、OSを最新にします。$ sudo apt-get update $ sudo apt-get upgrade
そして、mjpg-streamerのビルドに必要な下記をインストールします。
$ sudo apt-get install build-essential libjpeg8-dev libv4l-dev imagemagick subversion
それが済んだら、下記のようにmjpg-streamerのダウンロードからビルドまで行います。
$ cd ~/ $ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer $ cd mjpg-streamer $ make
mjpg-streamerの起動
起動の前に、/etc/modprobe.d/blacklist.conf の末尾にblacklist snd_usb_audio
を記述して再起動しておきます。一部のUSBカメラとUSBオーディオのドライバとの相性が悪いためです。
このあたりに書いてあります。
起動は下記のような流れで行います。解像度640x480のフレームレート15fpsとしています。
30fpsでもPandaBoard側は問題なく動作しますが、受信側にそこまでの性能はないと考え
控えめに15fpsとしました。
$ cd ~/mjpg-streamer $ export LD_LIBRARY_PATH="$(pwd)" $ sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"
動作確認
PCのブラウザで、PandaBoardが動いているIPアドレスの8080ポートを見ると(http://xx.xx.xx.xx:8080/)、映像が配信されていることがわかります。
この映像をandroidで受け取るには、いつも通り簡単MJPEGビューアを使います。
このアプリのソースはこちらにあります。
アプリを起動したら、メニューから「設定」を選択し、解像度を640x480に、ポート番号を8080に設定します。
ABC2014Sでは望遠カメラをストリーミングし、観光地にある望遠鏡のように
上下左右に動かすデモを行う予定です。
Wifiを使うので、うまくいくかは当日にならないとわからないのがつらいところ。
mjpg-streamerの自動起動
mjpg-streamerを自動で起動するためには、例えば下記のようにします。mjpg-streamerをビルドしたディレクトリが/home/username/mjpg-streamer
であると仮定します。このディレクトリにstart-mjpg-streamer.shというファイルを作成し、
下記の内容を記述します。
#!/bin/sh cd /home/username/mjpg-streamer export LD_LIBRARY_PATH="$(pwd)" ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"
次に、このスクリプトを/etc/rc.localに記述することで、自動起動します。
(中略) sudo sh /home/username/mjpg-streamer/start-mjpg-streamer.sh & exit 0 ←この行はもともとある行
おしまい。
んー、やっぱり後でBeagleBoneBlackでも試そう。
0 件のコメント:
コメントを投稿