2013年9月19日
- EV3技術情報
- カメラとの接続方法
- 外部連携
カメラとの接続方法
1.UVC対応Kernelのビルド手順と評価
1.1 ビルド環境のセットアップとビルド手順
(1) Ubuntu 12.04 LTS等のLiunx環境をPCにインストールする
インストールする先は、仮想環境(VMWare/Virtual-PC等)でもネイティブなPC環境どちらでも問題ありません。クロスコンパイラ(CodeSourcery G++ Lite)を別途用意するので、このコンパイラが動く環境であれば基本的にどのLinuxディストリビューションを用いても良いのですが、新規にLinux環境を用意する場合にはこのバージョンを使うことをお勧めします。なお、以降この環境をUbuntu-PC環境と呼びます。
(2) コンパイラ(CodeSourcery Lite for ARM)をダウンロード
CodeSourcery Lite for ARM version 2009q1-203
URL:https://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/ の中の、「ARM Processors」の「Download the GNU/Linux Release→」をクリックしてください。
ここを選択すると、メールアドレスとユーザ登録のための、以下の画面が表示されます。
この画面でFirst Name,Last Name,Email,Country,Your Cityを入力して、Get Lite!をクリックすると、登録したメールアドレスにダウンロード専用のURLが通知されます。そのURLを開くと、
のとおり複数のバージョンを選択するページが表示されます。
EV3でのクロスコンパイルには「Sourcery G++ Lite 2009 q1-203」を選択してください。
パッケージは「IA32 GNU/Linux TAR」を選択してください。
これにより、
arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
という名前のファイルがダウンロードされます。このファイルをUbuntu-PC上の自分自身のホームディレクトリにコピーしておいてください。
(3) githubよりev3の全ソースコード取得
githubより以下の手順でmindstorms-EV3向けの全ソースコードを取得します。
sudo apt-get install git (初回のみ必要、gitインストール済みであれば不要です) cd ~ mkdir mindstorms cd mindstorms git clone https://github.com/mindboards/ev3sources.git |
注) 今後のgithubサーバ上のコード変更により、これ以降に記載した手順が正常に出来ない場合には、
本文書の手順を確認済みの2013/9/6時点のコードをcheckoutして再度お試しください。
cd ~ mindstorms /ev3sources git checkout -f 30276725e38ed7f22c535e53e36af3afd096eefa |
(4)ev3ソフトウェアを"~/projects"で参照できる様シンボリックリンクを作成
cd ~ ln -fs mindstorms/ev3sources projects |
(5)ARMクロスコンパイラ(CodeSourcery Lite G++)をフォルダに展開
cd ~ |
(6)Linux Kernel/ブートローダ ビルド用にシンボリックリンク作成
cd ~ mkdir am1808 cd am1808/ mkdir DaVinci-PSP-SDK-03.20.00.13 cd DaVinci-PSP-SDK-03.20.00.13/ mkdir srccd src/ ln -fs ~/projects/extra/ kernel ln -fs ~/projects/extra/ u-boot |
(7)u-boot(ブートローダ)のビルド確認
cd ~/projects/lms2012/open_first/ make u-boot |
⇒ブートローダイメージ(ファイル名:uBoot)がカレントディレクトリに生成されれば正常終了です。
(8)Linux Kernelのビルド確認
cd ~/projects/lms2012/open_first/
make kernel |
⇒カーネルイメージ(ファイル名:uImage)がカレントディレクトリに生成されれば正常終了です。
(9)アプリケーションプログラム等(bytecode,kernel,modules,lms2012)のビルド確認
cd ~/projects/lms2012/open_first/ make programs make modules make lms2012 |
⇒エラーなしでビルドが完了できれば正常終了です。
(10) Linux KernelのUVCドライバ有効化コンフィグファイルの作成
カーネルソースコードのルートディレクトリに移動
cd ~/projects/extra/linux-03.20.00.13/ |
make menuconfigを実行するためにncurses-devライブラリをインストールします。(初回のみ)
sudo apt-get install ncurses-dev |
カレントディレクトリに「.config」ファイルが存在するか確認。このファイルがない場合には、
cp ~/projects/lms2012/open_first/LEGOBoard.config .config |
を実行します。
カーネルの設定を変更するために以下のオプションでmake menuconfigを実行します。
make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- |
Device Driversを選択してエンターキーを押して下さい。
Multimedia Supportを選択して有効<*>(2回「スペース」を押します)にしてエンターキーを押して下さい。
Video For Linuxを有効<*>にし、画面中のVideo capture adaptersだけを有効<*>状態にしてください。
次にVideo capture adaptersを選択してエンターキーを押して下さい。
画面中の設定項目のうち、V4L USB devicesだけを有効[*]にして、V4L USB devicesを選択してエンターキーを押して下さい。
画面中の設定項目のうち、UVC Video Class (UVC)とUVC input events device supportだけを有効にしてください。
以上の設定が完了したらESCキー2回押下を続け、ルート画面まで戻っていき、最終的に表示される
のダイアログ画面にて「YES」を選択することで設定変更を.configファイルに書き込みます。
「.config」ファイルをエディタ等で確認して、
CONFIG_V4L_USB_DRIVERS=y CONFIG_USB_VIDEO_CLASS=y CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y |
などのUSB_VIDEO_CLASS関連の設定が追加されていることを確認します。
この後、
cp .config ~/projects/lms2012/open_first/LEGOBoard-UVC.config |
を実行し、カーネルコンフィグファイルを別名で保存します。
(11) UVCドライバ有効化コンフィグレーションを用いたカーネルのビルド
Mindstorms向けのオリジナルカーネルコンフィグ(LEGOBoard.config)をリネームします。
cd ~/projects/lms2012/open_first/ mv LEGOBoard.config LEGOBoard.config.orig |
次に(10)で作成したUVC対応済みカーネルコンフィグでビルドするために、
LEGOBoard-UVC.configファイルへのシンボリックリンクを作成します。
ln -fs LEGOBoard-UVC.config LEGOBoard.config |
カーネルイメージをビルドします。
make kernel.clean make kernel |
正常にカーネルビルドが完了し、カレントディレクトリにuImageファイルが出来ていればビルド成功です。
なお、UVC対応を入れてビルドしたカーネルイメージと、オリジナルのカーネルイメージとのサイズを比較すると、
-rw-rw-r-- 1 ssk ssk 2056424 Aug 6 11:21 uImage # UVC対応反映済み -rw-rw-r-- 1 ssk ssk 1964912 Aug 6 11:10 uImage.orig # オリジナル |
機能の追加によりカーネルのイメージサイズが100KB位増えていることがわかります。
1.2. カーネルの差し替え方法とUVCカメラ接続確認
カーネルを差し替えるためには、内蔵SPI-Flash ROMのカーネル領域を書き換える方法と、SDカード上にカーネルイメージを置いてそちらを読み込ませる方法の2種類が存在します。
内蔵SPI-Flash ROMはブートローダで書き換えが可能であるが、操作を間違うと一切起動できなくなる(u-bootを間違って上書きした場合)ため、ここでは安全のためにSDカードからシステム全体をブートする方法を使用します。
以下の例では、4GBのSDHCタイプのマイクロSDカードを使用した場合を例として説明します。
(1) マイクロSDカードのフォーマットの為の準備 Ubuntu-PCでSDカードをフォーマットするために、gparted(パーティションエディタ)をインストールする
sudo apt-get install gparted |
(2) フォーマットするSDカードのデバイスファイル名の確認
マイクロSDカードをUbuntu-PCに挿入し、しばらく待ってから、dfを実行する
$ df Filesystem 1K-blocks Used Available Use% Mounted on Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 40251776 16487140 21719964 44% / udev 501844 4 501840 1% /dev tmpfs 205292 844 204448 1% /run none 5120 0 5120 0% /run/lock none 513228 204 513024 1% /run/shm cgroups 513228 0 513228 0% /sys/fs/cgroup /dev/sdb1 3871744 32 3871712 1% /media/F26A-DBF0 $ |
ここでSDカードを挿入することで追加されたSDカードのデバイスファイル名(上記では/dev/sdb1)を覚えておきます。
(3) パーティションの作成
“sudo gparted”を実行して、追加されたSDカードの(今回は/dev/sdb)を選択します。
/dev/sdb内の全パーティションをアンマウント (メニューのPartition→Unmount)から削除 (メニュのPartition -> Delete)を実行して、Apply(メニューのEdit→Apply All Operationまたは「✓」アイコン)を実行して既存パーティションをすべて削除します。削除が完了すると以下の画面となります。
次にメニューのPartition→Newにて、先頭の128M分をFAT32形式、ラベルはLMS2012ににしてAddボタンを押します。
次に同じくPartition→Newにて、残りの領域全部をEXT2形式、ラベルをLMS2012_EXTにしてAddボタンを押します。
これら2つのパーティションを作成後、Apply(メニューのEdit→Apply All Operationまたは「✓」アイコン)を実行して実際の操作を実行すると、以下の画面となります。
(4) SDカードにlms2012システムをコピーする
マイクロSDカードを一度抜いてから再接続し、dfを実行して/media以下に/media/LMS2012と/media/LMS2012_EXTという名前の2つのパーティションがマウントされていることを確認します。
ssk@ubuntu:~/projects/lms2012/open_first$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 40251776 26231584 11975520 69% /
udev 1020944 4 1020940 1% /dev
tmpfs 412960 836 412124 1% /run
none 5120 0 5120 0% /run/lock
none 1032392 200 1032192 1% /run/shm
cgroups 1032392 0 1032392 0% /sys/fs/cgroup
/dev/sdb1 129039 2009 127030 2% /media/LMS2012 /dev/sdb2 3688964 32052 3469520 1% /media/LMS2012_EXT |
マウントの確認がとれた時点で、念のため全システムを再ビルドしてから「update_sdcard.sh」コマンドを続けて実行します。SDカード上にカーネルとルートファイルシステムが書き込まれます。
cd ~/projects/lms2012/open_first make clean make u-boot make kernel make programs make modules make lms2012 ./update_sdcard.sh |
(5) マイクロSDカードをEV3にセットして起動させてカーネルのログを確認
EV3に書き込み完了したマイクロSDカードをセットして起動します。起動後、シリアルコンソールの出力、またはtelnetログイン後のdmsgコマンド実行でカーネルの起動ログを確認し、カーネルバージョン情報が以下のとおり変更されていれば、起動カーネルはSDカード上のuImageに差し換わっていることになります。
Before Linux version 2.6.33-rc4 (root@ubuntu) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 PREEMPT Thu Dec 13 11:17:16 CET 2012 |
After Linux version 2.6.33-rc4 (ssk@Tie) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 PREEMPT Tue Aug 13 22:41:12 JST 2013 |
※ 赤字箇所について、カーネルビルドしたユーザ名、サーバ名、およびビルドした時刻に変更されていればカーネルが正しく差し変わっています。
(6) UVCカメラ接続の確認
UVCカメラを接続した状態で、シリアルコンソール出力、またはtelnetログイン後のdmsgコマンドによるカーネルログ出力にて、以下の
uvcvideo: Found UVC 1.00 device HD Webcam C525 (046d:0826) input: HD Webcam C525 as /devices/platform/ohci.0/usb1/1-1/1-1.4/1-1.4:1.2/input/input0 |
というログが出力されていれば、カーネルがUSB Webcamの接続を認識出来ています。
2.mjpg-streamerによる動画中継のビルド手順と評価
mjpg-streamerによる動画中継のビルド方法と実行方法を説明します。なお、この手順はすでに1章の手順でカーネルのクロスビルドのための環境(Ubuntu-PC上)が用意されていることを前提としています。
(1) 事前準備
mjpeg-streamerのクロスコンパイルに必要な以下のツールをUbuntu-PC上にインストールします。
(1-1) Subversionのインストール:mjpg-streamerのソースコード取得のため
sudo apt-get install subversion |
(1-2) imagemagickのインストール:mjpg-streamerのコンパイルに必要なイメージ変換ツール
sudo apt-get install imagemagick |
(2)最新のmjpg-streamerソースコードをsubversionサーバから取得
cd ~ mkdir mjpg-streamer cd mjpg-streamer svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ |
(3) jpeglibのダウンロード
http://www.ijg.org/
の、 jpegsrc.v9.tar.gz をクリックして任意のフォルダにダウンロードします。
(4) jpeglibのクロスコンパイル
cd ~ cd mjpg-streamer tar xzvf jpegsrc.v9.tar.gz cd jpeg-9 ./configure --prefix=${HOME}/mjpg-streamer/jpeglib \ -host=arm-linux-gnueabi \ CC=~/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc make make install |
※ jpeglibのクロスコンパイルはmjpg-streamer以下で実施します。
(5) mjpg-streamerのクロスコンパイル
以下のファイル
~/mjpg-streamer/mjpg-streamer/plugins/input_uvc/Makefile |
に、(4)でビルドしたARM9向けjpglibを参照するための設定を2行(赤字)追加
CC = gcc
OTHER_HEADERS = ../../mjpg_streamer.h ../../utils.h ../output.h ../input.h CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC ifeq ($(USE_LIBV4L2),true) LFLAGS += -L ../../../jpeglib/lib |
この変更を実施後、以下の手順でビルドを実施します。
cd ~/mjpg-streamer/mjpg-streamer make clean make CC=~/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc¥ LIBTOOL=~/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld |
ビルドが正常終了後、カレントディレクトリに、
mjpg_streamer input_uvc.so output_http.so |
などのオブジェクトファイルが正しく生成されていればARM9向けのクロスビルドが完了します。
(6) 動作確認
(1) ~ (5)の手順で作成したjpglibとmjpg_streamerのバイナリをEV3に移動させます。1.2章ですでに作成済みのSDカードをUbuntu-PCにセットし、/media/LMS2012_EXTがマウントされていることを確認してから、jpglibのライブラリ本体を/usr/lib以下にコピーします。
cd ~/mjpg-streamer/jpeglib/lib sudo cp -R * /media/LMS2012_EXT/usr/lib sync |
次にmjpg-streamer本体をrootユーザのホームディレクトリ以下にコピーします。
cd ~/mjpg-streamer/ sudo cp -R mjpg-streamer /media/LMS2012_EXT/home/root sync |
以上が完了後、SDカードをUbuntu-PCから抜き、EV3のSDカードスロットに差し込み起動します。起動後、EV3にUVCカメラを接続した状態にてtelnetでEV3にログインし、
cd mjpg-streamer/ ./mjpg_streamer -i “./input_uvc.so -f 30 -r 320×240 -d /dev/video0” -o “./output_http.so -w ./www -p 8080” |
を実行すると以下の通りのログが出力されます。 上記のパラメータの意味は以下の通りです。
フレームレート30fps (-f 30)
解像度320x240 (-r 320x240)
ポート8080にてwebサーバ立ち上げ (-p 8080)
root@rudolf:~/mjpg-streamer# ./mjpg_streamer -i “./input_uvc.so -f 30 -r 320x240 -d /dev/video0”? -o “./output_http.so -w ./www -p 8080” MJPG Streamer Version: svn rev: 3:172M i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 320 x 240 i: Frames Per Second.: 30 i: Format............: MJPEG Adding control for Pan (relative) Adding control for Tilt (relative) Adding control for Pan Reset Adding control for Tilt Reset Adding control for Pan/tilt Reset Adding control for Focus (absolute) mapping control for Pan (relative) mapping control for Tilt (relative) mapping control for Pan Reset mapping control for Tilt Reset |
mapping control for Pan/tilt Reset mapping control for Focus (absolute) mapping control for LED1 Mode mapping control for LED1 Frequency mapping control for Disable video processing mapping control for Raw bits per pixel o: www-folder-path...: ./www/ o: HTTP TCP port.....: 8080 o: username:password.: disabled o: commands..........: enabled |
この状態で、Firefox等のwebブラウザで、
http://EV3のIPアドレス:8080 |
にアクセスすることで、以下の様にEV3に接続したカメラから動画が中継できれば動作確認終了です。
LEGO Mindstorms Education technical information byAfrel. Co. Ltd. is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.