版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、毕业设计()题目:基于 android 的指南针的设计与实现毕业设计()要求及原始数据(资料):1综述国内外指南针技术研究现状;2深入了解;3熟练掌握指南针应用与分析,训练编写安卓应用的能力;设计并实现指南针;深入分析与指南针技术的与编写语言;6训练检索文献资料和利用文献资料的能力;7训练撰写技术文档与的能力。毕业设计()主要内容:1综述指南针技术,在日常生活中的应用;2了解指南针应用的相关技术;3熟悉api,安卓开发环境;4设计指南针应用;深入分析指南针应用的与编写语言JAVA 的设计流程;熟练掌握基于安卓的程序编写;7实现指南针应用程序。学生应交出的设计文件():内容完整、层次清晰、叙述流
2、畅、排版规范的毕业设计;包括毕业设计、源程序等内容在内的毕业设计电子文档及其它相关材料。主要参考文献(资料):1,. 基于Android 的移动终端应用程序开发与研究J. 计算机与现代化,2008(8):85-89.2 何璇. 基于 Java 语言的安卓开发J. 计算机光盘与应用,2014(08):67-68.3.指南针 伴君闯天涯J. Electronics World, 2007(10):53-53.4旻, 刘卫国. Android 的架构与应用开发研究J. 计算机系统应用, 2008,17(11):110-112.5.(五)Java 技术及其应用J. 电子商务, 1997(12):17-
3、19.6.Java 语言与 Java 技术J. 计算机工程, 1997(4):3-6.7.Java 技术在领域中的应用J. 计算机时代, 2002(7):43-44.8JacksonW. Learn Android App DevelopmentJ. Springer Berlin, 2013.9Meier R. Profesal Android 4 Application DevelopmentM. Wrox, 2012.10Kelley P G, Consolvo S, Cranor L F, et al. A conundrum of permiss:installing applica
4、tions on anandroid smartphoneC/ Proceedings of the 16thernationalconferenceonFinanlCryptographyandDataSecurity.Springer-Verlag,2012:68-79.专业班级1230 班学生2016 年 3 月 21 日2016 年 6 月 10 日要求设计()工作起止日期指导教师签字日期教研室签字日期系批准签字日期基于 android 的指南针的设计与实现摘要指南针是古代劳动人民在长期的实践中对物体磁性认识的结果。作为中国古代四大发明之一,它的发明对人类的科学技术和文明的发展,起了无
5、可估量的作用。现在虽然日趋成熟,但由于日常生活中由于网络信号不良,所处地形复杂,耗电量大等原因,指南针依然有存在的必要。现代制作的各种电子指南针代替了以往的机械指南针,最常见机传感器中的指南针,便是基于对android sensor 数据,并对这些数据进行处理后的结果以人们早已接受的指南针的形式呈现。Android 指南针应用,使用 Eclipse8.5 作为开发工具。本根据毕业设计的内容,详细地阐述了 android 指南针应用的构造过程。以自定义 sensor 的方式来对 Android 平台下基于硬件的传感器实现兼容,在自定义 sensor 的基础上实现了android 指南针传感器,能
6、够满足用户的方向需求。在智能尤其是android 系统大行其道的如今,由于 android定制的特性,部分指南针应用并不能良好的兼容全部android层实现对Sensor 的再封装,以提高其兼容性。本较为系统的从Framework关键字:android; 指南针; sensorIDesign and implemenion of Compass Based on AndroidAbstractCompass is the ancienn working people in long-term practice of body awarenessmagnetic results. As one
7、of the four great inventions of ancient China, its invention of scienceand technology and the development of human civilization, from the inestimable role.Although the saliteitioning system is now mature, but in daily life due to poor networksignal, in which the complex terrain,er consumption and ot
8、her reasons, the compass stillneed to exist. The results produced a variety of modern electronic compass instead of conventional mechanical compass, the most common mobile phones compass sensorsoftware, is based on the android sensor data, and these data are prosedhe form ofpeople already accepted c
9、ompass presenion .Android Compass application, use Eclipse8.5 as a development tool. According to this thesis, graduation project content, detailed description of the construction pros androidcompass applications. Way to customize the sensor to the next Android platform,hardware-based sensors to ach
10、ieve compatibilityhe sensor on a custom basis to achievethe android compass sensor, to meet the users needs direction.Espellyhe smart phone android phone system is now popular because android freecustomization features, some applications are not good compass compatible will androidphones. This pr sy
11、stematically achieve the Sensor re-encapsulation layer from theFramework in order to improve their compatibility.Keywords: android; compass; sensorII目录1绪论11.1 研究内容11. 2 指南针原理介绍11. 3 本课题研究的意义11. 4的工作内容及的结构22系统分析32. 1 研究目标32. 2 需求分析33 性能分析3系统开发环境及相关技术41 Android 开发环境介绍433. 2 Android 开发搭建53. 3 Sensor6Se
12、nsor 架构6Sensor 简介7加速度传感器7陀螺仪传感器8磁场传感器8SensorManager8总体设计94. 1 程序模块设计9Isensor 接口9指南针数据处理接口10常量池104.1.4 矩阵11详细设计135.1 文件结构与用途1345数据提供者15基础传感器16指南针传感器19Compass_Activity.325.6 布局36系统测试377 总结40参考文献41致谢42外文文献43中文翻译521绪论1.1 研究内容Android指南针是基于Android,运用 Java 语言,使用加速度传感器,陀螺仪传感器,磁场传感器,开发出针对使用Android的指南针应用。1.2
13、指南针原理介绍指南针又称指北针,主要组成部分是一根装在轴上的磁针,磁针在天然地磁场的作用下可以转动并保持在磁子午线的切线方向上,磁针的北极指向地理的北极,利用这一性能可以辨别方向。常用于航海、大地测量、旅行及军事等方面。现代人制作了各种电子指南针,电子罗盘也叫数字罗盘,是利用地磁场来定北极的法,应用到加工而成。上,其实就是电子指南针,电子罗盘一般用磁阻传感器和磁通门1. 3 本课题研究的意义现如今大多数android的指南针应用都是简单的通过使用android api 中指南针服务实现,在眼花缭乱的android 系统下兼容性并不良好。Android在各种android指南针应用的开发可以更进
14、一步的方便人们的日常出行,使广大公众中使用同样的指南针应用。以避免在迷路或寻路时无无网络,或指南针应用不兼容的尴尬。同时android 指南针应用比起其他机械指针式指南针相比,因电子式指南针采用电信号传送,且以较为直观的方式显示测量的结果,所以电子式指南针无论是在灵敏度上还是精度上都远胜前者,而且不会因为机械磨损而简短使用。本应用基于 android,采用多种传感器组合使用来提高指南针的精确度,同时兼顾兼容性。可以满足日常生活或是要求精准指南的环境。11.4的工作内容及的结构本首先针对毕业设计的背景和需求,明确了课题的开发方向。然后对系统进行了需求分析和总体设计,将程序分成几个模块,并分别进行
15、了编码实现。最后将系统各个模块进行整合,测试系统各部分整合后的功能以及稳定性等。本文共 7 章,按如下方式组织:第 1 章介绍了android 指南针的背景、目的和意义,对其有一个比较简单的了解。第 2 章对android 进行了整体分析,阐述了它的整体功能,与运行。了系统是可以开发第 3 章介绍android 指南针系统开发环境及相关技术,分析了对系统的需求并列出相关的。第 4 章给出android 指南针各个功能模块的具体设计,为 android 指南针的实现搭建框架。第 5 章介绍了android 指南针程序流程与各个模块最终实现的效果。第 6 章介绍了对android 指南针的测试目的
16、与过程,并列出了几个实际测试效果截图。第 7 章总结此次开发的经验与教训。22系统分析2.1研究目标(1) 了解Android 应用程序的设计和开发过程;(2) 使用多种传感器进行 Android指南针应用的开发。本是基于Eclipse 的开发环境,依托 android传感器,开发出了针对 Android的指南针应用。2.2 需求分析本是一个 android指南针应用,具有指明方向的作用,在不损害精度的情况下尽可能保证其可靠性以及为了适应android 多的特性做出的兼容。从上面的描述中可以基本了解(1)具有指向功能。 (2)良好的兼容性。的功能需求:2.3 性能分析程序响应速度快、安全性高、
17、信息处理速度快。33系统开发环境及相关技术3.1 Android 开发环境介绍Android 的上层应用程序是用 Java 语言开发,同时还需要基于 Dalvik 虚拟机,所以,公司使用主流的 Java 继承开发环境 Eclipse。只有 Eclipse 还不够,因为是使用 Java 语言进行开发,还应该有由 SUN 公司提供的 Java SDK(其中包括 JRE:JavaRuntime Environment)。此外,Android 的应用程序开发和 Java 开发有较大区别的,所以还需要有提供的 Android SDK。同时,还需要在 Eclipse 安装 ADT,为 Android开发提
18、供开发工具的升级或者变更,是Eclipse 下开发工具的升级的工具。简言之,需要以下的开发。Java SDKEclipseAndroid SDKADT,才能搭建 Android 开发环境,从而进行 Android 应用程序3.2 Android 开发搭建Android 开发首先到Javah ht搭建步骤:Eclipse 集成开发环境并且解压,这里的搭建省下不少工作。 接着再去 EE 集成版本,可以为/javase/downloads/index.jsp站 点SDK 后 安 装 ,/android/android-sdk-windows-1.5_r1.zip,Android SDK1.5 后解压
19、。第一步工序就结束了。双击 Eclipse 解压后目录中的 eclipse.exe 然后启动,选择 Eclipse 菜单中的 Help-Install New Software- 选项卡上的 Available Software ,点击右侧的“ Add” 输入 http:/输入的/android/eclipse/后确定,然后在“Work with”下拉菜单中选择刚才。过一会就会出现一个 Developer Tools 选项,勾上以后点击 Next 以后Eclipse4会自动网上查找 Android 开发工具插件, 然后找到 Android DDMS 和 AndroidDevelopment T
20、ools,选中这两个点击 Finish,Eclipse 就会自动了,最后会提示重启Eclipse。并安装Android 插件重启后选择Eclipse 菜单中的Windows- Preferen在左侧的Android 项目中SDKLocation 中填入Android SDK 解压后的目录,然后点击Apply。在WindowsXP 的系统变量中的path 变量中添加一个值,该值指向解压后的 Android SDK 目录下的 tools 文件夹。3.3 Sensor3.3.1 Sensor 架构架构说明:(如图 3-1 所示)图 3-1 sensor 架构黄色部分表示硬件,它要挂在 I2C 总线上
21、。红色部分表示驱动,驱动到Kernel 的Input Subsystem 上,然后通过 Event Device把Sensor 数据传到HAL 层,准确说是 HAL 从 Event。5绿色部分表示动态库,它封装了整个 Sensor 的IPC 机制,如 SensorManager 是客户端,SensorService 是服务端,而 HAL 部分是封装了服务端对Kernel 的直接。蓝色部分就是的Framework 和Application 了,JNI 负责Sensor 的客户端,而Application 就是具体的应用程序,用来接收Sensor 返回的数据,并处理实现对应的UI 效果,如屏幕旋转
22、,打时灭屏,自动调接背光等。3.3.2 Sensor 简介 加速度传感器加速度传感器可用来侦测X、Y、Z 轴方向的加速度(见图 3-2 sensor 坐标系),图 3-2 sensor 坐标系以类比电压来表示所侦测的加速度的大小。在 android下可以调用 api 来实现对加速度值的。加速度传感器的 value 值均用国际制(m/s2)来表示。values0: values1:values2:在 x 轴的上加速度-重力加速度。在 y 轴的上加速度-重力加速度。在 z 轴的上加速度-重力加速度。这是一个测量安卓设备加速度(Ad)的传感器。从概念上来说,它是通过测量施加在传感器上的力(Fs)来测
23、量。Ad = - Fs / mass特别是,重力的力量总是影响测得的加速度:6Ad = -g - F / mass因为这个原因,当设备平放在一平面上时(明显没有加速度),加速度计的读数为g = 9.81 m/s2。类似地,当设备下落,因此地加速冲向地面,读数应为 9.81 m/s2,其加速度计读数却为 0 m/s2。很明显,为了测量设备的实际加速度,必须消除重力影响。这可以通过高通 滤波器实现。相反,一个低通滤波器可用于分离重力。陀螺仪传感器陀螺仪传感器的 value 值均为弧度/秒,测量的是设备本身在 x 轴,y 轴,z 轴上的旋转速度(见图 3.1sensor 坐标系)。该坐标系与加速度传
24、感器相同,正方向为逆时针旋转方向。也就是说,当一个观察者处于设备正面观察此设备时,如果设备按顺时针方向旋转,则会显示旋转角度为正。(注意:这是正旋转的数学定义,不同于 android api 之中给出的设置)通常,陀螺仪传感器的输出是旋转角度对时间的积分。实际上在实践中,由于陀螺仪的噪声和失调,通常使用其他传感器的信息来进行校正。磁场传感器磁场传感器的value 值均用微拉(UT)表示,测量当前环境磁场,分别显示在x 轴,y 轴,z 轴上。(见图 3.1sensor 坐标系)3.3.3 SensorManagerSensorManager 可以让你该设备的传感器。通过调用Context.get
25、SystemService()得到这个类的一个实例。当你不需要使用传感器时确保禁用传感器,特别是当你的activity 暂停。不这样做的就是电池会迅速下降。请注意,该系统将不会在屏幕关闭时自动的禁用传感器。74总体设计4.1 程序模块设计4.1.1 Isensor 接口Isensor 为自定义 sensor 接口,对 android sensor 定下的规则。加速度传感器 ,陀螺仪传感器,磁场传感器,指南针传感器实现此接口,实现自定义。接口的主要功能为定义以下四种方法:1.判断设备是否支持所调用的传感器。2.开启此传感器,事件,传输数据。3.关闭此传感器,删除事件。4.获取此传感器返回值范围。
26、/* android sensor 实现此接口*/publicerface Isensor / 判断设备是否支持此 sensorpublicipport();/ 开启public void on(speed);/ 关闭public void off();/ 获取 sensor 值范围public float getumRange();84.1.2 指南针数据处理接口/* 指南针接口,指南针传感器对,加速度传感器,陀螺仪传感器,磁场传感器传递过来的数据进行处理*/publicerface OrienionSensorerface public void orienion(Double AZIMU
27、TH, DoublTCH, Double ROLL);4.1.3 常量池常量及其含义分别为:azimuth 方向角,(对磁场传感器与加速度传感器的数据处理得到)的数据范围是(-180180),也就是说,0 表示正北,90 表示正东,180/-180 表示,-90 表示正西。而直接通过方向感应器数据范围是(0359)360/0 表示正北,90 表示正东,180 表示,270 表示正西。绕 z 轴旋转。(见图 3.1 sensor 坐标系) pitch 倾斜角即由状态开始,前后翻转。绕 x 轴旋转。roll 旋转角 即由状态开始,左右翻转。绕y 轴旋转。public class AppConsta
28、nts public final s public final spublic final sic String AZIMTUH = azimuth; ic String PITCH = pitch;ic String ROLL = roll;4.1.4 矩阵Matrix 由 9 个 float 值,是一个 3*3 的矩阵,用于图像处理。9cosX, -sinX, translateX, sinX, cosX,translateY,0, 0,scale上面的 sinX 和 cosX,表示旋转角度的 cos 值和sin 值,注意,旋转角度是按顺时针方向计算的。translateX 和transl
29、ateY 表示 x 和y 的平移量。scale 是缩放的比例(1 是不变,2 是表示缩放 1/2),在对三个传感器传回的数据进行处理时需要使用矩阵乘法。详细代码如下:public class Matrix3x3 public sic float multiplication(float A, float B) float result = new float9;result0 = A0 * B0 + A1 * B3 + A2 * B6;result1 = A0 * B1 + A1 * B4 + A2 * B7;result2 = A0 * B2 + A1 * B5 + A2 * B8;resu
30、lt3 = A3 * B0 + A4 * B3 + A5 * B6;result4 = A3 * B1 + A4 * B4 + A5 * B7;result5 = A3 * B2 + A4 * B5 + A5 * B8;result6 = A6 * B0 + A7 * B3 + A8 * B6;result7 = A6 * B1 + A7 * B4 + A8 * B7;result8 = A6 * B2 + A7 * B5 + A8 * B8;return result;105详细设计5.1 文件结构与用途在 android 指南针开发阶段, 首先确“ android 指南针应用” 的工程名为
31、Compass_Activity,根据程序模块设计的内容,建立Compass_Activity 工程,本工程的代码结构如图 5-1 所示。图 5-1Compass_Actibity 工程的源代码文件Compass_Activity 工程设置了多个命名空间,分别用来保存Activity,源代码文件的名称以及说明如表 5-1 所示。11表 5-1Compass 工程的文件用途说明Android 的资源文件保存在/res 的子目录中。具体每个资源文件的用途可以参考表 5-2:表 5-2 资源文件名称与用途12资源目录文 件说 明drawable图标drawableorienion.png指南针Lay
32、outmain.xml布局文件包 名 称文 件 名说 明com.orienionSen sorTestActivity.java“指南针”的ActivityCom.zjh.orienio nSensor.mathMatrix3x3.java矩阵相乘Com.zjh.orienio nSensor.responseProviderorienionResponsePro vider.java指南针数据提供者Com.zjh.orienio nSensor.sensorAccelerometer.java加速度传感器Com.zjh.orienio nSensor.sensorgyroscope.java
33、陀螺仪传感器Com.zjh.orienio nSensor.sensorIsensor.java传感器逻辑接口Com.zjh.orienio nSensor.sensormagnetic.java磁场传感器Com.zjh.orienio nSensor.sensorOrienion.java指南针逻辑实现类Com.zjh.orienio nSensor.utilsAppConstants.javaApp 常量Com.zjh.orienio nSensor.utilsOrienionSensorer face.java获取指南针数据接口5.2数据提供者由于本应用涉及的数据传为简单, 且不需要涉及
34、数据库, 决定不用ContentProvider 的方式传递数据,使用接口的动态绑定方法使 Compass_Activity 实现接口 orienionerface,在 orienionResponseProvider 中调用此接口的实现类实现数据传递的功能。在此类中, ArrayList sensorValueLog 存放 sensor 数据, ArrayListtolerance 为自定义公差,Orien代码如下:/提交指南针数据ionSensorerface observer 接收实现类。public void dispatcher(float gyroOrienion)/弧度换算为角度
35、Double azimuth = gyroOrien if ( azimuth tolerance.get(0)| Ma| Mabs(sensorValueLog.get(1) - pitch) tolerance.get(1)bs(sensorValueLog.get(2) - roll) tolerance.get(2)sensorValueLog.set(0, azimuth);sensorValueLog.set(1, pitch); sensorValueLog.set(2, roll);observer.orienion(sensorValueLog.get(0),sensorVa
36、lueLog.get(1),sensorValueLog.get(2);135.3 基础传感器指南针传感器并不真实存在,它是由陀螺仪传感器,加速度传感器,磁场传感器三者抽象而成,在此我使用的观察者模式实现当陀螺仪传感器,加速度传感器,磁场传感器的值发生改变时,通知观察者。底层传感器重构的代码,陀螺仪传感器,加速度传感器,磁场传感器都继承Observable 实现了Isensor,SensorEventListener 接口。动态变量有指定传感器的 SensorManger,传感器实例 accelerometerSensor,和数据变化时的传感器事件eventprivate SensorMana
37、ger sensorManager private Sensor accelerometerSensor private SensorEvent event首先获取Sensor,三者大致相同只是调用不同的常量。 Sensor.TYPE_ACCELEROMETER 为加速度传感器 Sensor.TYPE_GYROSCOPE 为陀螺仪传感器 Sensor.TYPE_MAGNETIC_FIELD 磁场传感器sensorManager=(SensorManager)context.getSystemService(ContexaccelerometerSensor=SOR_SERVICE);senso
38、rManager.getDefaulsor(Sensor.TYPE_ACCELEROMETER);实现 Isensor.i Overridepublicpport()方法,判断设备是否支持此传感器ipport()if (magneticSensor = null) return false;return true;14实现接口 Isensor.on()在 accelerometer.java,gyroscope.java,magnetic.java 中,在调用 registerListener()方法时,指定了默认的数据延迟(SENSOR_DELAY_NORMAL)。数据延迟(或采样率)控制着
39、传感器事件通过 onSensorChanged()回调方法发送给你的应用程序的时间间隔。默认的数据延迟适用于监视典型的屏幕方向的变化,它所使用的时间延迟是 200,000 毫秒。你能够指定其他的数据延迟类型,如SENSOR_DELAY_GAME(20,000 毫秒延迟)、 SENSOR_DELAY_UI(60,000 毫秒延迟)、或者是 SENSOR_DELAY_FASTEST(0 毫秒延迟)。所指定的延迟只是建议性的延迟。Android 系统和其他应用程序都能够修改这个延迟。作为最好的实践,你应该指定你所需要的最大延迟,因为系统通常会使用比你指定的要小的延迟(也就是说,你应该选择你的应用所需
40、要的最低的采样率)。使用较大的延迟会降低处理器的负载,同时也因此降低了电量的损耗。Overridepublic void on(speed)switch (speed) case 0:sensorManager.registerListener(this,accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);break;case 1:sensorManager.registerListener(this,accelerometerSensor, SensorManager.SENSOR_DELAY_UI);break;case 2:se
41、nsorManager.registerListener(this,accelerometerSensor, SensorManager.SENSOR_DELAY_GAME);break;15case 3:sensorManager.registerListener(this,accelerometerSensor, SensorManager.SENSOR_DELAY_FASTEST);break;default:sensorManager.registerListener(this,accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL
42、);break;实现Isensor.off(),关闭此传感器的 Overridepublic void off()事件。sensorManager.unregisterListener(this, magneticSensor);实现IsensetumRanger(),获取传感器的取值范围。Override public float getumRange()return magneticSensetumRange();实现SensorEventListener.onSensorChanged(),当传感器发生变化时更新数据,同时通知观察者。Overridepublic void onSenso
43、rChanged(SensorEvensorEvent) 16event = sensorEvent;setChanged(); notifyObservers();至此加速度传感器封装完成,陀螺仪传感器,磁场传感器与之类似,不做赘述。5.4 指南针传感器指南针传感器同样实现了 Isensor 接口,作为观察者还实现了 Observer 接口。需要用到的成员变量与类变量如下:首先是三个基础传感器,加速度传感器 accSensor,陀螺仪传感器 gySensor,磁场传感器mgSensor。private accelerometer accSensor;private gyroscope gyS
44、ensor; private magnetic mgSensor;之后是用于数据传递的orienionHandler ,与responseProviderprivate Handler orienionHandler = new Handler();private orienionResponseProvider responseProvider;EPSILON 为精度。NS2S 为换算比例,在计算时间戳后将 ns 转换为 s 时会用到。timest为时间戳。initSe 状态布尔值。public sic final float EPSILON = 0.000000001f;private s
45、ic final float NS2S = 1.0f / 1000000000.0f;private float timest;privateinitSe = true;public spublic sic finalTIME_CONSTANT = 30;ic final float FILTER_COEFFICIENT = 0.98f;private Timer fuseTimer;17private float roionMatrix = new float9;private float accMagOrienprivate float fusedOrienion = new float3
46、;ion = new float3;private float accel = new float3;private float gyro = new float3; private float gyroMatrix = new float9;private float gyroOrienion = new float3;private float magnet = new float3;实现 Isensor 接口定义的方法Overridepublicipport() /检查设备是否支持指南针if (accSensro.i return true;return false;pport() &
47、mgSensor.ipport()on(speed) 方法,参数表示传感器获得数据的速度。该参数可设置的常量如下:SENSOR_DELAY_FASTEST:以最快的速度获得传感器数据。SENSOR_DELAY_GAME:适合于在中获得传感器数据。SENSOR_DELAY_UI:适合于在 UI 控件中获得传感器数据。SENSOR_DELAY_NORMAL:以一般的速度获得传感器的数据。上面四种类型获得传感器数据的速度依次递减。从理论上说,获得传感器数据的速快,消耗的系统资源越大。因此建议读者根本实际情况选择适当的速度获得传感器的数据。此方法先判断设备是否支持基础传感器,如果支持就为其添加观察者并
48、调用scheduleAtFixedRate 方法。如果第一次执行时间被 delay 了,随后的执行时间按照 上一18次开始的时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask 中的执行体需要考虑同步。时间参考:/2010/10/21/how-long-is-sensor_delay_game/ Accelerometer, SENSOR_DELAY_FASTEST: 18-20 msecAccelerometer, SENSOR_DELAY_GAME: 37-39 msecAccelerometer, SENSOR_DELAY_UI: 85-87 msec Acc
49、elerometer, SENSOR_DELAY_NORMAL: 215-230 msecOrien Orien OrienOrienion Sensor, SENSOR_DELAY_FASTEST: 16-17 msec ion Sensor, SENSOR_DELAY_GAME: 37-39 msec ion Sensor, SENSOR_DELAY_UI: 77 msecion Sensor, SENSOR_DELAY_NORMAL: 224-225 msecOverridepublic void on(speed) if (accSensro.ipport()accSensro.add
50、Observer(this);accSensro.on(speed);if (gySensor.ipport()gySensor.addObserver(this);gySensor.on(speed);if (mgSensor.ipport()mgSensor.addObserver(this);mgSensor.on(speed);fuseTimer = new Timer();switch (speed)19case 0:fuseTimer.scheduleAtFixedRate(new calculateFusedOrien 1, 224);break; case 1:fuseTime
51、r.scheduleAtFixedRate(new calculateFusedOrien 1, 77);break; case 2:fuseTimer.scheduleAtFixedRate(new calculateFusedOrien 1, 37);break; default:fuseTimer.scheduleAtFixedRate(new calculateFusedOrien1, 16);ionTask(),ionTask(),ionTask(),ionTask(),关闭指南针传感器,先关闭 Timer fuseTime,再调用off()关闭基础传感器。 Overridepubl
52、ic void off() fuseTimer.cancel();if (accSensro.iaccSensrpport()eteObserver(this);accSensro.off();if (gySensor.ipport()gySensor.deleteObserver(this);gySensor.off();20if (mgSensor.ipport()mgSensor.deleteObserver(this);mgSensor.off();Override public float getreturn 0;umRange() 实现 Obersever 接口定义的方法,当观察到
53、 Observer 模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。在此方法中,更新各个基础传感器的Matrix。Overridepublic void update(Observable observable, Object o) if (observable instanceof accelerometer)System.arraycopy(accSensro.getEvent().values,0, accel, 0, 3);calculateAccMagOrienion();if (observable instanceof g
54、yroscope) gyroFunction(gySensetEvent();if (observable instanceof magnetic) System.arraycopy(mgSensetEvent().values, 0, magnet, 0, 3);Updata()中调用了calculateAccMagOrienion,gyroFunction,用于获取加速度传感器与陀螺仪传感器的Matrix。public void calculateAccMagOrienion() if(SensorManager.getRoionMatrix(roionMatrix, null, acce
55、l, magnet) SensorManager.getOrienion(roionMatrix, accMagOrienion);21在 gyroFunction,用到了 getRoionMatrixFromOrienion,getRoionVectorFromGyro。public void gyroFunction(SensorEvent event) if (accMagOrienreturn;ion = null)if(initSe) float initMatrix = new float9; initMatrix = getRoionMatrixFromOrienfloat te
56、st = new float3;ion(accMagOrienion);SensorManager.getOrienion(initMatrix, test);gyroMatrix = Matrix3x3.multiplication(gyroMatrix, initMatrix);initSe = false;float deltaVector = new float4;if(timest!= 0) final float dT = (event.timest- timest) * NS2S;System.arraycopy(event.values, 0, gyro, 0, 3);getR
57、oionVectorFromGyro(gyro, deltaVector, dT / 2.0f);timest= event.timest;float deltaMatrix = new float9;/为了得到旋转后的向量,应该把计算出来的偏移量与当前向量叠加SensorManager.getRoionMatrixFromVector(deltaMatrix, deltaVector);gyroMatrix = Matrix3x3.multiplication(gyroMatrix, deltaMatrix);SensorManager.getOrienion(gyroMatrix, gyr
58、oOrienion);22/于陀螺仪传感器,由于传感器返回的 event 变量中的event.values 数组中返回的/分别是x, y, z 轴中的角速度。所以需要算出这三个角速度的算数平方和的/根,从而得出整体的角速度。然后把这个角速度乘以上次测量和本次测量之间/的时间,算出总共旋转的角度,然后通过公式:/x*sin(/2) y*sin(/2)z*sin(/2)算出在各个轴上旋转的角度。private float getRoionMatrixFromOrien float xM = new float9;float yM = new float9;float zM = new float9
59、;ion(float o) float sinX = (float)Math.sin(o1); float cosX = (float)Math.cos(o1); float sinY = (float)Math.sin(o2); float cosY = (float)Math.cos(o2); float sinZ = (float)Math.sin(o0);float cosZ = (float)Math.cos(o0);/ pitchxM0 = 1.0f; xM1 = 0.0f; xM2 = 0.0f;xM3 = 0.0f; xM4 = cosX; xM5 = sinX;xM6 = 0
60、.0f; xM7 = -sinX; xM8 = cosX;/ rollyM0 = cosY; yM1 = 0.0f; yM2 = sinY;yM3 = 0.0f; yM4 = 1.0f; yM5 = 0.0f;yM6 = -sinY; yM7 = 0.0f; yM8 = cosY;23/ azimuthzM0 = cosZ; zM1 = sinZ; zM2 = 0.0f;zM3 = -sinZ; zM4 = cosZ; zM5 = 0.0f;zM6 = 0.0f; zM7 = 0.0f; zM8 = 1.0f;/ 计算(roll pitch azimuth)float resultMatrix
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 元旦联欢会活动策划方案(4篇)
- 商场活动策划方案范文(2篇)
- 急性胰腺炎相关护理
- 二零二四年度医疗健康数据管理与分析合同
- 2024年度电子信息产品出口物流服务合同2篇
- 2024年度柑桔购销合同与柑橘购销合同修订版2篇
- 2024年办公室秘书个人工作总结参考(2篇)
- 房屋委托代管协议书
- “三实三提升”实施方案范文(2篇)
- 2024二手纺织品买卖合同样本2篇
- 上海市虹口中学2025届高三压轴卷数学试卷含解析
- 九年级全套课件教学课件教学课件教学
- 长春工程学院《西方文明史》2023-2024学年第一学期期末试卷
- 北京市五十六中学2024-2025学年七年级上学期期中数学试题
- 8.1 国家好 大家才会好(教学课件)-八年级道德与法治上册同步备课系列(统编版)
- 管理学基础知识考试题库(附含答案)
- 2024年辅警招考时事政治考题及答案(168题)
- 2024年“国际档案日”档案知识竞赛题目和答案
- 2024年广西普法云平台考试答案
- 2023-2024学年广东省深圳市福田区八年级(上)期末英语试卷
- 人教新课标四年级数学上册7《条形统计图》说课稿1
评论
0/150
提交评论