需要先阅读:
http://blog.csdn.net/pw4work/article/details/72784417
什么是地磁倾角呢
看图比较明显了,简单的说,就是看地磁场和水平面的的角度是多少。直观的
magnetic dip的仪器。其实我们指南针是水平旋转的,来指明方向,而magnet dip就是一个垂直旋转的指南针。
可以看到,在磁南极时候magnetic dip垂直向上,在磁北极时候垂直向下。磁指针水平面以下为正角度,向上为负角度
前面文章说到,getRotationMatrix方法,传入的参数I就是磁场倾角的旋转矩阵。
SensorManager.java
public void getRotationMatrix(float[] R, float[] I,
float[] gravity, float[] geomagnetic)
...
//前文说到 Ax,Ay,Az是垂直指向地心的坐标,Hx Hy Hz是指向磁东的分量,Mx My Mz是指向磁北的分量。
if (I != null) {
// compute the inclination matrix by projecting the geomagnetic
// vector onto the Z (gravity) and X (horizontal component
// of geomagnetic vector) axes.
final float invE = 1.0f / (float)Math.sqrt(Ex*Ex + Ey*Ey + Ez*Ez);//计算向量模长的倒数
final float c = (Ex*Mx + Ey*My + Ez*Mz) * invE;//求出磁场在世界坐标系的磁北方向的投影除以模长,就是余弦值COS。
final float s = (Ex*Ax + Ey*Ay + Ez*Az) * invE;//求出磁场在世界坐标系的指向地心方向的投影除以模长,就是角的正弦值SIN。
if (I.length == 9) {
I[0] = 1; I[1] = 0; I[2] = 0;
I[3] = 0; I[4] = c; I[5] = s;
I[6] = 0; I[7] =-s; I[8] = c;
//旋转矩阵构造,就是往相应位置填入COS和SIN的值,具体可以参见[旋转矩阵教程](http://silverwind1982.pixnet.net/blog/post/165223625-%E6%97%8B%E8%BD%89%E7%9F%A9%E9%99%A3-%28rotation-matrix%29%20%E6%97%8B%E8%BD%AC%E7%9F%A9%E9%98%B5%E6%95%99%E7%A8%8B)
//
} else if (I.length == 16) {
I[0] = 1; I[1] = 0; I[2] = 0;
I[4] = 0; I[5] = c; I[6] = s;
I[8] = 0; I[9] =-s; I[10]= c;
I[3] = I[7] = I[11] = I[12] = I[13] = I[14] = 0;
I[15] = 1;
}
}
利用getInclination(float[] I)从上面得到的磁场倾角矩阵获取磁场倾角:具体在注释里头了
SensorManager.java
/**
* Computes the geomagnetic inclination angle in radians from the
* inclination matrix <b>I</b> returned by {@link #getRotationMatrix}.
*
* @param I
* inclination matrix see {@link #getRotationMatrix}.
*
* @return The geomagnetic inclination angle in radians.
*
* @see #getRotationMatrix(float[], float[], float[], float[])
* @see #getOrientation(float[], float[])
* @see GeomagneticField
*
*/
public static float getInclination(float[] I) {
if (I.length == 9) {
return (float)Math.atan2(I[5], I[4]);
//利用SIN和COS构造TAN求反正切,求出角度。
} else {
return (float)Math.atan2(I[6], I[5]);
}
}
一些误差:
和前面的一样,由于磁场来自于手机传感器,没有其他的手段区分这个磁场来自于地磁还是电子设备或者强磁铁,所以只好一股脑地认为全部都是地磁,这样就给地磁倾角的计算带来了误差。
有趣的是,地磁的分量经过地磁倾角旋转矩阵计算之后,世界坐标系下磁东的分量也化为了0。