ANDROID上的磁场传感器校准

时间:2011-05-18 16:27:26

标签: android

我正在制作一个作为指南针的应用程序..

我正在使用加速度计和磁场传感器计算通过sensor.getOrientation()的方位角。

我正在寻找可以提高磁场传感器精度的东西,因为我的准确度已经达到了不可靠的状态!

任何人都对此有所了解吗?我正在寻找可以硬编码的东西,或者只是物理移动手机直到校准完毕!

4 个答案:

答案 0 :(得分:14)

只需几点

图8运动有时会起作用而不是其他运动,我不知道为什么,他们确实需要某种基于代码的方式来检查8运动是否有效(假设实际需要物理运动)

他们还需要一种方法来检测是否需要校准,我查看了准确输出的代码(不可靠的常数),一旦他们发送给你,他们就不会再发送它了,所以例如你校准但是然后进入一个强磁场,它将不会重新发送(不确定为什么他们这样做)

检测正在发生的问题的一种不完全可靠的方法是您也可以使用磁传感器输出并执行类似field = sqrt(x * x + y * y + z * z)的操作并检查该字段是否介于25之间和65,然后要求用户校准,如果没有。

测试18部手机之后的底线是,我永远不会依赖基于Android的指南针和当前的手机,准确性总会有问题。

我也发现,即使你很幸运并拥有一部相当可靠的手机,你也永远无法确定它是否经过校准而没有在真正的指南针上进行检查,这种目的无法实现。

注意:在很多行为不当的手机上,我们发现传感器会写一个校准文件和一个同名的tmp文件。如果删除这些文件并重新启动电话,则会使用零值重新创建校准文件,冷启动和一般校准问题将自行解决。

坏消息是它们存储在/ data / misc中并需要root权限才能获得(感谢Google& Sensor mfg!)所以即使我怀疑这会为很多开发人员解决很多问题从市场应用的角度来看,这是不可行的。

答案 1 :(得分:13)

这不是最后的答案(我当然不知道任何事情),但我对在线帖子的理解是,当指南针在使用时,以8的数字挥动手机应该会触发自动重新校准。例如,这就是谷歌地图应用程序建议的内容。我不知道这是否依赖于应用程序功能(在地图中检测到加速度计挥动并触发重新校准的东西),或者在Android堆栈中的某些东西,或者特定于每个电话实现的东西。试试看吧!

例如讨论:http://androidforums.com/epic-4g-support-troubleshooting/217317-cant-get-compass-calibrate.html

此引用似乎表明此每轴/图8旋转过程具有内置功能:http://m.eclipsim.com/gpsstatus/

这里有另一篇声称这是内置功能的文章,您甚至不需要运行指南针消耗的应用程序来重新校准工作:http://www.ichimusai.org/2009/06/20/how-to-calibrate-the-htc-magic-compass/

答案 2 :(得分:1)

我正在为Android开发。我使用Titanium Alloy作为Titanium Geolocation模块的开发工具。

我只针对商用磁罗盘测试了2个设备[Galaxy Note和S4]。经过校准过程[沿着3轴倾斜]并使用2个不同的指南针应用程序和我正在使用的应用程序,Android指南针似乎足够准确以供基本使用......无论如何,相关性已经足够我的目的了。我还发现设备罗盘读数对其他磁场和电场干扰非常敏感...我犯的最初错误是使用罗盘功能,而设备在带有磁性闭合装置的设备保护器中[在标签上很常见]。 ..这种干扰特别强烈。因此,我需要向我的应用程序的用户建议删除设备保护器,保持设备不受其他电子设备的影响,然后在初始化应用程序之前进行标准校准。

答案 3 :(得分:0)

另一种选择是:

转到传感器菜单:// my run block : (function () { 'use strict'; angular .module('fuse') .run(runBlock); function runBlock($rootScope, $timeout, $state, $cookieStore) { $rootScope.$on('$translateChangeSuccess', function () { // catch translateChangeSuccess event // redo the previous api request }); } })(); // my change language function /** * Change Language */ function changeLanguage(lang) { angular.forEach(vm.languages, function(value, key) { if (lang.code == key) $translate.use(lang.code); // launch translateChangeSuccess event }); } // my api service function apiService($http, $resource, $translate, CONFIG_API) { // change header with good language $http.defaults.headers.common["Accept-Language"] = $translate.proposedLanguage(); var api = {}; // Base Url api.baseUrl = CONFIG_API.base_url; // request to reload when user changes language api.Documents = $resource(api.baseUrl + 'documents/:id', {id: '@id'}, {update: {method: 'PUT'}} ); ... }

然后,如果您在#*0#*部分和Magnetic Sensor中看到一条红线,则应重新校准指南针。

如何;

根据those guys;

  

将三星Galaxy Mini S5绕其所有轴转动直至红色   黑色圆圈中的线条将颜色从红色变为蓝色。你也可以   通过一个遵循8的形状的运动。可能是这样   校准指南针需要多次尝试......