studiok のすべての投稿

BeagleBoard-xM + Ubuntu10.10(Maverick) にOpenCVを導入

BeagleBoardにOpenCVを導入してみました。

まずは関係するライブラリ群とOpenCVのパッケージをインストールします。

% sudo apt-get update
% sudo apt-get install ffmpeg
% sudo apt-get install libgtk2.0-dev
% sudo apt-get install libavcodec-dev
% sudo apt-get install libavformat-dev
% sudo apt-get install libjpeg62-dev
% sudo apt-get install libtiff4-dev
% sudo apt-get install libgif-dev
% sudo apt-get install libcv-dev
% sudo apt-get install libcvaux-dev
% sudo apt-get install libhighgui-dev
% sudo apt-get install opencv-doc

OpenCVのバージョンは2.1がインストールされたと思います。

しかし、↓のUSBカメラの画像を表示するサンプルプログラムをコンパイルして実行したところ、画像が崩れてしまっていました。

http://opencv.jp/sample/video_io.html

以前遭遇した、luvcviewの表示が崩れてしまい、「-f yuv」を付けると改善した現象と同じ問題のようです。

おそらく、USBカメラ(LOGICOOL C905m)のMJPEGとOSのJPEGライブラリの相性(?)の問題ではないかと思います。

↓など、いくつかの情報によると、OpenCVで画像形式の決定順序がMJPGがYUYVより優先になっているので、優先順位を変更して強制的にYUYVを使用するようにしてあげると改善されるようです。

http://www.mori-soft.com/index.php?option=com_content&view=article&id=88:opencv-&catid=1:opencv&Itemid=6

というわけで、OpenCVのパッケージはいったんアンインストールして、ソースからビルドしてインストールしなおします。

OpenCVのパッケージをアンインストールします。

% sudo apt-get remove  libcv-dev

OpenCVのビルドに必要になるcmakeをインストールします。

% sudo apt-get install cmake

作業時の最新だったOpenCV2.2のソースからビルドしようとしましたが、いろいろとエラーが出てうまくいかなかった(最新のパッチを当てるか、SVNから最新版をとってくれば良いのかもしれません。)ので、2.3RCをインストールしました。(7/4にRCがとれた2.3の正式版がリリースされたようです)

2.3RC(2011/6/21版)のソース(OpenCV-2.3.0rc.tar.bz2)をダウンロード後、以下の手順でコンパイル前のところまで行います。

% mkdir opencv
% mv OpenCV-2.3.0rc.tar.bz2 opencv
% cd opencv
% tar xjf OpenCV-2.3.0rc.tar.bz2
% mkdir release
% cd release
% cmake -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_PYTHON_SUPPORT=ON ../OpenCV-2.3.0

MJPEGよりもYUYVの優先度を上げるため、ソースを変更します。

OpenCV-2.3.0/modules/highgui/src/cap_v4l.cppのautosetup_capture_mode_v4l2()関数を変更します。

if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUYV) == 0)
{
capture->palette = PALETTE_YUYV;
}
else

の部分を

#ifdef HAVE_JPEG

の前へ移動します。

詳しくは、↓を参照してください。

http://www.mori-soft.com/index.php?option=com_content&view=article&id=88:opencv-&catid=1:opencv&Itemid=6

コンパイル開始。

% make -j 2

インストールします。

% sudo make install
% sudo ldconfig

先ほどのカメラのサンプルプログラムをコンパイルし直して、正常に動くことを確認しました。

コンパイル方法:

% gcc -o opencv opencv.c -I/usr/local/include/opencv -lopencv_core -lopencv_highgui -lopencv_ml

続いて、OpenCVに付属のサンプルをビルドします。

% cd OpenCV-2.3.0/samples/c
% sh build_all.sh

サンプルの中にある顔認識のサンプル(facedetect)を動かしてみます。

% ./facedetect --cascade="../../data/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="../../data/haarcascades/haarcascade_eye.xml" --scale=1.3

1フレームの処理に2.5秒前後かかりますが、なんとか動きました。

BeagleBoard-xM + Ubuntu10.10 にVNCを導入

BeagleBoard-xMを使用する際に、普段はWindows PCからSSHで接続していますが、今後OpenCV等でカメラを使用したアプリ等も作っていきたいので、GUI(X-Window)を使用したいところです。

ディスプレイ・マウス・キーボードは接続できますが、できるだけケーブルを接続したくないので、PCからVNCで接続するようにしてみます。

なお、以下の話はBeagleBoard固有の話ではなく、Ubuntu10.10の一般的な話だと思います。

【導入手順】

パッケージにtightvncがあるので、apt-getでインストールします。

sudo apt-get update
sudo apt-get install tightvncserver

VNCサーバを起動します。初回は設定するパスワードを聞いてきますので、入力します。

vncserver :1

PC側にもtightvncのvncviewerをインストールして接続します。

BeagleBoardのIPアドレス::5901

で接続します。

vncviewerにBeagleBoard(Ubuntu)の画面が表示されました!!

おまけに懐かしのアプリをいくつか起動してみました。(笑)

f:id:studio_k:20110706220406j:image:w480

...と、ここまでは順調にきましたが、

ターミナルでdキーを押すと画面上のウィンドウがすべてアイコン化(?)されてしまう現象が発生しました。これでは使い物になりません。。。

