Follow Me

Robotがkinectを使って人を追跡することについて考えてみる。

すでに人を認識することはNiteによってかなり楽にできる。
また、人とkinectの間に何か物があったりしない限り、ユーザに割り振られたIDがきっちりと作用する。
センサーの範囲外でもすぐに同じ位置から視界に戻るともとのIDを割り当てられる。
うん、じゃーほとんどすることないね。kinectが動かなければ。

kinectを動かす場合つまり、ロボットに乗せて人追跡を行う場合Niteで認識したIDをそのまま使うことは、
まぁ、できない。原因はいろいろあるけれど、ロボットに乗せた状態で実際に人認識させるとわかる。
わかりやすいのは誤認識の多さ。

そりゃそうだ、kinectはもともと位置を固定して使うためのものなのだから、そこで自分でユーザの認識を作る必要がある。
といっても、全部作るわけではなく、Niteを上手く使えばいい。

前提となるのは、Niteは必ず誤認識するということ。おそらく、人を見逃すよりも人でないものを人と認識する方が多い。

人かどうかを厳密にやりたいならボーンが取れるかどうか確認し(チェック1)、ボーンが常識的な位置関係か(チェック2)を調べることで実現できる。

しかし、問題は追跡している人物かそれ以外の人(第三者)なのかということ。

簡単なのは位置関係。
追跡を開始したところからターゲットの位置情報を記録し、移動したと思ったら前回の位置との距離を計算する方法。
これなら、常識的に移動可能な範囲に追跡したい人がいるか判定できる。ロボットの移動速度なんかも使うとより良い結果になる。

一度センサーの範囲から出た場合はどうだろう。

その場合、"特定人物認識"しなくてはならない。

あらかじめ、または追跡中に何かしらの情報を得て置く必要がある。
kinectの場合、距離と画像が取得できる。
この場合、
 人の身長、ウエスト、肩幅、洋服、顔などの情報が有効かつ簡単に使える。

OpenCVを使って洋服が登録してあるものか、顔はどうか( もちろん、着替えた場合は洋服の情報は使えないし、整形もだめだろう )
3次元座標で身長、ウエストはどうか( 身長を伸ばすぶら下がり健康棒、全力を出してさらしを巻くのもNGにちがいない )

もちろん、あれだけど、胸の大きさとかも使っていいよね、ほら性別判定とかで ^^

という風に、いろいろつかって認識できたらまた追跡。

実はこれが RoboCup@home の Follow me というタスク

自分たちのロボットあんまりうまくいってないが ^^;

続きを読む »

Android dev guide( Application Fundamentals ,Application Componentsまで)

ながいので、途中まで。
http://developer.android.com/guide/topics/fundamentals.html

***************************************************


Application Fundamentals(アプリケーションの基礎)

アンドロイドのアプリケーションはJava言語で書かれている。
アンドロイドのSDKツールは任意のデータとリソースと一緒にコードをコンパイルする。
アンドロイドのパッケージは 拡張子が.apkのアーカイブファイルだ。
一つの.apkファイル内のコード全ては一つのアプリケーションであると考えられ、
アプリケーションのインストールに使用される。

デバイスにインストールされると、各アンドロイドアプリケーションは
独自の保護されたサンドボックス内で動作する。

  ・アンドロイドのオペレーティングシステムは各アプリケーション事に
異なったユーザがつかうマルチユーザリナックスシステムである。
  ・デフォルトでは、そのシステムはアプリケーションごとにユニークな
リナックスユーザID(そのIDは システム内でのみ利用されアプリケーションには知らされない)を割り当てる。
オペレーティングシステムはそのユーザIDにのみ、そのアプリケーション内のすべてのファイルへのアクセス許可を与える。
  ・各プロセスはそれぞれ virtual machine (VM)をもっているので、ひとつのアプリケーションのコードは
他のアプリケーションとは独立してる。
  ・デフォルトでは、各アプリケーションは独自のリナックスプロセスで実行される。
アンドロイドは任意のアプリケーションが実行される必要がある時そのプロセスをスタートし、
もはや必要がなくなった時、または他のアプリケーションのためにメモリーを確保する必要がある時は、
プロセスをシャットダウンする。

この方法では、アンドロイドシステムは最小権限の原則(アクセス権限は必要最小限)を実装している。これは、互いのアプリケーションは
デフォルトでは、動くように要求されたコンポーネントにのみアクセスする。これは、アプリケーションが
許可を与えられていないシステムの部分にアクセスすることができないセキュアな環境を作成する。

