【问题标题】:How do you calculate the rate of rotation using the accelerometer values in Android for a particular axis如何使用 Android 中的加速度计值计算特定轴的旋转速率
【发布时间】:2014-03-19 16:33:27
【问题描述】:

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

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

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

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

我发现了这个link,它解释了如何从加速度计数据中获取俯仰和滚动。 我使用了确切的代码并想出了这个,

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,等一下,有变化吗?如果它的变化超过了你的阈值,//做点什么。

标签: java android game-physics


【解决方案1】:

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

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

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

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

警告:运动传感器指南中的这一段说了一些棘手的问题:

Android 开源项目 (AOSP) 提供了三个基于软件的 运动传感器:重力传感器、线性加速度传感器和 旋转矢量传感器。这些传感器在 Android 4.0 和 现在使用设备的陀螺仪(除了其他传感器)来改进 稳定性和性能。 ...所有这三个传感器都依赖于一个 陀螺仪:如果设备没有陀螺仪,则这些传感器没有 出现并且无法使用。

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

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

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

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

或者您可以使用加速度传感器来测量用户沿设备的 Y 轴上下移动设备的程度。 Y 轴指向屏幕顶部。 this Guide page 上的代码示例展示了如何使用高通滤波器来减去重力。

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

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

另请参阅Sensor API referenceSensor Event reference

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多