java - Android:有什么方法可以精确区分Phone-Movement和-Rotation吗?

标签 java android android-sensors smartphone inertial-navigation

我目前正在开发 VR 框架。我的 Android 智能手机用作立体显示器和 Controller 。我可以进行头部追踪,但我也想要一个简单的位置追踪。我知道精确跟踪智能手机的位置是不可能的。至少只要仅限于智能手机的传感器即可。 因此,我们的想法是区分智能手机的旋转(头部追踪)和任何类型的一般运动。当然,结果是我只能移动,例如如果检测到运动则向前。正如我所说,头部追踪与 Android 陀螺仪配合得很好。但运动跟踪仍然没有像我想要的那样工作。

主要问题是,当旋转手机时,这个旋转实际上也是一种加速度。因此,仅查看加速度的大小不足以区分加速度(运动)和旋转。 此外,做一些类似于陀螺仪阈值的事情:

if(gyroscope.magnitude < EPSILON)
    if(accelerometer.magnitude > EPSILON)
        //this may be motion

也没有产生所需的差异化,因为步行时手机总是会发生一定程度的旋转。

长话短说:这个问题有没有可能的解决方案? (编辑)如果是,是如何完成的?我希望能够区分智能手机是否被移动或旋转。理想情况下仅使用陀螺仪和加速度计。

致以诚挚的问候并感谢您的任何反馈!

最佳答案

我建议熟悉四元数的概念以及如何使用它们来表示方向(这可能是一个好的开始:http://run.usc.edu/cs520-s12/quaternions/quaternions-cs520.pdf)
另外,使用启发式作为您建议的“EPSILON”可能还不够,因为在某些情况下启发式可能会失败,但我确信您已经知道了。
大多数时候您必须关心原始数据中的偏差,因此您必须确保手机在测量开始时处于静止状态足够长的时间(取决于您在该时间段内获得的样本数量=取决于传感器的采样率)。在这种情况下,您可以计算轴上的平均值并减去它。这假设偏差随着时间的推移保持不变,并且不关心偏差不稳定(请看这里: http://sensorwiki.org/doku.php/sensors/gyroscope )。偏差不稳定性不仅仅适用于陀螺仪。
如果您不能保证在过程开始时休息,您还需要阅读有关卡尔曼滤波器的内容,因为它们为您提供了估计偏差的可能性。我已经看到使用四元数和偏差作为状态的 KF 实现;) - 仅供初学者使用。

关于java - Android:有什么方法可以精确区分Phone-Movement和-Rotation吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41173472/

相关文章:

java - 在 Spring 中实现 JpaRepostiory 时使用存储库注释

java - ArrayList 添加空指针

android - pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) 没有给出正确的答案

android - 如何在一次 Activity 中读取 GPS 数据和加速度计数据

android - S-View遮盖检测【磁性传感器】

android - 方法 onPause( ), onResume( ) 未定义类型

java - 等到firebase检索数据

java - 正则表达式验证空字母或仅字母

Android Studio 在构建期间每次都会下载 maven 元数据

facebook的Android共享 Intent -共享文本和链接