如何检测安卓设备的绝对旋转角度

3

我希望实现一个机器人,它可以在室内导航,并使用在安卓设备上运行的软件。其中一个必要功能是“实时”了解机器人的方向。

我有一个主要约束条件:安卓设备必须放置在重力轴上并具有屏幕(也就是说:垂直,就像使用设备上的相机拍照一样)

这使我无法使用最常见的参考角度测量方位角。因此,使用下列内容没有意义:

SensorManager.getRotationMatrixFromVector(mRotationMatrixFromVector, event.values);

然后。
SensorManager.getOrientation(mRotationMatrix, orientation);

由于 定位[0] 提供的方位角不一致。

我一直在搜索,但我没有找到任何可接受的解决方案。

“可接受的解决方案”是指系统在100毫秒内响应,并且精度接近5°。参考不一定是磁北极,但必须随时间稳定。可以是起始位置(但存在一些漂移问题...)

是否有其他类型的传感器比TYPE_ROTATION_VECTOR更适合此用途? 我尝试使用TYPE_GYROSCOPE但结果不佳...

我的Android设备是Google Tango平板电脑。

感谢任何帮助

2个回答

1
如果您只关心任何参考框架中的方位角信息,则 Tango 提供的信息是您想要的——具体来说,Tango.OnTangoUpdateListener.onPoseAvailable 提供了 TangoPoseData(在请求 COORDINATE_FRAME_AREA_DESCRIPTION、COORDINATE_FRAME_DEVICE 帧对后)。其中包含一个四元数,表示设备相对于区域描述参考框架的方向。 四元数基本上是旋转操作。 如果您在设备的框架中选择一个期望的向量(例如,指向屏幕外的向量),则四元数将使您将该向量旋转到区域描述(世界)参考框架中。 旋转后的向量是原始向量在世界中指向的方向,您可以通过取向量的两个水平分量的 atan2 来确定方位角。 有关 Tango 参考框架的更多信息,请参见 此处
这个问题应该也有一个更简单的答案。磁力计传感器应该能够提供平板电脑相对于地球磁场的绝对方向,而地球磁场大致指向北方--几乎任何Android设备都可以做到这一点。您可以从三个原始磁力计传感器值构建自己的方向,但Android提供了一种更方便的访问融合传感器的方法:Sensor.TYPE_ROTATION_VECTOR from SensorManager。然而, Tango平板电脑有一个软件问题,导致其磁力计无法工作;请参见here获取更多详细信息。真令人失望的是,一个专门设计用于导航的设备竟然没有确定其绝对方位的方法。
如果SensorManager的TYPE_ROTATION_VECTOR在Tango平板上有效,您可以使用SensorManager.getRotationMatrixFromVector从onSensorChanged返回的四元数中获取3x3旋转矩阵,然后使用SensorManager.getOrientation获取设备的“方位角”(如您在问题中所示)。但是,这种方法有些局限性,因为当平板电脑的屏幕朝上时,该方法会出现gimbal lock。如果您选择自己的向量并使用四元数将其旋转到世界坐标系中,然后基于三个坐标中的两个计算方位角,那么您就可以更具体地确定“方位角”的含义。

0

@Ben

感谢您的完整回答。

这解释了为什么我尝试从TYPE_ROTATION_VECTOR获取方位角在Tango平板上不成功(在其他设备上部署相同的代码运行良好)。

您建议的解决方案接近我通过浏览Tango库代码找到的解决方案:

float[] position = pose.getTranslationAsFloats(); Quaternion q = new Quaternion(pose.rotation[3], pose.rotation[0], pose.rotation[1], pose.rotation[2]); double currentRoll = Math.toDegrees(q.getRoll()); robotCommander.updateCoordonates(position[0], position[1], currentRoll);

X是position[0],Y是position[1],而currentRoll是机器人当前的方向。

我对这个解决方案有一些问题:

  • 这是一个相对的测量,第一次获得四元数时,currentRoll被设置为0,下一个角度是相对于原始位置的。 当我的机器人迷失时,我没有绝对的测量来重新定位。

  • 存在重要的漂移。 我还没有尝试使用区域描述文件(ADF)来运行我的代码:这是下一步(也可能对上一个问题有用)。

  • currentRoll从未达到180°(?)

  • 我不确定我的代码是否是使用姿态数据的正确方式。

你提到过“旋转向量是原始向量在世界中指向的方向,您可以通过取向量的两个水平组件的atan2来确定方位角”。您有任何指针或代码示例吗?

感谢任何帮助或建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接