加速度センサ と ローパスフィルタ (アプリ)


前の記事 (波形) (周波数) では、下記の式が ローパスフィルタ になることは分かりました。

y[i] = 0.9*y[i-1] + 0.1*x[i]

では、下記のように、比率が変わった場合はどうでしょうか。

y[i] = 0.8*y[i-1] + 0.2*x[i]

また、実際のAndroidの加速度センサでは、どのくらい有効でしょうか。

この辺を体感できるアプリがありました。

加速度センサービュー
Android携帯の加速度センサーを視覚化するアプリです。
10%となっているシークバーが、式の比率に当たると思われます。

accelerometer graph

関連
加速度センサ と ローパスフィルタ (波形)
加速度センサ と ローパスフィルタ (周波数特性)


加速度センサ と ローパスフィルタ (周波数特性)


前の記事(波形) では、下記の2つのローパスフィルタは波形が異なることが分かりました。

・ローパスフィルタ1

y[i] = ( x[i] + x[i-1] + x[i-2] ) / 3
     = 0.333*x[i] + 0.333*x[i-1] + 0.333*x[i-2]

・ローパスフィルタ2

y[i] = 0.9*y[i-1] + 0.1*x[i]

漸化式
一見、2の方が簡単に見えますが.
1のような x(センサ情報) だけの漸化式で表現すると、下記の式になります。

