Mac で CV Drone

Linuxでビルドできる、ということはMacでもビルドできるということですね。

MacPortsを使えばOpenCVやFFmpegが簡単にインストール出来ます。

$ export PATH=/opt/local/bin:/opt/local/sbin:$PATH
$ export MANPATH=/opt/local/man:$MANPATH
$ sudo port selfupdate
$ sudo port sync
$ sudo port install opencv
$ sudo port install ffmpeg
$ export LIBRARY_PATH=/opt/local/lib:$LIBRARY_PATH
$ export LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH
$ export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
$ export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
$ cd cvdrone-master/build/linux
$ make
$ ./test.a

これは便利♪

cvdrone_on_mac.png


MacでAR.Droneを動かしたい方は是非CV Droneをお試しください。導入はとても簡単です。

【告知】
CV Drone 開発ページではマルチプラットフォーム対応のFTPクライアントを実装してくれる人を
募集しています。「我こそは」という方は是非ご参加ください。私もやります。
私がやりました
スポンサーサイト



AR.Droneを動かそう(フライトアニメーション)

AR.Droneには標準でグルグル回ったりダンスしたりなど、あらかじめ設定されたアニメーションを再生する機能があります。

void ARDrone::setAnimation(int id, int duration)
{
// コマンド送信
sockCommand.sendf("AT*ANIM=%d,%d,%d\r", seq++, id, duration);
}
AT*ANIMというのが該当するコマンドです。durationは再生のタイムアウトですが、デフォルト値(下記サンプル参照)を使うことが推奨されています。

AR.Drone2.0からは「フリップ」が追加されました。さっそくサンプルで遊んでみましょう。
https://github.com/puku0x/cvdrone/blob/master/samples/sample_flight_animation.cpp

#include "ardrone/ardrone.h"

// --------------------------------------------------------------------------
// main(Number of arguments, Argument values)
// Description : This is the entry point of the program.
// Return value : SUCCESS:0 ERROR:-1
// --------------------------------------------------------------------------
int main(int argc, char **argv)
{
// AR.Droneクラス
ARDrone ardrone;

// 初期化
if (!ardrone.open()) {
printf("Failed to initialize.\n");
return -1;
}

// バッテリ残量 (20%以上必要)
printf("Battery = %d%%\n", ardrone.getBatteryPercentage());

// 操作説明
printf(" Q - ARDRONE_ANIM_PHI_M30_DEG\n");
printf(" A - ARDRONE_ANIM_PHI_30_DEG\n");
printf(" Z - ARDRONE_ANIM_THETA_M30_DEG\n");
printf(" W - ARDRONE_ANIM_THETA_30_DEG\n");
printf(" S - ARDRONE_ANIM_THETA_20DEG_YAW_200DEG\n");
printf(" X - ARDRONE_ANIM_THETA_20DEG_YAW_M200DEG\n");
printf(" E - ARDRONE_ANIM_TURNAROUND\n");
printf(" D - ARDRONE_ANIM_TURNAROUND_GODOWN\n");
printf(" C - ARDRONE_ANIM_YAW_SHAKE\n");
printf(" R - ARDRONE_ANIM_YAW_DANCE\n");
printf(" F - ARDRONE_ANIM_PHI_DANCE\n");
printf(" V - ARDRONE_ANIM_THETA_DANCE\n");
printf(" T - ARDRONE_ANIM_VZ_DANCE\n");
printf(" G - ARDRONE_ANIM_WAVE\n");
printf(" B - ARDRONE_ANIM_PHI_THETA_MIXED\n");
printf(" Y - ARDRONE_ANIM_DOUBLE_PHI_THETA_MIXED\n");
printf(" H - ARDRONE_ANIM_FLIP_AHEAD\n");
printf(" N - ARDRONE_ANIM_FLIP_BEHIND\n");
printf(" U - ARDRONE_ANIM_FLIP_LEFT\n");
printf(" J - ARDRONE_ANIM_FLIP_RIGHT\n");

// メインループ
while (1) {
// キー入力
int key = cvWaitKey(30);
if (key == 0x1b) break;

// 更新
if (!ardrone.update()) break;

// 画像取得
IplImage *image = ardrone.getImage();

// Spaceキーで離着陸
if (key == ' ') {
if (ardrone.onGround()) ardrone.takeoff();
else ardrone.landing();
}

// フライトアニメーション
if (key == 'q') ardrone.setAnimation(ARDRONE_ANIM_PHI_M30_DEG, 1000);
if (key == 'a') ardrone.setAnimation(ARDRONE_ANIM_PHI_30_DEG, 1000);
if (key == 'z') ardrone.setAnimation(ARDRONE_ANIM_THETA_M30_DEG, 1000);
if (key == 'w') ardrone.setAnimation(ARDRONE_ANIM_THETA_30_DEG, 1000);
if (key == 's') ardrone.setAnimation(ARDRONE_ANIM_THETA_20DEG_YAW_200DEG, 1000);
if (key == 'x') ardrone.setAnimation(ARDRONE_ANIM_THETA_20DEG_YAW_M200DEG, 1000);
if (key == 'e') ardrone.setAnimation(ARDRONE_ANIM_TURNAROUND, 5000);
if (key == 'd') ardrone.setAnimation(ARDRONE_ANIM_TURNAROUND_GODOWN, 5000);
if (key == 'c') ardrone.setAnimation(ARDRONE_ANIM_YAW_SHAKE, 2000);
if (key == 'r') ardrone.setAnimation(ARDRONE_ANIM_YAW_DANCE, 5000);
if (key == 'f') ardrone.setAnimation(ARDRONE_ANIM_PHI_DANCE, 5000);
if (key == 'v') ardrone.setAnimation(ARDRONE_ANIM_THETA_DANCE, 5000);
if (key == 't') ardrone.setAnimation(ARDRONE_ANIM_VZ_DANCE, 5000);
if (key == 'g') ardrone.setAnimation(ARDRONE_ANIM_WAVE, 5000);
if (key == 'b') ardrone.setAnimation(ARDRONE_ANIM_PHI_THETA_MIXED, 5000);
if (key == 'y') ardrone.setAnimation(ARDRONE_ANIM_DOUBLE_PHI_THETA_MIXED, 5000);
if (key == 'h') ardrone.setAnimation(ARDRONE_ANIM_FLIP_AHEAD, 15);
if (key == 'n') ardrone.setAnimation(ARDRONE_ANIM_FLIP_BEHIND, 15);
if (key == 'u') ardrone.setAnimation(ARDRONE_ANIM_FLIP_LEFT, 15);
if (key == 'j') ardrone.setAnimation(ARDRONE_ANIM_FLIP_RIGHT, 15);

// 表示
cvShowImage("camera", image);
}

return 0;
}
ARDRONE_ANIM_VZ_DANCEはバグのせいか全く動きません

