我正在从Android设备获取原始传感器数据,以便在服务器端进行处理。我正在使用 HyperIMU 应用程序收集传感器数据并将其发送到服务器,以防万一有人希望看到它。 我对加速度计和旋转矢量数据特别感兴趣。为了估算设备的移动距离,我需要将加速度计的坐标系从设备坐标更改为地球坐标。
我知道我可以使用转换矩阵来更改协调系统。 而且我可以找到带有磁力计和重力数据的转换矩阵。
我在网上搜索时发现这是一个常见问题,但是我能找到的所有答案都是使用Android API中的getRotationMatrix()
方法和“旋转矢量传感器”进行设备侧处理的(因此,无需使用磁力计和重力数据)。由于服务器端没有此方法,我要做的就是自己实现。
通过这些链接:link1和link2了解到,来自Android的旋转矢量传感器是一种软件传感器,可提供四元数的3个坐标。
我从link中获悉,四元数通常是单位,因此我可以使用以下公式计算第4个元素: 对于 q =(a,b,c,d)
a = sqrt(b**2 + c**2 + d**2)
从这个link中学到,我可以通过以下方式计算旋转矩阵:
但是,当我最终将旋转矩阵与加速度计矢量相乘,以得到其在地球坐标系上的数据时。在将该值乘以时间的平方后,我没有得到任何接近期望值(距离)的东西。我已经进行了几次测试。
我有点迷失在代数中。 :(
我需要帮助修复我的代数并正确执行协调系统更改。另外,如果有人知道getRotationaMatrix()
方法的工作原理,将非常有帮助。
TL; DR:有人知道Android SensorManager方法中的getRotationaMatrix()
是如何工作的吗?
非常感谢!