BeagleBoard-xMへUbuntu11.04(Natty)のインストール

前の記事でも触れましたが、BeagleBoard-xMへUbuntu11.04(Natty)をインストールしました。

microSDカードにはPCI microSD 8GB class6を使用しました。(4GBだと微妙に足りないので、8GBをお勧めします。)

プレインストールイメージはubuntu-11.04-r2-minimal-armel.tar.xz(2011/7/7版)を使用しました。


OS自体のインストールは「Beagleboard-xM で遊ぼうのこーなー(ソフト編)」を参考に、問題なくインストールできました。続いて、ネットワークの設定やアプリのインストール等を行いました。いくつかポイントと思うところを書いてみます。


無線LANについて】
前回のUbuntu10.10(Maverick)では苦労した、無線LAN子機 Planex GW-USValue-EZ のドライバが最初から含まれていました!!!
無線LANの設定を前の環境からコピーして、あっさり動きました。


【USBカメラについて】
luvcviewでUSBカメラ(LOGICOOL C905m)の画像を表示したところ、Ubuntu10.10の時
同様にMJPEGは安定せず、-f yuvをつけるときれいに表示されました。
uvc_streamer/mjpg-streamerも前回と同様で、uvc_streamerはすぐに落ちてしまい、mjpg-streamerは-yをつけるときれいに表示されました。


VNCについて】
VNC前回と同じく、ターミナルでdキーを押すと画面上のウィンドウがすべてアイコン化(?)されてしまう現象が発生しましたが、前回と同じ方法で対処できました。


OpenCVについて】
前回と同じく、カメラのMJPEG問題のために、ソースからインストールしました。前回は2.3.0RCをインストールしましたが、今回はRCがとれた2.3.0をインストールしました。カメラのMJPEG問題の対処のソース変更も前回と同様に行いました。

OpenCVのビルドが完了して、インストール後、カメラのサンプルプログラムをコンパイルして動かすと、画像が表示されず。。。ソースを追いかけて調べると、libv4lの開発用ライブラリが入っていないためでした。


sudo apt-get install libv4l-dev
でインストールして、再度OpenCVコンパイルしたところ、カメラのサンプルプログラムがうまく動きました。
サンプルのfacedetectは2000ms程度でした。前回(2500ms)よりも多少速いような感じはしますが、映している画像が前回と違うせいかもしれません。


以上で環境はできたので、ロボットの製作に戻ります。
ブラウザでカメラの画像を見ながらロボットをコントロールするアプリを製作中です。OpenCVを使った画像認識ができる基盤も組み込む予定です。
すこし大きなプログラムになりそうで、時間がかかっています。

BeagleBoardでディスクベンチ

これまで、microSDカードにKINGMAXの4GB(class6)を使っていましたが、4GBでは手狭になってきたので、PCIの8GB(class6)をAmazonで購入しました。(¥1,680でした。)

せっかくなので、OSには最新版のUbuntu11.04(Natty)をインストールしました。(これは別途レポートを書きたいと思います。)


これまで使用していたKINGMAXのSDカードは少し引っかかるような感じがあったので、DISKベンチマークでDISKの速度を比較してみました。
ベンチマークにはbonnie++というソフトを使用しました。


インストール


% sudo apt-get install bonnie++


以下のパラメータで動かしました。


% bonnie++ -d /tmp -s 512 -r 256 -u ubuntu


結果の抜粋です。(実際にはもっといろいろな値が出力されます。)


Ubuntu10.10 KINGMAX(4GB) SeqWrite(Block): 4,904KB/s SeqRead(Block):16,003KB/s
Ubuntu11.04 PCI(8GB) SeqWrite(Block):10,789KB/s SeqRead(Block):22,428KB/s

OSのバージョンが違うのと、KINGMAXは使い込んだDISKになるので少し遅くなっていることも考えられ、SDカードの問題だけではないかもしれませんが、この結果だけを比較すると、PCI8GBの方が速いようです。実際に使って見た感じでもPCI8GBの方が速いような感じがします。

自走BeagleBoard

以前作っていた台車に天井を作り、その上にBeagleBoardを載せました。
接続は以前試したものと同じです。



カメラの映像はmjpg-streamerを使用してブラウザ経由で見ることができます。
こんな感じになります。


PCからリモートコントロールするためにCUIのアプリを作成しました。
このアプリはBeagleBoard上で動き、キーボードから入力されたコマンドをほぼそのままシリアル経由で台車のV850に送ります。V850側でコマンドの解釈とモーターのPWM制御を行います。
これで、SSH経由でコントロールできます。


別の部屋にあるロボットをカメラを見ながら操縦すると異次元の楽しさでした。
マイクやスピーカーをつけるとさらにおもしろそうです。あと、カメラを上下に動かせると良さそうです。


次回は自立で動くようにしたいと思います。

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

BeagleBoardOpenCVを導入してみました。


まずは関係するライブラリ群と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をインストールして接続します。


BeagleBoardIPアドレス::5901
で接続します。
vncviewerにBeagleBoard(Ubuntu)の画面が表示されました!!
おまけに懐かしのアプリをいくつか起動してみました。(笑)


...と、ここまでは順調にきましたが、
ターミナルで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」からも接続できました。

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

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


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


(2)V850基板とのシリアル通信速度
台車に使おうと考えている、↓にはインタフェース誌 2007年5月号の付録のV850基板が載っています。

この基板には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と接続しているところです。

Sanguinoはシリアルが2系統あるのでやりやすいです。
(Sanguinoは最近メンテナンスされていないようで残念です。。。)


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