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

我在Google Android 2.1上编写一个应用程序,需要知道设备(HTC Hero)面向哪个方向(n / w / s / e)。 传感器和它的听众工作得很好,但是我从传感器得到的数值是非常糟糕的。 例如,它告诉我,当设备面向软件或软件时,我会面向北方。

这似乎是Android设备已知的问题。 我在网上find的“解决scheme”是这样的:

  • 摇动设备
  • 移动设备像一个八
  • 点击设备后面

这被认为是触发传感器重新校准。 而且:“四处移动”的东西适合我…但这不是很专业我猜…

所以 – 如何从SDK中触发重新校准方向传感器? 我需要传感器进行正确校准,没有任何花哨的东西,这将使这个应用程序的用户看起来像完全白痴,而他们是“手动”重新校准他们的手机…

有没有办法做到这一点“正确”?

编辑:

或者:是否有任何方法来确定程序,如果该设备是否正确校准或不? 可以这么说,我可以警告用户该设备需要“手动”重新校准。

Solutions Collecting From Web of "如何在android中校准方向传感器?"

我不相信如果你的罗盘传感器是正确校准的,除非你使用像GPS这样的辅助数据源,否则就无法通过程序来了解它。 如果您可以使用GPS,那么当用户正在移动时,您可以将GPS移动与指南针标题进行比较,并进行更正。 请记住,当地的磁场可能会使罗盘读数变差,而且设备不知道你是在森林中还是在变压器旁边。

有了这些微型设备总是有一些歪斜,你将不得不处理。 如果你检查加速度计的值,你会发现静止的时候,他们并不总是返回9.8米/秒^ 2(或者至less在设备之间一致)。

在你的帮助下,你可能只需要告诉用户用数字8来旋转/扭转他们的手机来重置指南针。

我假设你指的是英雄里面的磁力计。

对它进行调整是一个棘手的问题,并且将始终要求用户进行可靠的校准。 有单独的策略来处理这个问题。 你可以要求用户在北方的地方举行设备,然后进行二次修理。 如果用户不知道北方的位置,可以要求他们将设备指向太阳,并根据位置和时间计算出位置。

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

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

像这样工作的系统有时被称为惯性导航系统 (INS),因为它们可以给定空间中的固定点,而无需进一步的外部数据就可以准确地确定其随后的相对位置和方向。 使用卡尔曼滤波器是通常的做法,当绝对位置(例如,通过GPS获取)可用时,重新校准系统。

虽然实施一个完整的INS是不现实的,但你可以从他们的工作方式中吸取一些想法,使你的阅读方向更准确。

这些是你可以使用的一些方向处理程序

常量int ORIENTATION_UNKNOWN当无法确定设备方向时(通常在设备接近平坦位置时),从onOrientationChanged返回。 公共构造函数OrientationEventListener(上下文上下文)创build一个新的OrientationEventListener。 OrientationEventListener(上下文上下文,int rate)创build一个新的OrientationEventListener。 公共方法boolean canDetectOrientation()void disable()禁用OrientationEventListener。 void enable()启用OrientationEventListener,以便监视传感器,并在设备方向更改时调用onOrientationChanged(int)。 abstract void onOrientationChanged(int orientation)当设备的方向改变时调用。 [Expand]从类java.lang.Object Objectinheritance的方法clone()创build并返回此Object的副本。 boolean equals(Object o)将此实例与指定对象进行比较,并指示它们是否相等。 void finalize()在VM回收对象内存之前被调用。 final Class getClass()返回表示此对象类的Class的唯一实例。 int hashCode()返回此对象的整数哈希码。 final void notify()使正在等待该对象监视器的线程(通过调用其中一个wait()方法)被唤醒。 final void notifyAll()使所有在此对象监视器上等待的线程(通过调用其中一个wait()方法)被唤醒。 String toString()返回一个string,其中包含此对象的简明易懂的描述。 final void wait(long millis,int nanos)导致调用线程等待,直到另一个线程调用此对象的notify()或notifyAll()方法,或者直到指定的超时过期。 final void wait(long millis)导致调用线程等待,直到另一个线程调用此对象的notify()或notifyAll()方法或直到指定的超时过期。 final void wait()使调用线程等待,直到另一个线程调用此对象的notify()或notifyAll()方法。 常量public static final int ORIENTATION_UNKNOWN从以下版本开始:API级别3

从方向返回当设备方向无法确定时(通常在设备接近平坦位置时)更改。 也可以看看

* onOrientationChanged(int) 

常量值:-1(0xffffffff)公共构造函数public OrientationEventListener(上下文上下文)从以下版本开始:API Level 3

创build一个新的OrientationEventListener。 OrientationEventListener的参数上下文。 公共OrientationEventListener(上下文上下文,int rate)从以下版本开始:API Level 3

创build一个新的OrientationEventListener。 OrientationEventListener的参数上下文。 传感器事件的处理速率(另请参阅SensorManager)。 使用SENSOR_DELAY_NORMAL的默认值进行简单的屏幕方向更改检测。 公共方法public boolean canDetectOrientation()从以下版本开始:API Level 3

public void disable()从以下版本开始:API Level 3

禁用OrientationEventListener。 public void enable()从以下版本开始:API Level 3

启用OrientationEventListener,以便监视传感器,并在设备方向更改时调用onOrientationChanged(int)。 public abstract void onOrientationChanged(int orientation)从以下版本开始:API Level 3

当设备的方向改变时调用。 方向参数的取值范围为0〜359,取向为0度,左侧为90度,上下180度,270度时为270度。右边是顶部。 ORIENTATION_UNKNOWN在设备接近平面且无法确定方向时返回。