y[i] = 0.9*y[i-1] + 0.1*x[i
     = 0.9*( 0.9*y[i-2] + 0.1*x[i-1] ) + 0.1*x[i]
     = 0.1*x[i] + 0.1*0.9*x[i-1] + 0.1*(0.9**2)*x[i-2] + 0.2*(0.9**3)*x[i-3] +  ...

つまり、過去のセンサ情報を全て利用した、重み付け平均 になります
なんとなくですが、2の方が平準化されることが理解できると思います

周波数特性
もっと数学的に表現する方法もあります。
フィルタといえば、周波数特性ですね。

詳しい説明は、デジタル信号処理の教科書に任せて。
ここでは、デジタル信号処理のツールである scilab を利用します。

scilab 実行

// フィルタ1
[hm,fr]=frmag([0.333,0.333,0.333],1,256);
plot2d(fr,hm,2);

// フィルタ2 5次式に簡略化
[hm,fr]=frmag([0.1, 0.09, 0.081, 0.0729, 0.06561],0.41,256);
plot2d(fr,hm,5);

実行結果
赤(フィルタ2)の方がより急峻な遮断特性(カットオフ特性)を持っていることが分かります。
このような周波数特性の違いが、前の記事の波形の違いとなります。

freq

これらの式が、実際のAndroidの加速度センサではどのくらい有効なのかについては、次の記事(アプリ) で説明します。

参考
wikipedia デジタル信号処理
wikipedia scilab

関連
加速度センサ と ローパスフィルタ (波形)
加速度センサ と ローパスフィルタ (アプリ)


加速度センサ と ローパスフィルタ (波形)


android の加速度センサを調べていたら、プログラム例として、下記のような式が頻出していた。
現在の値 = 0.9 * ひとつ前の値 + 0.1 * センサの値

しかし、これが何をするものかの説明がほとんどなかった。
そこで少しだけ詳しく説明する。

目的
センサから情報には、センサ自体の精度や感度による誤差や、手に持った場合の手ぶれの影響などが含まれます。
本来検出したいセンサ情報を得るのは、素早い振動成分(高周波成分)を取り除くて、変動幅が小さい有効成分(低周波成分)だけを取りだす必要があります。
このための仕組みが、ローパスフィルタ(Low Pass Filter 低周波通過濾波器) です。

原理
詳しい原理は、デジタル信号処理 の教科書に任せて。
ひとまずは、加算平均すると、ローパスフィルタになると、覚えておけばよい。

ソースコード
ソースコードは code.google に掲載した

Android との親和性を考慮して、Java Applet で記述した。
センサから情報の代わりとして、サインカーブにノイズを付加したものを使用した。

・ローパスフィルタ1
よく使用されるのは、過去3回のセンサ情報を平均したものです。
数式で表すとこんな感じ。

y[i] = ( x[i] + x[i-1] + x[i-2] ) / 3

・ローパスフィルタ2
冒頭の Android プログラムの式です。
数式で表すとこんな感じ。

y[i] = 0.9*y[i-1] + 0.1*x[i]

実行結果
ローパスフィルタ1は、ノイズ成分が除去されて、滑らかになっています。
ローパスフィルタ2は、さらに滑らかになっています。

wave

なぜ、このような違いが出るかは、次の記事(周波数特性) で説明します。

参考
傾き、加速度の手振れノイズをフィルターする
加速度センサから重力の影響を取り除く
Android_加速度センサー 概要 (PDF)
wikipedia デジタル信号処理

関連
加速度センサ と ローパスフィルタ (周波数特性)
加速度センサ と ローパスフィルタ (アプリ)


Android アプリマスターコース 第2日目


android master banner

2011年8月28日(日)にニフティ本社で行われた RainbowApps 主催の Android アプリマスターコース にアシスタントとして参加しました。
コースは、5時間×全5回で、毎回2本づつAndroidアプリを作成するもので、先週の第1日目 の続きで第2日目になります。
講師は、藤原さとる さんです。

■ 3本目のアプリ
このアプリは、Activityファイルを3つと、その他のクラス・ファイルを3つ作る、それなりに分量があるものでした。
そのため、コーデング・エラーや実行時エラーで躓く人が多かったです。
独学だと、ここで足踏みしてしまい、なかなか先に進まないですね。

(3) 単語帳アプリ
・Activityの基本
・IntentによるActivity間の遷移方法
・ListActivityの使い方
・メニューの作成方法

flashcard

■ 4本目のアプリ
動画再生に関してトラブルがありました。
実機では動画を表示するが、エミュレータでは黒いまま何も表示しない、という現象です。
MAC Book Air や MAC Book Pro で発生した。
残念ながら、原因が分からなかった。

(4) 動画検索・再生アプリ
・動画の再生
・Youtube上の動画検索
・音声認識を利用した検索
・アプリのデバッグ方法

videoplayer

■ ブレイクタイム講座
アシスタントの 高橋信也 さんから、iPhone と Android のユーザ層の違いについて、講義がありました。
昨年は、iPhone は、10歳代から50歳代までと裾野が広く、特に20歳代30歳代が半分くらいである。男女比は若干男性が多いくらいで、幅広い層から支持されている様子である。
Android は、20歳代30歳代が圧倒的に多く、男性が70%である。ITに詳しい若いビジネスマンが中心と思われる。
今は、両者とも似てきていて、20歳代30歳代が半分くらいで、男性が70%近くである。一般的な層に幅広く普及しつつある。

参考
2010年2月 Androidユーザーの約7割は男性
2011年4月 iPhone・Andoroidのユーザー層の違いは?

■ 懇親会
終了後に、講師陣と受講生の懇親会がありました。
有料講座なので、ソフト開発が本業の人達だろうと思っていましたが、ソフト関連以外の業種で自己啓発という人も数人いて、ちょっと驚きました。
話題も幅広く、楽しいかったです。

関連
Android アプリマスターコース 第1日目
・Android アプリマスターコース 第2日目
Android アプリマスターコース 第3日目
Android アプリマスターコース 第4日目
Android アプリマスターコース 第5日目


2011年8月 横浜支部 定例会


2011年8月27日(土)に石川町の かながわ労働プラザ で行われた 日本アンドロイドの会 横浜支部 定例会 に参加した。

今回は、大幅に遅刻した。(^^;
駅に着いたところで、忘れ物に気づき、取りに戻ったので、1時間以上ロスした。
Twitter を見ていると、支部長も寝坊して遅刻した そうな。

午前の2つの講演は聞けず。
・AdMob で実現する無料アプリの収益化 グーグル社
・g-Developer紹介と開発者実情 カイト社

午後からのセッション
■ ECHOハッカソン報告  京セラ / 北澤様
8月6日の ECHOハッカソン について報告された。
ECHO は京セラが北米向けに出荷しているアンドロイド携帯です。
折り畳み式2画面という特徴があります。
当日作成されたアプリが紹介された。
優勝アプリは2画面で動画を見せて3Dになるもの。
優勝者の @goroh_kun さんには ECHO が贈与された。

■ 手書きコミュニケイション 7notes with Mazec MetamoJi / 浮川様
ジャストシステムの創業者 浮川初子 さんの講演です。
60歳くらいのはずだが、お若く見えました。
その歳で新しいことにチャレンジする姿勢も見習いたい。

Mazec は手書き文字認識のシステムです。
従来の文字認識との違いは、入力した文字がテキストに変換されることなく、そのまま画像として表示されます。
内部的に文字コードと結びついています。

そういえば、ザウルスには手書き入力がついていたなぁ。
アンドロイドにもあると便利ですね。

参考
浮川夫妻の新会社MetaMoji、iPad用の手書きノートアプリ「7notes」
手書き文字変換エンジン「mazec」のAndroid版が登場

■ 弥生スマートフォンアプリコンテスト開催のご案内  弥生 / 関根様
会計ソフトで著名な 弥生 から、スマートフォンアプリコンテストを開催するという告知がありました。
弥生製のソフトと連携するAPIが提供されます。
それを使ったアプリのコンテストを行います。

以降は、ライトニングトーク
■ App Inventor でロボットを動かした 私の発表です。
8月6日の App Inventor ハッカソン の報告と、その後で作った アプリ の紹介です。
ロボットはレゴ社の マインドストーム を使いました。

■ 本当は怖いAndroidカメラアプリ ねこめし さん
カメラアプリは機種により挙動が異なるという話でした。
発表資料は GoogleDocs から。

■ ABCで横浜支部の紹介をした & App Inventor ハッカソンの報告 マーニー さん
7月17日の ABC (Android Bazaar and Conference) にて発表した横浜支部の紹介と、
8月6日の App Inventor ハッカソン の報告や自分で作ったアプリの紹介など。
発表資料は SlideShare から。

■ ECHO ハッカソンの報告 kashimoto さん
8月6日の ECHOハッカソンにて、 ECHO を使った感想や、自分で作ったアプリの紹介など。

終了後の懇親会は、関内の バドワイザーカーニバル に。
前を通るたびに気になっていて、一度 行きたかった場所です。
念願が叶って嬉しい。

関連
App Inventor と Kyocera Echo のハッカソン
マインドストーム が届いた
アンドロイド から マインドストーム を動かす


アンドロイド から マインドストーム を動かす


YouTube Preview Image

マインドストームが届いた ので、アンドロイドから動かしてみた。
アンドロイドにプログラムには App Inventor を使用した。
App Inventor には マインドストーム を動かすための専門のコンポーネントLEGO MINDSTORMS が用意されています。
これらは、書籍 30分でつくれるAndroidアプリ にて詳しく説明されています。

書籍に載っていた見本を少し改良しました。
(1) 見本では、ブルーツースで接続するマインドストームを毎回デバイス一覧から選択するようになっていた。
今回は、一度選択したら記憶するようにして、次回からデバイス一覧を表示しないようにした。
TinyDB コンポーネントを使用した。

(2) 見本では、右回転、左回転には、時間制限がなく、ず~と回っていた。
今回は、だいたい1回転する時間の5秒後に停止するようにした。
Clock コンポーネントを使用した。

スクリーンショット

デザイナー (Designer)

ブロックエディタ (Blocks Editor)

ダウンロード (バーコード)

動かしてみる。 上段のビデオ。


身勝手ぐるめ がドコモのパンフに載った


frontapp

身勝手ぐるめ がドコモのパンフレットに載りました。
ただし、山口県限定だそうです。
次は首都圏進出だ (^o^)

担当者に伺った採用の理由。
・定番の「ぐるなび」を変わった切り口で利用できるので、面白いと思いました。
・山口県内に出回る冊子のため、山口県で使えるかを確認したところ、問題なく使えそうでした。
・デザインがかわいいのも要因の一つです。

「身勝手ぐるめ」は、グルメ情報サイト「ぐるなび」から近くの店をランダムに選択するアプリです。
このアプリは、日本アンドロイドの会 横浜支部 濱デ部 の Hack-a-Party に参加した4名で共同開発しました。
あらためて、濱デ部と共同開発者の方々に感謝します。


マインドストーム が届いた


YouTube Preview Image

アマゾン で注文していたマインドストームが届いた。
マインドストーム はレゴ社が販売している教育用のロボットのキットです。

えらく大きな箱です。
MAC Book や携帯電話と比較すると、その大きさが分かります。

さっそく組み立ててみる。
マニュアルを読む。

部品を揃える。

40分ほどで組み上がった。

動かしてみる。 Demo V2 (最初から入っているもの)
上段のビデオ。


Android エミュレータのパラメータ


Android エミュレータには様々なパラメータがある。
例えば、ネットワークの回線速度を遅くしたい場合は、下記のようにする

emulator -netspeed gsm

gsm: 上り: 14.4kbps 下り: 14.4kbps

eclipseから起動する場合は、実行(Run) -> 実行構成 (Run Configurations) から

参考
Emulator – Android エミュレータ
エミュレータの起動設定


1/10秒 Chronometer


Android 標準の Chronometer クラス (android.widget.Chronometer) では、
1秒周期でしか更新しない。

そこで、1/10秒周期に更新する MyChronometer クラスを作成した。
Chronometer クラスのコードをコピーして、1/10秒周期に変更した。
普通は既存クラスである Chronomete を継承するのだが、
private なメソッドが多くて、さほどコード量が減らなかったので、
コピーして変更した。

Chronometer のコード
MyChronometer のデモアプリ

変更のポイント
周期の実行には、Handler を利用している。
delay を 1000 ms (1sec) から 100 ms (0.1 sec) に変更する。

//public class Chronometer extends TextView {
public class MyChronometer extends TextView {
 
private Handler mHandler = new Handler() {
	public void handleMessage(Message m) {
		if (mRunning) {
			updateText(SystemClock.elapsedRealtime());
			dispatchChronometerTick();
 
// 1000 -> 100
//			sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);
			sendMessageDelayed(Message.obtain(this, TICK_WHAT), 100);
		}
	}
};

スクリーンショット
chronometer