从作为四元数的旋转到度数 (0 - 360°)
From rotation as quaternion to degrees (0 - 360°)
我已经在机器人上横向安装了一个 Google Project Tango 设备,并希望从 onPoseAvailable()
事件侦听器获取标题。我知道框架 returns 中描述了一个四元数 API.
我尝试了很多将四元数转换为仅以度为单位的测量值。我唯一感兴趣的方向轴是 y
(https://developers.google.com/project-tango/overview/coordinate-systems#project_tango_coordinate_systems),它决定了我的机器人的航向。
我的第一个方法是使用 TYPE_ROTATION_VECTOR
、TYPE_GYROSCOPE
或 TYPE_ORIENTATION
(已删除)。但结果值无法使用。后来我读到 Tango 的磁传感器存在重大问题 (How to detect an absolute rotation of an android device)
这就是从探戈本身切换到姿势数据的原因。但这里也一样。要获得适当的结果要么是火箭科学,要么探戈在这里也存在重大问题。我阅读了所有 Whosebug 文章以及我在互联网上找到的几乎所有内容。我 re-implemented 几乎找到了每一段代码。但对于我目前的情况,没有一块能按预期工作。对于其他轴上的其他运动,它是!
我尝试了以下方法:
- https://developers.google.com/project-tango/apis/java/reference/TangoPoseData.html#field-detail
- https://android.googlesource.com/platform/external/jmonkeyengine/+/master/engine/src/core/com/jme3/math/Quaternion.java (
toAngles()
)
- http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/
- .....(现在不在身边)
或者是否有另一种方法来确定机器人应用程序的旋转? (只是标题)。我唯一想要实现的是以预定义的角度(以度为单位)转弯。大多数时候我只想向右或向左转 (90°)。
如果有人能提供一段工作代码(针对 Google Project Tango 设备)将会很有帮助。已经失去了几天。对于其他 Android 设备,我很快就找到了解决方案。不排除设备存在其他重大BUG。
试试这个代码。请注意,计算的方向是相对于服务启动时的设备方向。
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)
));
我已经在机器人上横向安装了一个 Google Project Tango 设备,并希望从 onPoseAvailable()
事件侦听器获取标题。我知道框架 returns 中描述了一个四元数 API.
我尝试了很多将四元数转换为仅以度为单位的测量值。我唯一感兴趣的方向轴是 y
(https://developers.google.com/project-tango/overview/coordinate-systems#project_tango_coordinate_systems),它决定了我的机器人的航向。
我的第一个方法是使用 TYPE_ROTATION_VECTOR
、TYPE_GYROSCOPE
或 TYPE_ORIENTATION
(已删除)。但结果值无法使用。后来我读到 Tango 的磁传感器存在重大问题 (How to detect an absolute rotation of an android device)
这就是从探戈本身切换到姿势数据的原因。但这里也一样。要获得适当的结果要么是火箭科学,要么探戈在这里也存在重大问题。我阅读了所有 Whosebug 文章以及我在互联网上找到的几乎所有内容。我 re-implemented 几乎找到了每一段代码。但对于我目前的情况,没有一块能按预期工作。对于其他轴上的其他运动,它是!
我尝试了以下方法:
- https://developers.google.com/project-tango/apis/java/reference/TangoPoseData.html#field-detail
- https://android.googlesource.com/platform/external/jmonkeyengine/+/master/engine/src/core/com/jme3/math/Quaternion.java (
toAngles()
) - http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/
- .....(现在不在身边)
或者是否有另一种方法来确定机器人应用程序的旋转? (只是标题)。我唯一想要实现的是以预定义的角度(以度为单位)转弯。大多数时候我只想向右或向左转 (90°)。
如果有人能提供一段工作代码(针对 Google Project Tango 设备)将会很有帮助。已经失去了几天。对于其他 Android 设备,我很快就找到了解决方案。不排除设备存在其他重大BUG。
试试这个代码。请注意,计算的方向是相对于服务启动时的设备方向。
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)
));