2014年12月3日水曜日

Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた

はじめに


2015.2.27 内容をアップデートしました

Intel Edisonは特に使い途が思いつかなかったので手を出していなかったのですが、2014月11月末のMaker Faire Tokyo 2014にて初めて実物を見たことと、スイッチサイエンスさんのブースで「スイッチサイエンス版Eaglet (MFTバージョン)」を購入したことをきっかけに、試してみることにしました。

目指すのは、いつもやっている「Webカメラを接続してmjpg-streamerで映像を配信する」こととします。

結果を先にお見せすると下図のような感じでです。Intel Edisonで配信した映像がAndroidタブレットに表示されていることがわかります。

なお、本ページで言う「Intel Edison」は、ほとんどの場合「Intel Edison Breakout Board Kit」を指していますのでご了承ください。


Intel Edisonのアップデート

このブログを執筆した2014年12月当時は、Intel EdisonでWebカメラを使うために、OSのイメージを自分でビルドする必要がありました。しかし、2015年1月に公開されたバージョンでは、デフォルトでWebカメラを利用可能になっています。

そこで、ここではまずその方法を解説します。Intel EdisonでのOSのイメージをビルドする方法が知りたい方は、このページの末尾に記録を残しておきますのでご覧ください。

本ページでは、Intel EdisonのアップデートをUbuntuで行うことにします。
まず、Ubuntuにて

$ sudo apt-get install dfu-util

を実行してdfu-utilをインストールしておきます。

次に、こちらよりYocto complete imageをダウンロードします。2015年2月27日の時点ではedison-image-ww05-15.zipがダウンロードされました。

その後、edison-image-ww05-15.zipと同じディレクトリにいるとして、下記のコマンドで書き込みます。

$ mkdir edison-image-ww05-15
$ cd edison-image-ww05-15
$ unzip ../edison-image-ww05-15.zip
$ sudo ./flashall.sh

このコマンドによりアップデートの待機状態になるので、Intel EdisonのJ16コネクタとUbuntuマシンをUSB接続してIntel Edisonに電源を投入すると、アップデートが始まります。J3コネクタにてシリアルコンソールに接続しておくと、進行状況がわかって安心です。

なお、UbuntuマシンとIntel Edisonとを既に接続済みだった場合はIntel Edisonをリブートすると、起動時に更新が始まります。

再起動が終わったら、Intel EdisonのJ16コネクタにUSBカメラ(要変換コネクタ)、J21ピンに7V~15Vの電源を接続します。J3コネクタのシリアルコンソールでログインすると、/dev/video0ができていることがわかります。

なお、この状態でIntel Edisonを再起動すると、カメラが認識されなくなります。一度電源を切ってから再投入することで認識されるようです。

mjpg-streamerのインストールと起動

ここからは主にシリアルコンソールで接続したIntel Edison上の作業になりますが、まず、「configure_edison --setup」コマンドにより、あらかじめIntel EdisonをWifi接続しておきます。詳細はスイッチサイエンスさんのページが詳しいです。

また、あらかじめUbuntuマシンでmjpg-streamerのソースをダウンロードしておきます。このダウンロードにはSubversionが必要なのですが、Intel Edison用のSubversionのパッケージが見当たらず、ソースからインストールするのは面倒だったため、Ubuntuであらかじめダウンロードしておく、というわけです。

(Ubuntuマシンで)
$ sudo apt-get install subversion
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer

そして、できたmjpg-streamerディレクトリをWifi経由でIntel Edisonへ移動しておきます。

ここからIntel Edisonでの作業です。

まず、スイッチサイエンスさんのページ「Intel Edison opkgのフィードを設定する」を参考に、myfeeds.confというファイルを作成して編集を開始します。
# vi /etc/opkg/myfeeds.conf
このファイルに下記の内容を記述して保存します。
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src all http://iotdk.intel.com/repos/1.1/iotdk/all
src i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src x86 http://iotdk.intel.com/repos/1.1/iotdk/x86
書けたら、下記のコマンドを実行します。
# opkg update
# opkg install libjpeg-dev libv4l-dev
# cd mjpg-streamer
# vi Makefile

ここで、Makefileの39行目でinput_testpicture.soをビルド対象に含めている部分を下記のようにコメントアウトします。

# PLUGINS += input_testpicture.so

input_testpicture.soのビルドにはImageMagickが必要なのですが、ImageMagickのIntel Edison用のパッケージがなく、またその名前の通り、input_testpicture.soはテスト時以外なくても困らないためです。

以上のもと、ビルドします。

# make

ビルドが完了したら、下記のコマンドにより、mjpg-streamerを起動します。

# export LD_LIBRARY_PATH="$(pwd)"
# ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -p 9000 -w ./www"

あとは、ブラウザで

http://Intel EdisonのIPアドレス:9000/

にアクセスすると、映像が配信されていることがわかります(2014.12.11追記。後に追加するエントリとの整合性をとるため、ポート番号を8080から9000に変更しました)。

Androidの場合は簡単MJPEGビューアを使ってもよいです。ポート番号はソフトウェアキーボードで9000と変更してください。

mjpg-streamerの自動起動

最後に、Intel Edisonに電源を入れた際にmjpg-streamerが自動で起動するようにしておきます。

まず、mjpg-streamerディレクトリにstart_mine.shファイルを作成します。

# cd
# vi mjpg-streamer/start_mine.sh

中には例えば以下の内容を記します。

