ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ:Androidで動く携帯Javaアプリ作成入門(51)(3/3 ページ)
IoT/ウェアラブル時代に見直したいセンシング技術。Androidがサポートするセンサー一覧や基本的なセンサーアプリの作り方を解説します。
X軸、Y軸、Z軸に対する重力を計る「重力センサー」
重力センサーは加速度センサーと取り扱いが似ているセンサーで、データ構造は加速度センサーと全く同じです。加速度センサーがそれぞれの方向に対する加速度だったのに対し、重力センサーはそれぞれの方向に対する重力が渡されてきます。
重力センサーは重力加速度に特化した加速度センサーとも捉えることができます。このセンサーでは、デバイスを左右にスナップさせたとしても、センサーが通知してくる値に影響を与えません。また、X軸、Y軸、Z軸のベクトルの合計は重力加速度と一致するため、デバイスの姿勢を把握することも容易です。
余談ですが、重力センサーの通知してくる値を加速度センサーの実際の値を取得する際に使用している重力加速度を取り除くメソッドで変換すると、全ての軸に対する加速度が0になります。
さて、サンプルではX軸、Y軸の重力加速度に係数を与え、デバイスを傾けた方向にロケットが滑り落ちるようにしています。
@Override void repaint(Canvas canvas, Paint paint) { if (canvas != null) { // 加速度にメリハリを float xg = mValues[0] * Math.abs(mValues[0]); float yg = mValues[1] * Math.abs(mValues[1]); mX -= xg; mY += yg; // 過去5回分の平均を算出 float dx = 0, dy = 0; for (int i = 0; i < mPrevX.length; i++) { dx += mPrevX[i]; dy += mPrevY[i]; } dx = dx / mPrevX.length - mX; dy = dy / mPrevY.length - mY; // 移動距離が多いなら噴射 boolean hasFire = Math.sqrt(dx * dx + dy * dy) > 100; // ロケットの回転角を算出 float radian = (float) Math.atan2(dy, dx); float degrees = (float) (radian * 180 / Math.PI) - 90; Bitmap bitmap = hasFire ? mFiring : mPlain; // 各種描画 canvas.save(); canvas.rotate(degrees, mX + bitmap.getWidth() / 2, mY + bitmap.getHeight() / 2); canvas.drawBitmap(bitmap, mX, mY, null); canvas.restore(); canvas.drawText("x:" + mValues[0], 0, paint.getTextSize() * 1, paint); canvas.drawText("y:" + mValues[1], 0, paint.getTextSize() * 2, paint); canvas.drawText("z:" + mValues[2], 0, paint.getTextSize() * 3, paint); // 履歴保持 mPrevX[mCount] = mX; mPrevY[mCount] = mY; mCount++; if (mCount == mPrevX.length) { mCount = 0; } } }
どのような係数を与えるかはアプリ次第です。本サンプルでは加速度を2乗して、加速度が速い時により速くなるように演出しています。また一方で、突発的な加速度の変化を吸収する“あそび”も設けてあり、過去の5回分の平均加速度からロケットの移動距離を導き出すようにしています。
ロケットの移動速度が速い場合は噴射しているビットマップを描画するように制御しています。ロケットの移動に応じてビットマップを回転させるための回転角も計算しています。
加速度センサーと違い、常に重力方向に重力加速度が働いているという点が重力センサーを差別化するポイントでしょう(正確には加速度センサーも重力加速度が働いていますが)。このセンサーを利用したボールを転がすゲームはGoogle Playストアで幾つか見つかりますね。
X軸、Y軸、Z軸の回転速度を取得する「ジャイロスコープ」
ジャイロスコープはX軸、Y軸、Z軸の回転速度を取得可能なセンサーです。
回転速度の単位はrad/sです。ジャイロスコープの値の意味は以下の通りです。
- values[0]: X軸の回転速度
- values[1]: Y軸の回転速度
- values[2]: Z軸の回転速度
このセンサーは姿勢の変化を検出するのに適しています。
デモでは他のサンプルと同様、簡単のためにX軸とY軸の回転速度から、描画オブジェクトの座標変換を行っています。
@Override void repaint(Canvas canvas, Paint paint) { if (mPoints != null) { // X軸とY軸の回転速度を取得 float dx = mValues[1]; float dy = mValues[0]; // 係数を掛けて座標変換に用いる double theta = dy * 0.1; double phi = dx * 0.1; rotate(theta, phi); if (canvas != null) { canvas.drawText("x:" + mValues[0], 0, paint.getTextSize() * 1, paint); canvas.drawText("y:" + mValues[1], 0, paint.getTextSize() * 2, paint); canvas.drawText("z:" + mValues[2], 0, paint.getTextSize() * 3, paint); // 描画時に座標位置に合わせて透明度を計算 for (int i = 0; i < mPoints.length; i++) { float x = mPoints[i][1] * mScale * 4 + mRadius; float y = mPoints[i][0] * mScale * 4 + mRadius; float ratio = Math.abs((mPoints[i][2] - 1) / 3); int color = Color.argb((int) (ratio * 0xff), 0xff, 0xff, 0xff); paint.setColor(color); canvas.drawRect(x, y, x + 5, y + 5, paint); } } } }
動画の通りですが、このデモにはおまけとしてタッチで座標変換が行える機能もついています。
さて、ジャイロスコープの回転速度ですが、このサンプルでは「0.1」という係数を掛けてコード内で利用しています。回転速度をどのように用いるかによるのですが、机上に静止させている状態でも通知される値は微動し、よほどセンシティブなアプリではないなら、今回のサンプルのように係数を掛けるなり、ある一定の速度以下であれば無視するなどの対応を行うのが良さそうです。
次回は、Android 4.4で追加されたセンサー
今回はセンサーの中でも系統が似ていて、スマートフォンやウェアラブル端末で使用頻度が高そうな加速度センサー、重力センサー、ジャイロスコープを取り上げましたが、冒頭に記載した通り、Androidには多種多様なセンサーが存在します。
次回は、Android 4.4で追加されたステップカウンターなどのセンサーを取り上げる予定ですので、お楽しみに。
- グーグルのAPIを使うときに欠かせないGoogle OAuthの作り方と使い方
- 細か過ぎて伝わってないけど開発者が知っておきたいAndroid Mの新機能まとめ
- 腕時計から電話をかけるAndroid Wearアプリの作り方
- Android Wear用アプリの花形、時計アプリ「Watch Face」の基本的な作り方
- Android 5.0発表&スマホと連動する音声認識Android Wearアプリの作り方
- ウェアラブル端末用Android Wearアプリ開発の基礎知識
- 変わらないと生き残れないAndroid Lの新機能まとめ
- Android WearやIoTで注目のAndroidセンサー機能8選
- ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ
- あなたの知らないAndroid SDKの便利tools、14選まとめ
- Android 4.4のメモリ使用状況を把握する3つのツールの使い方
- Androidでリアルタイムマルチプレーゲームを開発するには
- 低性能端末でも使えるか? Android 4.4 KitKatの新機能39選
- もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能
- アプリにGoogle+のソーシャルグラフを持ち込めるGoogle Play Game Servicesの基礎知識
- あなたのアプリはクラウドにデータをバックアップできますか?
- Eclipse ADTに代わるIDEとなるか? Android Studioの基礎知識
- ActionBarで、アプリのUIはこんなにスマートになる
- Android 4.x時代のアプリにないと残念なActionBarとは
- 動的クラスローディングでAndroidアプリ“裏”開発
- Android 4.xのAndroidビームをアプリに組み込むには
- AndroidアプリでNFCタグを読み書きするための基礎知識
- 新タブレット時代を見据えるAndroid 4.2の新機能9選
- Androidからイヤフォンやヘルス機器とBluetooth通信するには
- Bluetoothを使ってAndroidアプリ同士で通信するには
- Androidアプリをアプリ内購読に対応してもうける方法
- 開発者が知らないと残念過ぎるAndroid 4.1の新機能36選
- Androidのプロセス間通信を自由自在にするAIDL
- Android 4.0のサービス/プロセス間通信の基本
- Androidアプリでマルチメディアを扱うための基礎知識
- Androidのウィジェットにノーティフィケーションするには
- Android 4.0で注目の顔認識をアプリに組み込むには
- Android 4.0でアプリ開発を始めるための環境構築
- 開発者が知らないと損するAndroid 4.0の新機能44選
- Android Compatibility packageで2.x系でもマルチサイズ対応
- Androidの画面の大きさの違いを解決するFragments
- Android 3.0の新APIで簡単ドラッグ&ドロップ実装
- 開発者が知って得するAndroid 2.3の新機能18選
- アニメーションでAndroidに独創的な画面エフェクトを
- Androidアプリで“アニメーション”するための基礎知識
- XMLレイアウトでAndroidアプリに“設定画面”を追加
- 開発者が知っておきたいAndroid 2.2の新機能12連発
- もはやケータイに必須のカメラをAndroidで制御しよう
- 地図/位置情報/GPSを使うAndroidアプリを作るには
- Android NDKでJNIを使用してアプリを高速化するには
- Android 2.1の新機能「Live Wallpaper」で作る、美しく燃える“待ち受け”
- iPhoneより多彩なAndroidのセンサをアプリで操作
- SurfaceViewならAndroidで高速描画ゲームが作れる
- Android 1.6のジェスチャーとテキスト読み上げを使う
- Androidのホーム画面に常駐するアプリを作るには
- Netbookにも広まるAndroidで、かつてないWeb体験を
- アプリを国際化してAndroid Marketから世界へ発信
- 常駐アプリが作成できるAndroidの“サービス”とは
- AndroidでSQLiteのDB操作をするための基礎知識
- Androidアプリの使いやすさを左右する5つのレイアウト
- 簡単でワクワクするAndroidウィジェット10連発!
- ブラウザや地図、ストリートビューの基、Intentとは?
- Androidアプリ作成の基本“Activity”とは何か?
- Android Market配布を目指しEclipseでHelloWorld!
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 頭脳放談:第160回 ウェアラブルによるスマホ補完計画始動
最近、ウェラブルに注目が集まっているようだ。ただ一口にウェラブルといってもさまざまなコンセプトがあるようだ。それぞれのコンセプトについて考えてみた。 - ウェアラブルデバイスの実務参入は進むか?:業務向けGoogle Glassアプリ開発促進フォーラム「Glass at Work」開設
もう、ホビー利用だけじゃない。Google Glassのディスプレーを活用したアプリケーションを、新サービスや業務環境の効率化に本格活用する動きをグーグルが支援する。 - テクノロジは人の考え方も変える:「ウェアラブル」の先にあるのは「トランスペアレント・コンピューティング」
Google Glassは、短期間のうちに、ウェアラブル・コンピューティング・デバイスの代表格のように語られるようになった。しかし、Google Glassが目指すのは、「ウェアラブル」を超えた世界であるはずだ。 - 「俺たちのJavaは、まだまだこれからだ」未来の鍵はInternet of Thingsにあり?〜JavaOne 2013まとめレポート(前編)
Java開発者の年次カンファレンス、JavaOne 2013がサンフランシスコで9月22〜26日に開催された。3つの基調講演、そして400を超えるセッションが行われるなど、圧巻のボリュームは、まさに「Java開発者の祭典」といえる。基調講演と主なセッション、全体の雰囲気を前中後編に分けてレポートする。 - 業務アプリInsider 読者調査レポート:業務アプリにおける次世代テクノロジの3大トレンド
2014年3月実施のアンケート調査結果を紹介。「業務アプリでのクラウドプラットフォーム採用」「ウェアラブルデバイス開発」「スマートフォンアプリのネイティブ開発」が3大トレンドとなっている。 - 業務アプリInsider×未来テクノロジ:業務アプリはもうこれ以上、進化できないのか? ―― スマートアグリカルチャーに学ぼう
業務アプリ内の技術を最新に置き換えるだけの作業に疲れた? これから業務アプリはどう進化させればよいのか? そんな考えに基づき、農業IT化の手法を聞いてみた。「“攻め”の業務アプリ開発」を始めるための参考にしてみよう。