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

需要先阅读:
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。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值