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

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

概述我希望通过以下方法获取手机的当前方向: 首先通过getRotationMatrix()和getOrientation()获取初始方向(方位角). >随着时间的推移增加陀螺仪读数的集成,以获得当前的方向. 电话方向: 手机的x-y平面与地面平面固定.即,处于“走时的发短信”方向. “getOrientation()”返回: Android API允许我从getOrientation()方便地找到方位 我希望通过以下方法获取手机的当前方向:

首先通过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) # integrationif (headingDirection - rotation) < -np.pi:    headingDirection += 2 * np.pielif (headingDirection - rotation) > np.pi:    headingDirection -= 2 * np.pi# Complementary FilterheadingDirection = Alpha * (headingDirection - rotation) + (1 - Alpha) * np.mean(azimuth[np.array(stepNo.toList()) == i])if headingDirection < -np.pi:    headingDirection += 2 * np.pielif 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 – 如何使用罗盘读数和陀螺仪读数获取手机的方位角?全部内容,希望文章能够帮你解决android – 如何使用罗盘读数和陀螺仪读数获取手机的方位角?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1132642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存