前提・実現したいこと
androidstudioで、加速度センサと地磁気センサを利用して方位を取得したいと考えています。
以下のサイトを参考し、実機で試してみたのですが、方位が均等に取れず、また、端末の姿勢によって精度がバラバラになってしまいました。座標の変換がうまくいっていないことが考えられますが、どのように直せば良いのかわかりません、、、
<http://android.keicode.com/basics/sensors-accelerometers-megnetic.php>
<http://m-shige1979.hatenablog.com/entry/2015/07/22/080000>
そのため、変更点や直すべき点を教えて頂けると幸いです。(また、調べた結果atanを使うとよいということが分かったのですが、その場合はどうしたらよいのでしょうか)
投げやりな質問になってしまし申し訳ありませんが、ご教授いただけると幸いです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
実機で試すと、方位が均等に取れません。
(例:スマホを持ってその場で一周してもずっと南と表示)
該当のソースコード
//fAccellとfMagneticから傾きと方位角を計算する if (accelerationValues != null && magneticValues != null) { //回転行列を得る SensorManager.getRotationMatrix(inR, I, accelerationValues, magneticValues); //ワールド座標とデバイス座標のマッピングを返還 SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); //姿勢を得る(デバイスの向きに応じて回転行列を計算する) SensorManager.getOrientation(outR, orientationValues); //ラジアンから角度へ変換 float angle = (float) Math.floor(Math.toDegrees(orientationValues[0])); //角度の範囲を0-360度へ変換 if (angle >= 0) { orientationValues[0] = angle; } else if (angle < 0) { orientationValues[0] = 360 + angle; } // 北:0、東:90、南:180、西:270 azimuth = orientationValues[0]; //Z軸(方位角) pitch = radianToDegree(orientationValues[1]); //X軸(傾斜角):画面が自分に向いているときが基準(向こうに傾けるとプラス、手前がマイナス) roll = radianToDegree(orientationValues[2]); //Y軸(回転角) } //方角の表示 int azimuth_i = Math.round(azimuth); if(45<= azimuth_i && azimuth_i<135) { smdTextView.setText("東" + "(" + azimuth_i + "[deg])"); }else if(135<= azimuth_i && azimuth_i<225){ smdTextView.setText("南" + "("+ azimuth_i + "[deg])"); }else if(225<= azimuth_i && azimuth_i<315){ smdTextView.setText("西" + "("+ azimuth_i + "[deg])"); }else{ smdTextView.setText("北" + "("+ azimuth_i + "[deg])"); }
あなたの回答
tips
プレビュー