Java 如何在android中校准方向传感器?

Java 如何在android中校准方向传感器?,java,android,android-sensors,Java,Android,Android Sensors,我正在谷歌安卓2.1中编写一个应用程序,需要知道该设备(HTC Hero)正面临哪个方向(n/w/s/e)。传感器和它的监听器工作得很好,但是我从传感器得到的值完全是垃圾。e、 它告诉我当设备面向西南方向时,我将面向北方 这似乎是安卓设备的一个已知问题。我在网上找到的“解决方案”如下: 晃动设备 像移动8一样移动设备 点击设备背面 这被认为会触发传感器重新校准。而且:“四处走动”对我来说很有用。。。但我想那不是很专业 那么-如何从SDK触发方向传感器的重新校准?我需要传感器被正确校准,没有任

我正在谷歌安卓2.1中编写一个应用程序,需要知道该设备(HTC Hero)正面临哪个方向(n/w/s/e)。传感器和它的监听器工作得很好,但是我从传感器得到的值完全是垃圾。e、 它告诉我当设备面向西南方向时,我将面向北方

这似乎是安卓设备的一个已知问题。我在网上找到的“解决方案”如下:

  • 晃动设备
  • 像移动8一样移动设备
  • 点击设备背面
这被认为会触发传感器重新校准。而且:“四处走动”对我来说很有用。。。但我想那不是很专业

那么-如何从SDK触发方向传感器的重新校准?我需要传感器被正确校准,没有任何花哨的东西会让这个应用程序的用户在“手动”重新校准手机时看起来像个十足的白痴

有没有办法做到“正确”

编辑:


或者:是否有任何方法以编程方式确定设备是否正确校准?可以说,作为一种后备选择。。。然后我可以警告用户,设备需要“手动”重新校准。

除非使用GPS等辅助数据源,否则我不相信有办法通过编程知道罗盘传感器是否正确校准。如果您可以使用GPS,那么当用户移动时,您可以将GPS移动与指南针航向进行比较并进行校正。请记住,本地磁场会把罗盘读数搞砸,这些设备不知道你是在森林的中间还是在变压器旁边。p> 有了这些微型设备,总有一点偏差,你将不得不处理。如果您也检查加速计的值,您会发现,在静止状态下,它们并不总是返回9.8 m/s^2(或者至少在设备之间保持一致)


在您的帮助中,您可能只需要告诉用户以8字形旋转/扭转手机即可重置指南针。

我猜您指的是英雄内部的磁强计

校准这是一项艰巨的任务,需要用户交互才能进行真正的校准。有不同的策略来处理这个问题。您可以要求用户将设备保持在北向,然后重新校准。如果用户不知道北方在哪里,你可以让他们将设备指向太阳,根据位置和时间,你可以计算出北方在哪里

撇开校准不谈,我想你的问题是你从传感器得到的读数不准确。当然,校准是准确读数的先决条件,但也有其他因素在起作用

通常的做法是用不同传感器的数据补充来自一个传感器的传感器数据,以提高精度。用户移动时,您可以使用GPS确定航向。但是,如果他移动缓慢,这也是不准确的。您可以整合加速度计报告的数据来猜测方向变化(而不是绝对方向)。但老实说,在这种情况下,陀螺仪会更理想

像这样工作的系统有时被称为(INS),因为它们可以在给定空间中的一个固定点的情况下,准确地确定它们随后的相对位置和方向,而无需进一步的外部数据。当绝对位置(如通过GPS检索)可用时,通常使用卡尔曼滤波器不时重新校准系统


虽然实现全面的INS是不现实的,但您当然可以从它们的工作原理中得出一些想法,以使您的方位读数更准确。

一旦我在市场上看到指南针应用程序。如果磁场牵引力不好,此应用程序将显示一条消息。我不知道这是怎么回事,所以我对这个答案很感兴趣,谢谢你的答案,但遗憾的是,我根本无法在这个应用程序中使用gps。问题是,在我让htc hero重新校准传感器之前,我一直让它返回给我全无感知。我真的需要知道如何通过sdk/ndk触发这一点…有一个论坛,他们提到了一些shell指令,以强制传感器编写新的设置文件,但它需要使用su命令,这意味着您可能无法在正常的android版本中使用它。。。除此之外,您还可以通过Java打开一个shell,并键入这些命令,即使它需要重新启动才能生效,前提是它可以正常工作。你可以在这里查看链接:只有当你指示用户将手机指向运动方向时,GPS校准方法才会起作用,对吗?或者我遗漏了什么?我认为使用GPS校准罗盘只需要一致的方向wrt运动。假设用户向东北移动,然后转向向西。只要用户将装置保持在相同的方向(在仪表板上或手上),指南针应适当改变,如果它与GPS读数不匹配,则这就是校正系数。