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 ~
mkdir CodeSourcery
cd CodeSourcery
tar xjvf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
ln -fs arm-2009q1 Sourcery_G++_Lite

(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を選択してエンターキーを押して下さい。

drive

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
CFLAGS += -I ../../../jpeglib/include
#CFLAGS += -g
#CFLAGS += -DDEBUG

ifeq ($(USE_LIBV4L2),true)
LFLAGS += -lv4l2
CFLAGS += -DUSE_LIBV4L2
endif

LFLAGS += -L ../../../jpeglib/lib
LFLAGS += -ljpeg

この変更を実施後、以下の手順でビルドを実施します。

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に接続したカメラから動画が中継できれば動作確認終了です。

図

Creative Commons License
LEGO Mindstorms Education technical information byAfrel. Co. Ltd. is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

SPIKE