また、フリップを実行するとAR.Droneは自動で安全な高さ(3mぐらい)まで上昇するので、天井の低いところでは失敗することがあります。

まぁ、もともとデモ用ですしおすし。

Linux (Ubuntu 12.04) で CV Drone

Linuxユーザの皆さま、お待たせしました。

先日の更新で、CV Droneは正式にLinuxをサポートするようになりました。

$ sudo apt-get install ffmpeg
$ sudo apt-get install libopencv-dev
$ cd cvdrone-master/build/linux
$ make
$ ./test.a

cvdrone_on_ubuntu.jpg

3月から計画していたのですが、なかなか実行に移せませんでした。
pthreadとかトリプルブートで遊んでいたのはその一環だったりします。

HOG使ってみた

HOG(Histogram of Oriented Gradient: 勾配方向ヒストグラム)は、画像をいくつかの領域に分け、各領域内のエッジがどの方向にあるかのヒストグラムを計算するものです。

OpenCVにはHOG+SVMの物体検出器が実装されてありますので、早速組み込んでしまいましょう。
リファレンスでは、cv::HOGDescriptorについては解説されていません。

#include "ardrone/ardrone.h"

int main(int argc, char *argv[])
{
// AR.Droneクラス
ARDrone ardrone;

// 初期化
if (!ardrone.open()) {
printf("Failed to initialize.\n");
return -1;
}

// HOGさん
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());

while (1) {
// キー入力
int key = cv::waitKey(1);
if (key == 0x1b) break;

// 更新
if (!ardrone.update()) break;

// 画像取得
cv::Mat img(ardrone.getImage());

// HOG特徴の検出
std::vector found;
hog.detectMultiScale(img, found, 0, cv::Size(4,4), cv::Size(0, 0), 1.5, 2.0);

// 表示
std::vector<cv::Rect>::const_iterator it;
for (it = found.begin(); it != found.end(); ++it) {
cv::Rect r = *it;
cv::rectangle(img, r.tl(), r.br(), cv::Scalar(255,0,0), 2);
}
cv::imshow("hog", img);
}

return 0;
}
結果はこんな感じです。

hog_test.jpg
今回は公安6課の方々に実験を協力してもらいました。

パラメータも少し調整しましたが、やはり処理が重いですねぇ。

Wikipediaの記事
http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients

論文
http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf
プロフィール

puku

Author:puku
暇な時はゲームかプログラミングしてる人だよ。
だいたい月1更新。
CV Drone はこちら(GitHub)

最近はQiitaでOnsenUI2で遊んでいる。

最新記事
最新コメント
最新トラックバック
検索フォーム
カレンダー
07 | 2013/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
月別アーカイブ
カテゴリ
スポンサードリンク
RSSリンクの表示
FC2カウンター
リンク
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
607位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
120位
アクセスランキングを見る>>
FC2ブログランキング

FC2Blog Ranking

QRコード
QR