しかしながら、他のアプリケーションとデータをシェアするアプリケーション、
システムサービスにアクセスするアプリケーションのための方法もある。

  ・2つのアプリケーションで互いのファイルにアクセスしたい場合、同じリナックスユーザIDに合わせる事ができる。
システムのリソースを保護するために、同じユーザIDのアプリケーションはおなじVM(アプリケーションは同じ鍵でサインされなくてはならない)で
同じリナックスプロセスで動作させることもできる。
  ・ひとつのアプリケーションはユーザとの契約、SMS message, マウントされたストレージ(SD card),カメラ、Bluetoothなどのようなデバイスデータに
アクセスすることを許可するように求めることができる。すべてのアプリケーションの許可はユーザによってインストールされた時に尋ねなくてはならない。

システム内のアンドロイドアプリケーションがどう存在しているかの基本についてカバーした。このドキュメントの
残りで紹介する。

  ・コアフレームワークコンポーネントはあなたのアプリケーションを定義する。
  ・マニュフェストファイルはあなたのアプリケーションのためのデバイスの機能を要求し、コンポーネントを宣言する。
  ・リソースはアプリケーションのコードから分離され、あなたのアプリケーションが正常に動くように、
   デバイスの構成などの様々な動作を体よく最適化することができる。


Application Components(アプリケーション コンポーネント)

アプリケーションコンポーネントはひとつのアンドロイドアプリケーションのビルドに必要なブロック(部品)。
互いのコンポーネントはあなたのアプリケーションに参加することができるシステムを通して異なったものである。
すべてのコンポーネントはユーザの実際のエントリポイントであり、いくつかは互いに依存する。またそれぞれが独自の実態として存在し、
しかし、特定の役割を果たしたり、独自のエントリーとして存在している。
各々はあなたのアプリケーションの全体的な動作を定義するのを助けるユニークなビルディングブロックである。

アプリケーションコンポーネントのタイプは4つの異なるタイプに分けられる。それぞれのタイプは異なる目的のサービスでコンポーネントがどう作られどう破棄されるかの定義の異なるライフサイクルを持っている。

ここに4つのタイプのアプリケーションコンポーネントを記す。


Activities
 アクティビティは、ユーザーインターフェイスを持つ単一の画面を表す。例えば、Eメールアプリケーションは一つのアクティビティとして新しいEメールのリストを見せ、他のアクティビティとしてEメールの作成、そしてまた別のアクティビティとしてEメールの読み込みの機能を持っているかもしれない。ただし、アクティビティはEメールアプリケーション内でユーザの経験とのつながりを形作るために一緒になって働き、互いは他とは独立している。このように、異なったアプリケーションではそれらのアクティビティ(もし、Eメールアプリケーションが許可していれば)のいずれかをスタートさせることができる。例えば、カメラアプリケーションは新しいEメールを作成するために写真を共有し、Eメールアプリケーション内でアクティビティをスタートすることができる。


アクティビティは"Activity"のサブクラスとして実装される。あなたは"Activities"のデベロッパーガイドでより詳しく学ぶことができる。


Services
サービスはリモートプロセスのために動作するか、長い間操作するためにバックグラウンドで動作するコンポーネントである。サービスはユーザインタフェースを提供しない。例えば、サービスは異なったアプリケーションを使用している間バックグラウンドで音楽を再生したり、アクティビティによってユーザにブロックされることなくネットワーク越しのデータを読み込むかもしれない。そのようなアクティビティ動作をする別のコンポーネントは、サービスを始め、動作させ、ユーザに対応させるように、結合させることができる。

サービスは"Service"のサブクラスとして実装され、あなた"Services"のデベロッパーガイドでより詳しく学ぶことができる。

Content providers
"content provider"はアプリケーションデータのシェアされるセットを管理する。あなたはファイルシステム内のデータを、SQLiteデータベースだったり、ウェブ上だったり、あなたのアプリケーションがアクセスできる他の場所にあるストレージに保存することができる。"content provider"を介して、他のアプリケーションは、データ("content provider"が許すなら)に問い合わせをしたり、修正を行うことができる。例えば、アンドロイドシステムはユーザの接続情報の管理をする"content provider"を提供する。このように、適切な許可のある任意のアプリケーションは特定の人間について情報を読み書きするために"content provider"(ContactsContract.Dataのような)に部分的に問い合わせることができる。

"Content provider"はあなたのアプリケーションアプリケーションでを非公開にし、シェアせず、データを読み書きする場合もまた便利である。"Note Pad"のサンプルアプリケーションはノートをメモするために"content provider"を用いている。

"content provider"は"ContentProvider"のサブクラスとして実装され、他のアプリケーションがトランザクションを実行するために標準となるAPIのセットを実装しなければならない。より多くの情報は"Content Providers"のデベロッパーガイドをみてくれ。

