JavaScriptプログラム

加速度センサーのAndroid補正

スマートフォンの加速度センサーから値を得るとき、OS がAndroid の場合、値が逆になって出力されます。

今回、その逆出力を補正するプログラムを作りました。

 

 

スマートフォンの座標系

Fig.1 は、スマートフォンの座標系です。

Fig.1 スマートフォン座標系

 

加速度センサーの値

Fig.2 前傾したスマートフォン

 

Fig.2 は、スマートフォンを前傾させた図です。

  • スマートフォンを「静かに」前傾させています

そのため、重力(G)以外の加速度が発生していない状態です。

 

iOS の場合

Fig.2 の状況で、加速度センサーからの出力値A は、以下となります(注1)。

Fig.2 から、正しく出力されていることが分かります。
(注1)実際には、上記値を中心に、値が細かく振動しています。

 

Android の場合

加速度センサーからの出力値A は、以下となります(注2)。

(注2)実際には、上記値を中心に、値が細かく振動しています。

 

これは、Fig.2 から、間違って出力されていることが分かります。

  • プラス(+)とマイナス(-)が逆に出力されている

 

Android 補正

スマートフォンのOSがAndroid の場合、以下の補正が必要です。

  • 加速度センサーからの出力値A の各成分に値(-1)を乗ずる

 

 

プログラム

プログラム1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Android_correct</title>
<script>
    var ele;
    var osCorrect;          // 1:iOS, -1:Android

    window.addEventListener("devicemotion", function(evt){
    //
        var accel = evt.accelerationIncludingGravity;
        var G_x = osCorrect*accel.x;
        var G_y = osCorrect*accel.y;
        var G_z = osCorrect*accel.z;
    //
        ele.innerHTML  = "G_x = " + G_x   + "<br>";
        ele.innerHTML += "G_y = " + G_y   + "<br>";
        ele.innerHTML += "G_z = " + G_z   + "<br>";
        ele.innerHTML += "OS  = " + osCorrect;
    //
    }, true);

    window.onload = function() {
    //
        ele = document.getElementById("output");
    //
        var userAgent = navigator.userAgent;
        if (userAgent.match(/Android/)) {
            osCorrect = -1;
        } else {
            osCorrect =  1;
        }
    }
</script>
</head>
<body>
    <output id="output"></output>
</body>
</html>

 

プログラムの解説

グローバル変数

プログラム1 の8 行目、osCorrect は、OS による補正値を保存する変数です。

 

window.onload 関数

OS がAndroid か否かを判定し、以下の処理を実行

  • Android ならば  : osCorrect に値(-1)を代入
  • Android でなければ: osCorrect に値(+1)を代入

 

OS がAndroid か否かの判断方法についての詳細は、記事「iOS とAndroid の判別」をご参照ください。

 

devicemotion イベント

加速度センサーからの出力に、補正値osCorrect を乗算しています。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です