#!/bin/sh

cd /home/root/mjpg-streamer
export LD_LIBRARY_PATH="$(pwd)"
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -p 9000 -w ./www"

次に、このスクリプトを/etc/rc.localに記述して、起動時に自動的に呼び出されるようにします。

# vi /etc/rc.local

内容は下記の通りです。

#!/bin/sh

sh /home/root/mjpg-streamer/start_mine.sh &

最後に、/etc/rc.localのパーミッションを755にしておきます。

# chmod 755 /etc/rc.local

以上が済んだ後、Intel Edisonの電源を切り、電源再投入してください(リブートでは駄目)。mjpg-streamerが自動で起動していることがわかるはずです。

終わりに

Intel EdisonでWebカメラの映像を配信してみましたが、Raspberry PiやBeagleBone Blackと比べた場合のメリットは、5GHz帯のネットワークにデフォルトで接続できることでしょうか。Raspberry PiやBeagleBone Blackで5GHz帯のネットワークにつなぐにはGW-450Dを使う方法がありますが、kernelの再構築が必要であるなど、やや面倒です。

とは言え、Intel Edisonの方でも、7V~15Vの電源が必要な点など使いにくいところはあります。

以上です。

こちらもどうぞ

このページの話の続きです。




kernelとOSイメージの作成

既に述べたように、2014年12月の時点では、EdisonのデフォルトのkernelはUSB Video Class (UVC)が有効になっていなかったので、それを有効にしたkernelと、それを含むOSイメージを作成する方法を解説しました。

現在はUVCがデフォルトで有効になっていますのでこの作業は必要ないのですが、記録としてその方法を以下に残しておきます。

この作業はUbuntuで行いました。作業の概略はIntel Edison BSP User Guideにまとめられています。

まず、Ubuntuに必要なパッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib

次に、こちらよりLinux source filesをダウンロードします。2015年2月27日の時点ではedison-src-ww05-15.tgzでした。このファイルを

$ tar zxf edison-src-ww05-15.tgz

により解凍します。edison-srcというディレクトリができますので、以下の順でまずはデフォルトのイメージを作成してみます。なお、この際環境変数PATHにカレントディレクトリ「.」が含まれているとエラーが出ますので、あらかじめPATHから「.」を削除しておきます。

$ cd edison-src
$ ./device-software/setup.sh
$ source poky/oe-init-build-env
  (ここで、自動的にedison-src/buildにcdされる)
$ bitbake edison-image

なお、最後のコマンドを実行すると、途中で様々なファイルのダウンロードが行われますが、環境やタイミングによりダウンロードエラーが起こることがありますので、エラー出ずにビルドが終了するまで繰り返します。

私の場合、成功時に下記のようなメッセージが現れてビルドが完了しました。

NOTE: Tasks Summary: Attempted 2802 tasks of which 29 didn't need to be rerun and all succeeded.

Summary: There were 79 WARNING messages shown.

ビルドが完了した後、以下のコマンドにより、書き込み用のファイル群をまとめます。

$ cd ../..
$ ./edison-src/device-software/utils/flash/postBuild.sh

以上により、書き込み用のファイルがディレクトリedison-src/build/toFlashにまとめられます。このイメージを上で行ったようにflashall.shを用いて書き込めます。

なお、kernelの設定を変更したい場合は下記のようにして再ビルドしてください。
kernelの設定ファイルはedison-src/device-software/meta-edison/recipes-kernel/linux/files/defconfigですので、手作業で変更する場合はこちらを編集します。

menuconfigにより設定を行う場合は以下のようにします。まず、
edison-src/build ディレクトリにて

$ bitbake virtual/kernel -c menuconfig

を実行します (Xが必要)。

Webカメラを有効にする場合は下記の操作を行ったのですが、既にこれはデフォルトで有効になっています。
Device Drivers→
MultiMedia Support→
Media USB Adapters でスペース→Enter
USB Video Class (UVC) で M
→Save
→Exit (複数回)
と辿ることで設定ファイルが

edison-src/build/tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config

として書き込まれます。これをkernelの設定ファイルの格納場所にコピーします。
edison-src/buildディレクトリにいるとして、

$ cp ../device-software/meta-edison/recipes-kernel/linux/files/defconfig ../device-software/meta-edison/recipes-kernel/linux/files/defconfig.orig
$ cp tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config ../device-software/meta-edison/recipes-kernel/linux/files/defconfig

さて、以上が済んだら、edison-src/build ディレクトリにて下記コマンドによりイメージの作成を行います。

$ bitbake virtual/kernel -c configure -f -v
$ bitbake edison-image
$ cd ../..
$ ./edison-src/device-software/utils/flash/postBuild.sh

以上で、edison-src/build/toFlashに書き込み用のファイルができました。


3 件のコメント:

  1. 大変参考になりました。
    ubuntu での母艦構築方法を参考にさせていただき、
    CentOS7, fedora21 で(若干苦戦しながらも)環境構築できました。
    ありがとうございました。

    返信削除
    返信
    1. コメントありがとうございます。お役に立ったようで良かったです

      削除
  2. Hello

    The tutorial was really helpful but I got stuck with the command
    cd mpcd mjpg-streamer

    Intel Edison says that it """can't cd to mjpg-streamer""".
    I think some command is missing where we have to install mjpg streamer in Edison.

    Can you please help me out?

    Eagerly waiting for the reply

    返信削除