Broadcast receivers
"broadcost receiver"はシステム全体の通知に関する応答を行うコンポーネントだ。多くの通知がシステムに由来している。例えば、スクリーンが回転した、バッテリーが残り少ない、写真をとったといった通知だ。アプリケーションは、例えば デバイスにそれを使うために、なにかしらのデータをダウンロード中でということを他のアプリケーションに通知することも可能である。"broadcast receiver"をユーザインタフェースに表示することを通して、イベントが起こったことをユーザに通知するためのアラートのためにステータスバーに通知を出すことができる。より、一般的には、他のコンポーネントにとって"gateway"であり、仕事を最小限に行わせるものである。例えば、イベント駆動型のいくつかのタスクを実行するためのサービスを開始するかもしれない。

"broadcast receiver"は"BroadcastReceiver"のサブクラスとして実装され、互いのbroadcastは"Intent"として届けられる。より詳しい情報は"BroadcastReceiver"クラスを見てくれ。

Androidのシステムデザインのユニークな側面は他のアプリケーションのコンポーネントを開始する事ができることだ。例えば、ユーザがカメラをつかって写真が撮れるようにしたいなら、おそらく他のそのアプリケーションが存在しているだろう、あなたのアプリはそのアプリケーションを自身で開発する代わりに使うことができる。あなたはカメラのアプリケーションへのリンクを組み込む必要さえない。コンパイル時に、写真は、あなたの利用できるあなたのアプリケーションへ返される。ユーザにとってはカメラは実際にあなたのアプリケーションにあるようにみえる。

システムがコンポーネントをスタートさせる時、アプリケーションのためのプロセスをスタートさせ、コンポーネントに必要なクラスをインスタンス化する(すでに起動していないのならば)。例えば、写真を撮るというカメラのアプリケーションのアクティビティをあなたのアプリケーションで開始させるなら、そのアクティビティはあなたのアプリケーションプロセスに属しておらず、カメラのアプリケーションに所属しているプロセスで実行する。したがって、他のアプリケーションのほとんどとは違って、アンドロイドのアプリケーションはシングルエントリーポイントを持たない(例えば、 main() のようなもの)。

システムは、他のアプリケーションへのアクセスを制限するための許可をもつ本来のプロセスとは分離したプロセスが各アプリケーションを実行しているので、あなたのアプリケーションは、他のアプリケーションから直接コンポーネントをアクティブにできない。
しかしながら、アンドロイドシステムでは、可能だ。
そう、他のアプリケーションからコンポーネントをアクティブにするためにあなたは特定のコンポーネントをスタートさせるというあなたの意図を汲んだシステムへメッセージを送らなくてはならない。その後システムはあなたのためのコンポーネントをアクティブにする。

****************************************
まぁ、だいたい意味はとれるかな。

Android dev guide( What is Android?)

そのままの訳でなく、自分の解釈で。
http://developer.android.com/guide/basics/what-is-android.html


アンドロイドとは?

アンドロイドとはミドルウェアとキーアプリケーション、オペレーティングシステムを含んだモバイルデバイスのためのソフトウェアの集まりです。
AndroidSDKはJava言語を用いてのいるAndroidプラットフォーム上でのアプリの開発をはじめるために必要なAPIとツールを提供します。


1.Features (機能)
 ・Application framework ……再利用、再配置可能なコンポーネント
 ・Dalvik virtual machine ……モバイルデバイスのために最適化されたもの
・Integrated browser……オープンソースであるWebKit engineを基としている
・Optimized graphics……OpenGL ES 1.0を基本とした3Dグラフィクス、カスタマイズした2Dグラフィクスライブラリ。
SQLite……構築されたデータストレージに用いる
・Media support……一般的なオーディオ・ビデオ・画像フォーマット(MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF)
・GSM Telephony……ハードウェア依存
Bluetooth,EDGE, 3G, and WiFi……ハードウェア依存
・Camera,GPS,compass and accelerometer……ハードウェア依存
・Rich development environment……メモリのパフォーマンスのプロファイル、デバッグのためのエミュレータデバイスを含み、eclipseのプラグインである。


2.Android Architecture(アンドロイドの構造)
図参照

3.Applications(アプリケーション)
アンドロイドにはemailクライアント,SMS program,カレンダー、地図、ブラウザ、コンタクト、その他を含んだコアアプリケーションセットが搭載されている。
すべてのプログラムはJava言語で記述されている。

4.Application Framework(アプリケーションフレームワーク)
オープンな開発環境を提供することによって、Androidは開発者に非常にリッチで革新的なアプリケーションを構築する能力を提供する。


