如何在Android中使用加速度计值计算特定轴的旋转率

3
我正在开发一个简单的游戏,其中包括一个角色沿着Y轴上下移动。目前我正在使用加速度计读数来改变角色的Y速度。游戏运行良好,但最大的问题是必须保持设备水平才能正确玩游戏。
我真正想要的是只有在Y轴旋转率发生变化时才改变角色的Y速度。我需要能够将这种变化率转换为角色的Y速度。通过这种方式,无论设备倾斜多少,用户都可以正常持握设备玩游戏。
由于加速度计在每个设备中都是必需的,因此旧设备也可以运行我的游戏,我希望能够使用从加速度计检索到的数据来计算这种变化率。
我找到了这个链接,它解释了如何从加速度计数据中获取俯仰和滚转。我使用了完全相同的代码,并得出了以下结果,
final double alpha = 0.5;
    double fXg = 0;
    double fYg = 0;
    double fZg = 0;
    fXg = game.getInput().getAccelX() * alpha + (fXg * (1.0 - alpha));
    fYg = game.getInput().getAccelY() * alpha + (fYg * (1.0 - alpha));
    fZg = game.getInput().getAccelZ() * alpha + (fZg * (1.0 - alpha));
    double pitch = (Math.atan2(-fYg, fZg) * 180.0) / Math.PI;
    double roll = (Math.atan2(fXg, Math.sqrt(fYg * fYg + fZg * fZg)) * 180.0) / Math.PI;
    pitch = (pitch >= 0) ? (180 - pitch) : (-pitch - 180);

使用这段代码,我无法理解如何计算变化率。

我是否朝着正确的方向前进,还是完全不同于我想要的?

如果只依赖陀螺仪而不是加速度计,这样做是否更好?

提前致谢。


如果你正在寻找变化率,那么你也需要考虑时间。存储 fYg,等待一段时间,它是否发生了变化?如果它的变化超过了你的阈值,就执行某些操作。 - Sionnach733
1个回答

4

这个答案有两部分。(1) 需要读取哪些传感器数据。(2) 如何获取所需的运动变化信息。

(1) 需要读取哪些传感器数据

从 Android 的软件派生的 Motion Sensors(比起只使用加速度计)可以获得更好的数据,因为它们结合了来自加速度计、磁力计和(如有)陀螺仪的信号。运动传感器还可能校正已知偏差,并使用卡尔曼滤波器去除噪声。陀螺仪在检测旋转变化方面比其他两种传感器更精确和更快,但它们只能检测超过某个阈值的更快的变化。它们不能检测绝对位置或方向。

"旋转传感器"是 Android 关于设备旋转的最佳信息的派生指示。我的记忆是,如果可用,它包括陀螺仪信号,否则它只使用加速度计(测量包括重力在内的线性力)和磁力计(测量地球磁场中的方向)。

注意: 运动传感器指南中的这一段说得有些棘手:

Android开源项目(AOSP)提供了三种基于软件的运动传感器:重力传感器、线性加速度传感器和旋转矢量传感器。这些传感器在Android 4.0中进行了更新,现在使用设备的陀螺仪(以及其他传感器)来提高稳定性和性能。... 这三个传感器都依赖于陀螺仪:如果设备没有陀螺仪,则这些传感器不会显示,并且无法使用。
我认为这意味着在Android 4.0及更高版本上,这三个基于软件的传感器只能在有陀螺仪的设备上使用,而它们在早期版本的Android上始终可用。请在各种设备上进行快速测试,然后在此处报告结果。
注意:校准磁力计有助于获取更好的运动变化信息。通过在大型八字形中移动设备数个周期来完成此操作。磁力计硬件将检测到此操作,跟踪其测量的值范围,然后调整其校准参数。
(2)如何获取所需的运动变化信息
要控制游戏角色,请考虑阅读旋转向量传感器。围绕X轴的旋转减去初始X轴旋转应指示设备相对于捕获初始旋转值时向上或向下倾斜了多少。
或者,您可以使用加速度传感器来衡量用户沿设备的Y轴上下移动了多少。Y轴指向屏幕顶部。本指南页面上的代码示例显示如何使用高通滤波器来消除重力的影响。
“我真正想要的是仅当沿Y轴的旋转率发生变化时才更改字符的Y速度。”
那将测量手机左右倾斜的速度(而不是数量),如果您需要了解数值变化的数学背景,请参阅可汗学院有关微积分中的导数和积分的短讲。维基百科也应该很有帮助。简而言之,通过减去其参考值来计算值的变化,通过减去在定期时间间隔内采样的先前值来计算变化率(例如从速度计算加速度),通过对采样值进行求和来计算积分(例如从加速度计算速度)。
另请参阅传感器API参考传感器事件参考

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接