android – 如何使用罗盘读数和陀螺仪读数获取手机的方位角?

前端之家收集整理的这篇文章主要介绍了android – 如何使用罗盘读数和陀螺仪读数获取手机的方位角?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望通过以下方法获取手机的当前方向:

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

电话方向:

手机的x-y平面与地面平面固定.即,处于“走时的发短信”方向.

“getOrientation()”返回:

Android API允许我从getOrientation()方便地找到方位,即方位角,俯仰角,滚动角度.

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

我的问题:

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

需要什么操作,以便始终可以在[0,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

备注

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

>方向传感器读数从0到-PI,然后直接JUMPS到PI,并通过PI / 2逐渐恢复为0.
陀螺仪阅读的整合也会导致一些麻烦.我应该将dR添加到方向还是减去dR.

在给出确认答复之前,请先参考Android文档.

估计答案将无济于事.

解决方法

The orientation sensor actually derives its readings from the real magnetometer and the accelerometer.

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

Sensor Fusion on Android Devices: A Revolution in Motion Processing

方法使用陀螺仪并整合读数.这几乎使得剩下的问题成为可能;不过我会尽力回答.

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

您没有正确地进行陀螺仪读数的整合,比CurrentOrientation = dR(这是不正确的)更复杂.如果您需要集成陀螺仪读数(我不明白为什么,SensorManager已经为您做了),请阅读Direction Cosine Matrix IMU: Theory如何正确执行(公式17).

不要尝试与欧拉角(也称为方位角,卷轴)集成,没有什么好的出现.

请在计算中使用四元数或旋转矩阵,而不是欧拉角.如果您使用旋转矩阵,您可以随时将其转换为欧拉角,参见

Computing Euler angles from a rotation matrix by Gregory G. Slabaugh

(对于四元数也是如此).(在非分解的情况下)有两种表示旋转的方式,即您将得到两个欧拉角.选择所需范围内的那个. (在gimbal lock的情况下,欧拉角度无限多,参见上面的PDF).只是承诺,在旋转矩阵到欧拉角度转换后,您的计算中不会再次使用欧拉角.

目前还不清楚您正在使用补充过滤器.您可以基于Direction Cosine Matrix IMU: Theory手稿实现一个非常好的传感器融合,这基本上是一个教程.这不是微不足道的,但我不认为你会发现一个比这个手稿更好,更容易理解的教程.

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

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

I think the compass gives me my current orientation by using gravity and magnetic field,right? Is gyroscope used in the compass?

是的,如果手机或多或少固定至少半秒钟,您可以使用重力和指南针获得良好的方向估计.这是怎么做的:Can anyone tell me whether gravity sensor is as a tilt sensor to improve heading accuracy?

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

Could you please kindly explain why the integration done by me is wrong? I understand that if my phone’s pitch points up,euler angle fails. But any other things wrong with my integration?

有两个无关的事情:(i)整合应该是不同的,(ii)由于万向节锁,欧拉角是麻烦的.我重申,这两个是无关的.

对于集成:这里是一个简单的例子,你可以如何看到你的集成有什么问题.让x和y是房间里水平面的轴.在手中拿电话.将手机围绕x轴(房间)旋转45度,然后围绕y轴(房间)旋转45度.然后,从头开始重复这些步骤,但是现在首先围绕y轴旋转,然后围绕x轴旋转.手机的方向完全不一样.如果根据CurrentOrientation = dR进行整合,您将看到没有区别!请阅读上述链接的方向余弦矩阵IMU:理论手稿,如果您想要正确地进行整合.

对于欧拉角度:它们打破了应用程序的稳定性,这对我来说不足以在3D中进行任意旋转.

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

猜你在找的Android相关文章