はまりかけましたが↓の情報に助けられました。

http://d.hatena.ne.jp/kaosf/20110518/1305727419

具体的には以下の手順で改善しました。

vncviewerで接続。

System > Preferences > Keyboard Shortcuts から

“Window Management”の中の

“Hide all normal windows and set focus to the desktop” を選択後、

[BackSpace]を押して Disable に変更。

vncviewerを閉じて、

vncserver -kill :1
vncserver :1

で再起動。

【おまけ】ipod touchの「Mocha VNC Lite」からも接続できました。

f:id:studio_k:20110706221436j:image

BeagleBoard-xMとArduinoの接続およびV850基板との接続

前回はBeagleBoard側はターミナルソフト(minicom)を使用しましたが、BeagleBoard側も簡単な送受信プログラムを作成して通信速度の上限を調べる実験をしてみました。

(1)Arduinoとのシリアル通信速度

テストの結果はArduino(実際に使用したのはSanguinoです)の上限速度の115,200bpsで、100KBのデータの送受信してエラーはありませんでした。

(2)V850基板とのシリアル通信速度

台車に使おうと考えている、↓にはインタフェース誌 2007年5月号の付録のV850基板が載っています。

f:id:studio_k:20110611232150j:image:w480

この基板にはUSBで接続ができるようにCP2102チップが載っており、USBケーブルで直接つなぐだけでBeagleBoard(Ubuntu10.10)から認識されました。

V850側はArduinoと同じく受信したデータをループバックするプログラムを作成して、同様にテストしたところ、460,800bpsで100KBのデータの送受信してエラーはありませんでした。

この通信速度を踏まえてそれぞれのCPUの役割を考える必要がありますが、今考えている範囲では十分な通信速度です。

次回はBeagleBoardからこの台車をコントロールできるようにしたいと思います。

BeagleBoard-xMとArduinoの接続

BeagleBoardにはGPIOやI2C, SPI等のインタフェースがありますが、電圧が1.8Vなので、3.3Vや5Vのセンサー等をつなぐ場合は電圧の変換が必要になります。
また、実験中に何かミスするとボードを壊してしまうかもしれません。
そこで、Arduinoとシリアルで接続し、ハード関係はArduinoに任せるようにすることにします。

<接続図>
センサー/DCモーター/サーボ等 – Arduino – <シリアル> – BeagleBoard

BeagleBoard-xMには通常のRS232Cのコネクタがありますが、コンソールで使用しているので、
USB-シリアルTTL変換機経由で接続するようにします。
今回はaitendoのUSB-シリアルTTL変換器(USB2UART-CP2102)を試してみました。購入時は¥600でした。
USB2UART-CP2102はBeagleBoard(Ubuntu10.10)に刺すだけで認識されました。

簡単なシリアル通信プログラムを書き込んだArduinoと接続して、9600bpsで試したところ問題なく通信できました。
BeagleBoard(Ubuntu)側はminicomというターミナルソフトを使用しました。

↓はArduinoではなく、以前作ったSanguinoと接続しているところです。
f:id:studio_k:20110615214510j:image:w320
Sanguinoはシリアルが2系統あるのでやりやすいです。
(Sanguinoは最近メンテナンスされていないようで残念です。。。)

そのうち通信速度の上限を調べたいと思います。

BeagleBoard-xM バッテリー駆動

BeagleBoardを完全ワイヤレスにするために、バッテリーで駆動させてみます。BeagleBoardの電源は5Vで、電流は接続予定のUSB機器を含めると、本体:750mA, カメラ:500mA, 無線LAN:(情報なし)なので、1.5Aぐらい必要です。

まずは、手持ちの3端子レギュレーター(NJM7805FA)で試してみました。

f:id:studio_k:20110611232010j:image:w320

eneloop6本の7.2Vでは電圧が足りないせいか、BeagleBoard動作時の電圧が4.5Vぐらいまで落ちてしまい、再起動を繰り返す状態になってしまいました。

次にKHR用の10.8Vバッテリー(ニッケル水素9本)を試してみました。

無線LAN子機とカメラを接続した状態でも動作はするものの、3端子レギュレーターが熱くてさわれない状態になってしまいました。

カメラを使用中はおそらく1A以上流れていますので、(10.8V-5V)×1A=5.8W以上が熱になっている計算になります。

これでは使い物になりません。

というわけで3端子レギュレーターはあきらめて、秋月のDC-DCコンバーターHRD05003Eを購入しました。このDC-DCコンバーターは5V 3A出力でき、スイッチングレギュレータなので、効率良く降圧できそうです。値段も¥300と経済的です。

f:id:studio_k:20110611232057j:image:w320

入力電圧と出力電圧の差が3V以上必要とのことで、eneloop6本の7.2Vでは足りていませんが、少なくとも充電直後は使えるようです。どのぐらいの時間使えるかは今後調べたいと思います。KHR用の10.8Vバッテリーも問題ありませんでした。発熱もカメラを使用した状態でもほんのり温かくなる程度でした。

f:id:studio_k:20110611232122j:image:w320

これで完全ワイヤレス化ができました。

とりあえず無線カメラとして使用できる状態です。別の部屋に置いて映像を見ることができました。

バッテリー駆動ができるようになったので、以前作った↓の台車に載せてみたいと思います。

f:id:studio_k:20110611232150j:image:w320