首先通过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中进行任意旋转.
我仍然不明白你为什么试图自己做,为什么你不想使用平台提供的方向估计.有机会,你不能做得比那更好.