用核心运动计算倾斜角

2024-03-10

我的申请有一个记录会话。当用户开始记录会话时,我开始从设备的 CMMotionManager 对象收集数据并将它们存储在 CoreData 上以供稍后处理和呈现。我正在收集的数据包括 GPS 数据、加速度计数据和陀螺仪数据。数据的频率为10Hz。

目前我正在努力用运动数据计算设备的倾斜角度。可以使用重力数据来计算设备的哪一侧是陆地,但我想计算用户和地面之间的右角或左角,而不管行进方向如何。

这个问题需要一些线性代数知识来解决。例如,为了计算某个点,我必须计算计算平面上的 3D 线的方程。我花了一天时间研究这个问题,而且它变得越来越复杂。我根本不擅长数学。一些与该问题相关的数学例子也很受欢迎。


这取决于您想如何处理收集到的数据,以及用户将如何使用口袋里的录音 iPhone。原因是欧拉角并不安全,尤其是没有独特的方式来表达旋转。考虑这样一种情况:用户将手机直立放入牛仔裤的后袋中,然后向左转大约 90°。因为 CMAttitude 与平放在桌子上的设备相关,所以根据此您有两个后续旋转 (pitch=x, roll=y, yaw=z)picture http://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html#//apple_ref/doc/uid/TP40009541-CH4-SW22:

  • 俯仰 +90° 使手机直立 => (90, 0, 0)
  • 滚动 +90° 左转 => (90, 90, 0)

但您可以通过以下方式获得相同的位置:

  • 偏航 +90° 用于向左转动手机 (0, 0, 90)
  • 俯仰 -90° 使手机直立 (-90, 0, 90)

您会看到两种不同的表示形式 (90, 90, 0) 和 (-90, 0, 90) 来实现相同的旋转,而且还有更多。因此,您按下“开始”按钮,进行一些奇特的旋转以将手机放入口袋中,然后您就会遇到麻烦,因为在执行更复杂的运动时(第 10 条),您不能依赖欧拉角。万向节锁 http://en.wikipedia.org/wiki/Gimbal_lock对此更头痛;-)

现在好消息:你是对的,线性代数可以完成这项工作。您可以做的就是强制用户将手机始终放在相同的位置,例如直立固定在右后口袋中,并通过构建计算相对于地面的角度点积 http://en.wikipedia.org/wiki/Dot_product#Geometric_interpretation的重力矢量CMDeviceMotion http://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMDeviceMotion_Class/Reference/Reference.html#//apple_ref/occ/instp/CMDeviceMotion/gravity g = (x,y,z)位置向量 p 是直立位置的 -Y 轴 (0, -1, 0):

g • x = x*0 + y*(-1) + z*0 = -y = ||g||*1*cos(阿尔法)

=> 阿尔法 = 反余弦 (-y/9.81)作为总角度。请注意,重力加速度 g 始终约为 9.81

为了获得左右倾斜角度和前后角度,我们使用切线:

alphaLR = arctan (x/y)

alphaFB = arctan (z/y)


[更新:]

如果您不能依赖将手机置于上面等式中的预定义位置(如 (0, -1, 0)),则只能计算总角度,而不能计算特定角度 alphaLR 和 alphaFB。原因是新坐标系只有一个轴,而您需要其中两个轴。新的 Y 轴y'然后将被定义为平均重力矢量,但您不知道新的 X 轴,因为垂直于 y' 的每个矢量都将有效。

因此,您必须提供进一步的信息,例如让用户在不偏离的情况下向一个方向走更长的距离,并使用 GPS 和磁力计数据来获取第二轴 z'。听起来在实践中很容易出错。

总角度没有问题,因为我们可以用平均重力矢量 (pX, pY, pZ) 替换 (0, -1, 0):

g•p = xpX + ypY + zpZ = ||g||||p||*cos(alpha) = ||g||^2*cos(alpha)

阿尔法 = 反余弦 ((xpX + ypY + z*pZ) / 9.81^2)


还有两件事要记住:

  • 不同的人穿不同的裤子和不同的口袋。因此,即使同一个人穿着其他衣服,重力矢量也会不同,您可能需要某种归一化
  • CMMotionManager 不在后台工作,即用户不得按下待机按钮
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用核心运动计算倾斜角 的相关文章

