如何用罗盘读数和陀螺仪读数获得手机的方位角?

Sib*_*ing 12 android sensor magnetometer gyroscope android-sensors

我希望通过以下方法获取手机当前的方向:

  1. 首先通过getRotationMatrix()和获取初始方向(方位角)getOrientation().
  2. 随着时间的推移添加陀螺仪读数的集成,以获得当前的方向.

电话介绍:

手机的xy平面与地平面固定.即,处于"发短信行走"的方向.

" getOrientation()"回归:

Android API允许我轻松获取方向,即方位角,俯仰,滚动,来自getOrientation().

注意,此方法始终返回其范围内的值:[0, -PI][o, PI].

我的问题:

由于陀螺仪读数的集成,表示为dR,可能相当大,所以当我这样做时CurrentOrientation += dR,CurrentOrientation可能超过[0, -PI][o, PI]范围.

需要什么样的操作,这样我总是能获得的内当前的方向[0, -PI][o, PI]范围?

我在Python中尝试了以下内容,但我非常怀疑它的正确性.

rotation = scipy.integrate.trapz(gyroSeries, timeSeries) # integration
if (headingDirection - rotation) < -np.pi:
    headingDirection += 2 * np.pi
elif (headingDirection - rotation) > np.pi:
    headingDirection -= 2 * np.pi
# Complementary Filter
headingDirection = ALPHA * (headingDirection - rotation) + (1 - ALPHA) * np.mean(azimuth[np.array(stepNo.tolist()) == i])
if headingDirection < -np.pi:
    headingDirection += 2 * np.pi
elif headingDirection > np.pi:
    headingDirection -= 2 * np.pi
Run Code Online (Sandbox Code Playgroud)

备注

这不是那么简单,因为它涉及以下麻烦制造者:

  1. 方位传感器读数是否从0-PI,然后直接跳转+PI逐渐回来,以0通过+PI/2.
  2. gyrocope阅读的整合也会带来一些麻烦.我应该添加dR方向还是减去dR.

在给出确认的答案之前,请先参考Android Documentations.

估计的答案无济于事.

Ali*_*Ali 8

方向传感器实际上从真实磁力计和加速度计获得其读数.

我想也许这就是混乱的根源.文档中说明了哪些内容?更重要的是,某处的文档是否明确说明陀螺仪读数被忽略了?据我所知,本视频中描述的方法已实施:

Android设备上的传感器融合:运动处理的革命

该方法使用陀螺仪并整合其读数.这几乎使问题的其余部分没有实际意义; 尽管如此,我会尽力回答.


方向传感器已经为您整合了陀螺读数,这就是您获得方向的方式.我不明白你为什么这样做.

你没有正确地整合陀螺仪读数,它比CurrentOrientation += dR(这是不正确的)更复杂.如果你需要集成陀螺仪读数(我不明白为什么,SensorManager已经为你做了)请阅读方向余弦矩阵IMU:理论如何正确地做(公式17).

不要尝试与欧拉角(也就是方位角,俯仰,滚动)集成,没有任何好处会出来.

请在计算中使用四元数或旋转矩阵而不是欧拉角.如果使用旋转矩阵,可以始终将它们转换为欧拉角,请参阅

由Gregory G. Slabaugh从旋转矩阵计算欧拉角

(对于四元数也是如此.)(在非退化情况下)有两种表示旋转的方法,即,您将获得两个欧拉角.选择您需要的范围内的那个.(万向锁定的情况下,有无限多的欧拉角,见上面的PDF).只是承诺在旋转矩阵到欧拉角度转换后,你不会再次在计算中开始使用欧拉角.

目前还不清楚你在使用互补滤波器做什么.您可以基于方向余弦矩阵IMU:理论手稿实现非常好的传感器融合,这基本上是一个教程.这样做并非易事,但我认为你不会找到比这篇手稿更好,更易理解的教程.

基于这个手稿实现传感器融合时,我必须发现自己的一件事就是可以发生所谓的积分饱和.我通过限制TotalCorrection(第27页)来照顾它.如果你实现这种传感器融合,你会明白我在说什么.



更新:在接受答案后,我回答您在评论中发布的问题.

我认为指南针通过使用重力和磁场给我当前的方向,对吧?陀螺仪是否在指南针中使用?

是的,如果手机或多或少静止至少半秒钟,您可以通过仅使用重力和指南针来获得良好的方向估计.以下是如何做到的:有人能告诉我重力传感器是否作为倾斜传感器来提高航向精度?

不,罗盘中没有使用陀螺仪.

能否请您解释为什么我所做的整合是错误的?据我所知,如果我的手机音高指向上,则欧拉角失败.但是我的整合还有什么问题吗?

有两个不相关的东西:(i)整合应该采用不同的方式,(ii)由于万向节锁定,欧拉角是麻烦的.我再说一遍,这两者是无关的.

至于集成:这里有一个简单的例子,说明如何实际看到集成有什么问题.设x和y为房间中水平面的轴.拿到手机.将手机围绕x轴(房间的)旋转45度,然后围绕y轴(房间的)旋转45度.然后,从头开始重复这些步骤,但现在先绕y轴旋转,然后绕x轴旋转.手机的方向完全不同.如果你按照你的方式进行整合,CurrentOrientation += dR你会看到没有区别!如果你想正确地进行整合,请阅读上面链接的方向余弦矩阵IMU:理论手稿.

至于欧拉角:他们搞砸了应用程序的稳定性,这足以让我不用它们在3D中进行任意旋转.

我仍然不明白你为什么要自己尝试,为什么你不想使用平台提供的方向估计.机会是,你不能做得更好.