从四元数旋转到度(0 - 360°)

时间:2016-05-17 11:49:06

标签: android rotation quaternions google-project-tango

我已经在机器人上横向安装了Google Project Tango设备,并希望从onPoseAvailable()事件监听器获取标题。我知道框架会返回API中描述的四元数。

我尝试了将四元数转换为仅以度为单位的度量。我唯一感兴趣的方向轴是yhttps://developers.google.com/project-tango/overview/coordinate-systems#project_tango_coordinate_systems),它决定了我机器人的方向。

我的第一种方法是使用TYPE_ROTATION_VECTORTYPE_GYROSCOPETYPE_ORIENTATION(已删除)。但结果值无法使用。后来我读到Tango有磁传感器的主要问题(How to detect an absolute rotation of an android device

这就是从探戈本身切换到姿势数据的原因。但这里也一样。无论是对于合适的结果还是火箭科学,还是探戈在这里也存在重大问题。我阅读了所有stackoverflow文章和我在互联网上发现的几乎所有内容。我重新实现了我发现的几乎所有代码。但对于我目前的情况,没有任何一块按预期工作。对于其他轴的其他运动,它是!

我尝试了以下内容:

还是有其他方法可以确定机器人应用程序的旋转吗? (只是标题)。我唯一想要实现的是转弯预定角度(以度为单位)。大多数情况下,我只想向右或向左转(90°)。

如果有人可以提供一段工作代码(针对Google Project Tango设备)会非常有帮助。这已经失去了几天。对于其他Android设备,我很快就找到了解决方案。不排除该设备还有其他主要错误。

1 个答案:

答案 0 :(得分:2)

试试这段代码。请注意,计算出的方向与服务开始时的设备方向有关。

double orientationRoll = Math.toDegrees(Math.atan2(
            2.0 * (rotation[TangoPoseData.INDEX_ROTATION_X] * rotation[TangoPoseData.INDEX_ROTATION_Y] + rotation[TangoPoseData.INDEX_ROTATION_W] * rotation[TangoPoseData.INDEX_ROTATION_Z]),
            Math.pow(rotation[TangoPoseData.INDEX_ROTATION_W], 2) + Math.pow(rotation[TangoPoseData.INDEX_ROTATION_X], 2) - Math.pow(rotation[TangoPoseData.INDEX_ROTATION_Y], 2) - Math.pow(rotation[TangoPoseData.INDEX_ROTATION_Z], 2)
    ));