9

这几行 C# 代码使用加速度计计算手机绕 y 轴的旋转:

private float GetRoll() {
    /*
     * Sum up the accelerometer events
     */
    Vector3 accelerationVector = Vector3.zero;
    for (int i=0; i < Input.accelerationEventCount; i++) {
        AccelerationEvent accEvent = Input.GetAccelerationEvent(i);
        accelerationVector += accEvent.acceleration * accEvent.deltaTime;
    }
    accelerationVector.Normalize();

    int inclination = (int) Mathf.Round(Mathf.Rad2Deg * Mathf.Acos(accelerationVector.z));
    float roll = 0;
    if (inclination < 25 || inclination > 155) {
        /*
         * How to calculate the rotation here?
         */
    } else {
        roll = Mathf.Round(Mathf.Rad2Deg * Mathf.Atan2(accelerationVector.x, accelerationVector.y));
    }
    return roll;
}

如果手机平放在桌子上,你知道让它工作的数学吗?即如果inclination小于 25 度还是大于 155 度?该代码源自此 SO 帖子,其中提到可以使用指南针。不幸的是,我不知道如何,所以非常感谢您的建议。另外,如果可能的话,我想避免使用陀螺仪,而是坚持使用加速度计。

欢迎任何建议。谢谢你。

4

3 回答 3

4

为什么不用陀螺仪?

如果您仔细考虑,如果旋转轴与加速度的总和完全平行,那么从加速度矢量中获取任何类型的旋转信息似乎在物理上是不可能的。

(也许您可以从向心力中获得速度,但仅此而已。)

于 2017-07-25T17:32:31.793 回答
1

你的要求几乎是不可能的

归结为陀螺仪测量空间中的绝对方向,而加速度计测量速度(加速度)的变化。当你使用微积分从加速度 (m/s^2) 到位置 (m) 时,你会得到位移——这在直觉上也很有意义。因为加速度计是在速度变化时触发的,所以在飞机上它甚至不会触发 400mph 恒速。

您不仅需要完整的加速度计历史记录,还需要原始位置和方向更不用说根据此类误差推断的所有误差,在此计算中,1% 的传感器误差会变得更大。

要获取有关方向的某种类型的传感器数据,必须使用陀螺仪(或者可能是指南针)。实际上,要直接回答您的问题,不需要加速度计,因为这是一个寻找位置的问题。但是,如果您想对用户手势做出反应,您的实际需求可能会从加速度计中受益。

Input.gyro.attitude 应该给你你的绝对方向值。在没有滚动的情况下平放时获取这些值,然后在滚动一定量的情况下再次获取这些值。在此之后,您应该有一些关于哪些值范围符合您的标准以及该条件下的一些误差范围的数据。

https://docs.unity3d.com/ScriptReference/Gyroscope.html

于 2017-07-27T13:37:52.450 回答
0

您可以使用

 onSensorChanged(SensorEvent event)

在这种情况下,您可以检测传感器的类型并计算 Roll、Azimut 和 Pitch,如给定示例所示

  float azimuthVal = event.values[0];
  float pitchVal = event.values[1];
  float rollVal = event.values[2];

您必须读取哪些传感器值可以从中获取

event.sensor.getType()

以及方向以找到可以从方法中获得的倾斜度

SensorManager.getOrientation

并且可以得到角度

azimutOrt = orientation[0];
pitchOrt = orientation[1];
rollOrt = orientation[2];

对于 Unity,可以使用以下三个

Input.acceleration: Accelerometer
Input.gyro.rotationRate:
Input.gyro.attitude
Input.gyro.gravity:
于 2017-07-27T06:34:44.973 回答