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。
阅读全文
1 0
- Android 磁场传感器 地磁倾角计算 SensorManager.getInclination方法
- Android之传感器SensorManager
- Android:SensorManager 传感器
- android 磁场传感器应用
- Android传感器之磁场传感器
- 传感器SensorManager
- 传感器SensorManager
- 地磁传感器
- Android_开发 Android传感器(加速度传感器,磁场传感器,光线传感器,方向传感器)
- SensorManager(传感器开发)
- SensorManager -----传感器管理类
- HMC5883L地磁传感器驱动
- 磁场传感器(指北针)
- Android 下陀螺仪、加速度和磁场传感器数据定义
- Android指南针之加速度传感器地磁传感器-android学习之旅(67)
- HMC5883L地磁传感器学习总结
- 传感器系列之4.7地磁传感器
- Rexsee API介绍:Android传感器系列之 - 磁场传感器Magnetic Field源码
- 通过style实现从屏幕底下弹出dialog动画效果
- ElasticSearch搜索引擎java客户端接口详解
- Notepad++配色
- C语言const:禁止修改变量的值
- 使用python进行数据分析介绍及部分教程
- Android 磁场传感器 地磁倾角计算 SensorManager.getInclination方法
- 为什么canvas绘制的线条会模糊、有锯齿?
- hdoj 1686 Oulipo
- 软件光栅化渲染器(九)
- Windows上部署Jenkins遇到的问题
- byte为何范围是-128~127
- 编程第五十六天
- 【Leetcode】389. Find the Difference
- 三维网格精简算法(Quadric Error Metrics)附源码(一)