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

2024-03-11

我正在开发一个简单的游戏,其中角色仅沿 Y 轴上下移动。

目前我正在使用加速度计读数来更改角色的 Y 速度。游戏运行良好,但最大的问题是你必须保持设备水平才能正常玩游戏。

我真正想要的是仅当沿 Y 轴的旋转速率发生变化时才更改角色的 Y 速度。我需要能够将此变化率转换为角色的 Y 速度。这样,无论设备倾斜多少,用户都可以正常握持设备来玩游戏。

由于加速度计在每个设备中都是强制性的,因此较旧的设备可以运行我的游戏,我希望能够使用从加速度计检索的数据来计算该变化率。

我找到了这个link http://developer.nokia.com/community/wiki/How_to_get_pitch_and_roll_from_accelerometer_data_on_Windows_Phone这解释了如何从加速度计数据获取俯仰和滚动。 我使用了确切的代码并想出了这个,

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);

通过这段代码,我无法掌握如何计算变化率。

我是否朝着正确的方向前进,或者这与我想要的完全不同?

另外,如果我只使用陀螺仪而不是依靠加速度计会更好吗?

提前致谢。


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

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

您将从 Android 的软件衍生中获得更好的数据运动传感器 http://developer.android.com/guide/topics/sensors/sensors_motion.html(而不是仅来自加速度计),因为它们结合了来自加速度计、磁力计和(如果有)陀螺仪的信号。运动传感器还可以纠正已知的偏差,并使用卡尔曼滤波器消除噪声。陀螺仪在检测旋转变化方面比其他两个传感器更准确、更快,但它们仅检测到比某个阈值更快的变化。它们不检测绝对位置或方向。

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

Caveat:《运动传感器指南》中的这一段说了一些棘手的事情:

Android 开源项目 (AOSP) 提供了三种基于软件的 运动传感器:重力传感器、线性加速度传感器和 旋转矢量传感器。这些传感器在 Android 4.0 中进行了更新, 现在使用设备的陀螺仪(以及其他传感器)来改进 稳定性和性能。 ...所有这三个传感器都依赖于 陀螺仪:如果设备没有陀螺仪,这些传感器就不会 显示且不可用。

I think这意味着在 Android 4.0 及更高版本上,这三个基于软件的传感器仅在具有陀螺仪的设备上可用,而它们始终在早期版本的 Android 上可用。在各种设备上进行一些快速测试以找出答案,然后请在此处报告。

Note:它有助于校准磁力计。通过将设备以大的 8 字形状移动几个周期来实现此目的。磁力计硬件将检测到这一点,跟踪其测量的值范围,然后调整其校准参数。

(2) 如何获取你想要的运动变化信息

要控制您的游戏角色,请考虑阅读旋转矢量传感器。绕 X 轴的旋转减去初始 X 轴旋转应指示设备相对于捕获初始旋转值时向上或向下倾斜的程度。

或者,您可以使用加速度传感器来测量用户沿设备的 Y 轴上下移动设备的距离。 Y 轴指向屏幕顶部。代码示例位于本指南页面 http://developer.android.com/guide/topics/sensors/sensors_motion.html#sensors-motion-accel展示如何使用高通滤波器减去重力。

我真正想要的是仅在以下情况下更改角色 Y 速度 沿 Y 轴的旋转速率发生变化。

这将测量一个人左右(而不是上下)倾斜手机的速度(而不是多少)。如果您需要有关值变化的数学背景,请参阅可汗学院的简短讲座衍生品[微积分,而不是金融]和积分。维基百科也应该有帮助。简而言之,通过减去参考值来计算值的变化,通过减去以固定时间间隔采样的先前值来计算变化率(例如,根据速度计算加速度),并通过求和来计算积分(例如,根据加速度计算速度)采样值。

另请参阅传感器 API 参考 http://developer.android.com/reference/android/hardware/Sensor.html传感器事件参考 http://developer.android.com/reference/android/hardware/SensorEvent.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Android 中的加速度计值计算特定轴的旋转速率 的相关文章

随机推荐