随机推荐

  • 带表达式的 C++ 模板参数

    我在使用 C 时遇到了麻烦 我希望能够将表达式作为参数放入模板中 这是我的代码 include
  • 从 Java Web 应用程序控制 C 应用程序

    我有 C 应用程序将在不同站点的多台计算机上运行 现在我想控制和监视这些C应用程序 为此 我正在考虑使用 Servlet JSP 的 Java Web 应用程序 我认为 C 应用程序将通过 TCP 连接到 Java Web 应用程序 在我的
  • 如何使用 Wireshark 从 TCP 数据包中提取原始数据

    对 Wireshark 完全陌生 想知道如何从我在 Wireshark 上收到的 TCP 数据包中提取数据 我目前正在使用带有 Grove 传感器的树莓派并获取压力和温度值 我将这些值发送到云中的服务器并且它正在工作 我正在使用wiresh
  • 如何在javascript中打开没有任何栏(如地址栏、书签栏等)的浏览器窗口?

    我希望打开一个没有任何地址栏 书签栏的网址 html 文件 以便用户只看到应用程序窗口 有办法这样做吗 window open url window toolbar no menubar no resizable yes 您可以阅读这些以及
  • 顺序一致性和原子性有什么区别?

    我读到 java 易失性是顺序一致的 但不是原子的 对于原子性java提供了不同的库 有人可以用简单的英语解释两者之间的区别吗 我相信问题范围包括 C C 因此添加这些语言标签以获得更多受众 想象一下一个类中的这两个变量 int i 0 v
  • 为什么 GridView 内的 LinkBut​​ton 不会引发其 OnClick 事件?

    我在 GridView 中有一个 LinkBut ton 通过 TemplateField 无论我如何尝试 LinkBut ton 都不会调用其事件处理程序 我都尝试过 传统的事件处理程序 OnClick GridView 级别的 OnRo
  • 根据中心性对顶点着色

    我正在尝试更改 igraph 生成的图形中顶点的颜色 更具体地说 我有一个从邻接矩阵创建的 95 个节点图 我想根据它们的度数 介数 特征值中心性 接近度对它们进行着色 但我猜在我知道如何用它来做之后 我可以和其他人一起做 所以到目前为止我
  • ChartJS 不使用 Moment.js 显示时间数据

    我正在尝试按小时绘制给定日期的一系列数据点 并非每个小时都包含在数据集中 但我仍然想显示从 0 00 23 00 的时间并绘制可用的数据点 我的错误是 该方法未实现 要么找不到适配器 要么找不到适配器 提供了不完整的集成 然而 纵观文档 h
  • 在 Perl 中将 UTF8 字符串转换为 ASCII

    我已经尝试了 Google 和 StackOverflow 推荐的 我能找到的 所有内容 包括使用 Encode 我的代码可以工作 但它只使用 UTF8 并且我收到宽字符警告 我知道如何解决这些警告 但我没有将 UTF8 用于其他任何用途
  • 隐藏除前 4 个元素之外的所有元素

    有无穷无尽的元素 我想要做的是隐藏除前 4 个元素之外的所有元素 带有 not 选择器 我想让点击全部可见 这可以用CSS实现吗 ul li li li li li li li li li li must hide li li must h
  • 使用 Base64 图像的 HTML 到 PDF 会抛出 FileNotFoundException

    我正在使用 itextpdf 5 0 6 jar Java 8 当我尝试使用 base64 图像标签导出 html 代码时 出现文件未找到异常 如果我删除图像标签 一切都会很好 我发现了一些关于覆盖图像标签处理器的解决方案 但大多数都是旧的
  • 关闭 Selenium IDE 中新打开的选项卡或窗口

    在 Windows7 和 Firefox 中使用 Selenium IDE 自动单击链接可能会生成新选项卡或新窗口 close 关闭原始窗口或选项卡 而不是新窗口或选项卡 也许如果我有新创建的 ID 我可以选择它然后关闭它 但我不知道如何自
  • 对两个对象数组的数据求和

    我有两个对象数组 我想对具有相同键 在本例中为 id 的对象求和 如果没有匹配键 则只需创建一个新的 如果我是 我很抱歉没有解释清楚 我对 JavaScript Array Object 很陌生 var dataOne id 1 total
  • 将另一个声音添加到 .NET Speech 中

    如何将其他声音添加到 NET Speech 中 我想使用捷克语语音 我找到了一些 sis files Eliska22k sis但我不知道如何使用它 SpeechSynthesizer synth new SpeechSynthesizer
  • Common Lisp 案例和引用元素

    我正在用 CL 编写一个地下城爬行游戏 但在处理案例表单时遇到了问题 两件事情 Common Lisp 抱怨Duplicate keyform QUOTE in CASE statement make instance cl rogue t
  • 如何在 python-flask 中添加自定义字体?

    我尝试过使用 fontface css 样式 但字体没有渲染 还有另一种方法可以使用 python flask 来做到这一点吗 p style font family trial font weight bold Hello p 上面是我的
  • 使 Div 向上滚动时返回到其原始位置

    当您向下和向上滚动时 我有一个带动画的 div 问题是 当我非常快地向上和向下滚动而不让 div 完成其动画时 div 会逐渐从上部屏幕中消失 如果我删除 animate 函数中的 stop 并快速上下滚动 div 会继续执行此操作一段时间
  • 如何在Android Studio上实时查看Sqlite数据库中插入的数据

    你能帮我解决这个问题吗 我正在将值插入到我的 Sqlite 数据库中 如何检查或查看插入的数据 有没有任何工具或其他技术来显示数据 如果您想显示数据Log尝试下面的代码 for Contact cn contacts String log
  • .NET Standard 2.0 无法在 .NET Framework 2.0 中引用

    我收到一个错误 c xxxx csproj 目标为 NETStandard Version v2 0 它无法被面向 NETFramework Version v2 0 的项目引用 WindowsFormsApp1 如何解决 遗憾的是 您无法
  • 用核心运动计算倾斜角

    我的申请有一个记录会话 当用户开始记录会话时 我开始从设备的 CMMotionManager 对象收集数据并将它们存储在 CoreData 上以供稍后处理和呈现 我正在收集的数据包括 GPS 数据 加速度计数据和陀螺仪数据 数据的频率为10