加速度センサーのAndroid補正
スマートフォンの加速度センサーから値を得るとき、OS がAndroid の場合、値が逆になって出力されます。
今回、その逆出力を補正するプログラムを作りました。
スマートフォンの座標系
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 を乗算しています。