コアアプリケーションによって使われるものと同じフレームワークのAPI全てにアクセスすることができる。
そのアプリケーションのアーキテクチャはコンポーネントを再利用するために単純にデザインされている:任意のアプリケーションは他のアプリケーションを制限することができる。これと同じメカニズムは、ユーザによってコンポーネントを置き換えることができる。


基本的な全てのアプリケーションは次のようなサービスとシステムを含んでいる:

・リッチで拡張性のある" Views "は、リスト、グリッド、テキストボックス、ボタン、埋め込まれたwebブラウザですら含む一つのアプリケーションをビルドするために使用される。

・"Content Providers" は他のアプリケーションからアプリケーションのデータへのアクセスを可能とするか、それ自身のデータをシェアすることができる。

・"Resourrce Mamager"はローカライズされた文字や、グラフィクス、レイアウトファイルのようなコードでないリソースへのアクセスを提供する。

・"Notification Manager"は全てのアプリケーションのステータスバー内でのカスタムアラートを表示することを可能とする。

・"Activity Manager"はアプリケーションのライフサイクル(寿命)を管理し、一つの共通のバックグラウンドの動作を提供する。

・アプリケーションのデモと詳細は "Notepad Tutorial"を見てくれ。



5.Libraries(ライブラリ)
アンドロイドはアンドロイドシステムの多様なコンポーネントを使うことによって、C/C++のライブラリを含んでいる。それらの機能は アンドロイド アプリケーションフレームワークを通して開発者に公開されている。下にリストされているのはコアライブラリのうちのいくつかだ。

・"System C library"……BSD派生の標準C(libc)ライブラリの実装。リナックスベースのデバイス用にチューンされている。
・"Media Libraries"……PacketVideo's OpenCOREをベースにしている。このライブラリは多くのポピュラーなオーディオ、ビデオの再生とレコーディングさらに、画像ファイルなどをサポートしている。 MPEG4,H.264, MP3, AAC, AMR, JPG , PNG。
  ・"Surface Manager"……ディスプレイサブシステムへのアクセスを管理し、複数のアプリケーションから2Dと3Dのグラフィクスレイヤーをシームレスに合成する。
・"LibWebCore"……Androidブラウザも埋め込みのweb viewも両方共につかわれるモダンなwebブラウザエンジン。
・"SGL"……2Dグラフィクスエンジンの基本。
・"3D libraries"…… OpenGL ES 1.0 APIを基本として実装している:そのライブラリは3Dアクセラレータを使うか高度に最適化された3Dソフトウェアラスタライザーを用いる。
・"FreeType"……ビットマップとベクターフォントのレンダリング。
・"SQLite"……全てのアプリケーションで利用可能なパワフルで軽量なリレーショナルデータベースエンジン。


6.Android Runtime(アンドロイド ランタイム)
AndroidはJava言語のコアライブラリの機能の大部分を供給することができる。

Androidアプリケーションをそれぞれのプロセスで走らせるたびにDalvik virtual machineのインスタンスが作成される。Dalvik実行フォーマットは最小限のメモリーのフットプリントに最適化されている。このVMはレジスタベースでかつ、"dx"toolを含んでいることでdexフォーマットを変形しJavaのコンパイラによってコンパイルされたクラスを走らせるものだ。

Dalvik VMは低レベルのメモリー管理とスレッディングのような基本的な機能のためにLinuxカーネルに依存している。

7.Linux Kernel(リナックス カーネル)
アンドロイドは セキュリティ、メモリーマネージメント、プロセスマネージメント、ネットワークスタック、ドライバーモデルのようなコアシステムサービスのために、Linux ver2.6に依存している。そのカーネルはハードウェアとソフトウェアスタックの残りの部分との間の抽象化レイヤとして動作する。



***********************
この記事がいい http://itpro.nikkeibp.co.jp/article/COLUMN/20091126/341182/?ST=android-dev

後輩と色々話をした時、専門用語を使わないでくださいといわれたので、できる限りリンクを貼った。

OpenNI ジェスチャーでマウス操作

HandGeneratorやGestrureGeneratorをつかって手を追跡してその値を使ってマウスを操作するプログラムを作っってみた。

ジェスチャーのクリックでマウスのクリックをさせるのはだいぶ無理w
別のジェスチャーにしたほうが安定。

スケールを合わせただけだから、認識した位置を画面の中心として移動させるとかいろいろ試したら移動はよさそう。

kinectのゲームでは一定時間アイコンの上にカーソルがあったらクリックみたいな扱いだった。

こんかいのプログラム


つぎはこれを修正していく。