如何确定绝对方向

Posted

技术标签:

【中文标题】如何确定绝对方向【英文标题】:How to determine absolute orientation 【发布时间】:2010-11-14 05:26:05 【问题描述】:

我有一个 xyz 加速度计和磁力计。现在我想使用两者来确定设备的方向。我看到的问题是,根据设备方向,我需要以不同的顺序使用传感器。

让我举个例子。如果我的设备面向我,则可以使用加速度计确定滚动和俯仰的变化。对于偏航,我使用磁力计。

但是,如果我将设备水平放置(即,将其旋转 90º,面向天花板),则不会注意到向上矢量(现在是水平)的任何变化,因为加速度计没有检测到任何变化。现在可以使用磁力计检测到这一点。

所以问题是,如何确定何时使用其中一个。这两个传感器都够了吗?还是我需要其他的?

谢谢

【问题讨论】:

【参考方案1】:

关键是使用重力和磁力计这两个向量的叉积。叉积给出了一个垂直于它们的新向量。这意味着它是水平的(垂直于向下)并且与北方成 90 度。现在你有了定义方向的三个正交向量。这有点难看,因为它们并不都是垂直的,但很容易修复。然后,如果您将这个新矢量与重力矢量交叉,则给出垂直于重力矢量和磁体平面矢量的第三个矢量。现在您有了定义 3D 方向坐标系的三个垂直向量。原始加速度计(重力)向量定义 Z(上/下),两个叉积向量定义方向的东/西和北/南分量。

【讨论】:

我也是这么想的,穿过加速度计 (Z) 和磁力计 (磁 X) 得到 Y,然后穿过 Z 和 Y 得到局部 X。我想知道为什么没有人这样做;相反,每个人似乎都依赖于 X/Y 平面的倾斜补偿。 因为这非常复杂,你们谈论它而不告诉我们为什么可能是一个原因。向我们展示代码。 ? 我推荐观看这个视频:youtube.com/watch?v=0rlvvYgmTvI【参考方案2】:

这里有一些贯穿这个项目的文档。从其他答案可以清楚地看出,数学可能很棘手。 http://www.freescale.com/files/sensors/doc/app_note/AN4248.pdf

【讨论】:

【参考方案3】:

我认为“如何确定何时使用其中一个”的问题是错误的。您应该始终使用两个传感器进行定位。在某些情况下,其中之一是无用的。但是,这些都是极端情况。

【讨论】:

谢谢。看来我对这个问题不是很清楚。我很清楚在所有情况下我都需要同时使用加速器和磁力计,问题是在某些情况下这似乎还不够。 让我再用一个类似的例子:假设我有一部手机垂直,屏幕朝向我,“向上”向量指向天花板。每当我倾斜时,加速度计都允许我获取“向上”矢量信息。问题是,如果我倾斜设备并将其水平放置(屏幕现在面向天花板,并且“向上”矢量指向与我所在位置相反的位置),那么如果我旋转手机,向上矢量不会再更新水平地放在桌子上。这是现在磁力计清楚地检测到的东西。那么问题来了,什么时候知道在什么情况下使用 acc 或 mag 呢?【参考方案4】:

如果我的理解正确,您将需要一些东西来根据基点(北、东、南和西)检测俯仰(倾斜)和方向。

可以从加速度计读取间距。

可以从指南针读取根据基点的方向。

将这两个传感器的输出与软件中的正确数学正确结合起来,很可能会为您提供绝对方向。

我认为这样是可行的。

祝你好运。

【讨论】:

【参考方案5】:

如果您仍然需要绝对方向,您可以查看 Adafruit 的这个突破板:https://www.adafruit.com/products/2472。这块板的好处是它有一个 ARM Cortex-M0 处理器来为你做所有的计算。

【讨论】:

以上是关于如何确定绝对方向的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 onmousemove 事件的方向?

如何解决“无法确定滚动的导航方向”错误

如何确定 UIPanGesture 的方向(向上或向下)?

如何确定 NSLayoutConstraint 方向?

如何确定 jQuery 滚动事件的方向?

如何确定垂直 ScrollView 的方向?