Android 磁场传感器 地磁倾角计算 SensorManager.getInclination方法

来源:互联网 发布:ubuntu怎么看硬盘大小 编辑:程序博客网 时间:2024/05/01 12:56

需要先阅读:
http://blog.csdn.net/pw4work/article/details/72784417

什么是地磁倾角呢
看图比较明显了,简单的说,就是看地磁场和水平面的的角度是多少。直观的

这里写图片描述
magnetic dip的仪器。其实我们指南针是水平旋转的,来指明方向,而magnet dip就是一个垂直旋转的指南针。

这里写图片描述
可以看到,在磁南极时候magnetic dip垂直向上,在磁北极时候垂直向下。磁指针水平面以下为正角度,向上为负角度

前面文章说到,getRotationMatrix方法,传入的参数I就是磁场倾角的旋转矩阵。

SensorManager.javapublic 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。

原创粉丝点击