Android 安卓传感器旋转度

Android 安卓传感器旋转度,android,math,sensors,Android,Math,Sensors,我使用TYPE_磁场/TYPE_加速计传感器基本上创建了一个罗盘 我调用getRotationMatrix,然后remapCoordinationSystem(始终为横向)来交换轴,然后调用getOrientation,然后取当前需要的轴索引0,然后调用Degrees,然后将其设置为0-360范围 val=(val+360)%360 现在一切都很好,除了它的波动有点大,所以我去了搜索之神(谷歌)和查找低通滤波器有分配,大多数不工作,但我发现一个几乎工作 newval=oldVal+ALPHA*(

我使用TYPE_磁场/TYPE_加速计传感器基本上创建了一个罗盘

我调用getRotationMatrix,然后remapCoordinationSystem(始终为横向)来交换轴,然后调用getOrientation,然后取当前需要的轴索引0,然后调用Degrees,然后将其设置为0-360范围

val=(val+360)%360

现在一切都很好,除了它的波动有点大,所以我去了搜索之神(谷歌)和查找低通滤波器有分配,大多数不工作,但我发现一个几乎工作

newval=oldVal+ALPHA*(newval-oldVal)

α约为0.2-0.5

所以现在在180(-180旋转),它很快跳到0,然后转到181(-179旋转),但是如果我移除过滤器,它不会这样做

过滤器可能有什么问题,或者如何修复

Android 2.2所以没有线性加速或定向(不推荐)


谢谢你的问题,方向角是周期性的。180度旋转与-180度(如前所述)也与540度等相同。因此,虽然低通滤波器的算法没有改变,但您需要的数字字段必须是周期性的,才能给出正确的答案。给你一个旋转矩阵,表示你的方向,这些矩阵构成了一个完美的数字系统。因此,如果您对旋转矩阵执行所有过滤算法,然后在最后一分钟仅转换为角度,则过滤器将正常工作。

您遇到的问题是方向角是周期性的。180度旋转与-180度(如前所述)也与540度等相同。因此,虽然低通滤波器的算法没有改变,但您需要的数字字段必须是周期性的,才能给出正确的答案。给你一个旋转矩阵,表示你的方向,这些矩阵构成了一个完美的数字系统。因此,如果您在旋转矩阵上执行所有滤波算法,然后在最后一分钟仅转换为角度,则滤波器将正常工作。

当遇到此类问题时,记录输入到滤波器的样本以及包含问题的一段时间内的滤波器输出可能会提供信息。将结果格式化为一个表并仔细考虑它可能会帮助您了解这是一个wraparound问题,还是真正的野生采样数据问题。修复它可能是一个更大的挑战。。。此外,对于思考问题,您可能会发现电子表格对于提出“如果……会怎样”的场景非常有用。您好。我将它添加到excel中,并绘制了一个图表,这就是我如何确定它在180后跳到0的。我甚至把它画在白板上,但我还是看不懂。首先我认为这是因为小数点弄乱了它。。。谢谢当输入稍微旋转超过180度时,输入值是多少?180后的下一个预期值是多少?如果180和-180是相等的(我不是说它们是相等的,因为我最近没有看过文档),那么问题是过滤器会将这两个值平均为零。sh@t为什么我没有想到(最后一句)。那可能是有道理的,谢谢你会看的。盯着这段代码看了一周,现在错过了一些愚蠢的事情……当面对这样的问题时,记录输入到过滤器的样本和过滤器在一段时间内的输出(包括问题)可能是有用的。将结果格式化为一个表并仔细考虑它可能会帮助您了解这是一个wraparound问题,还是真正的野生采样数据问题。修复它可能是一个更大的挑战。。。此外,对于思考问题,您可能会发现电子表格对于提出“如果……会怎样”的场景非常有用。您好。我将它添加到excel中,并绘制了一个图表,这就是我如何确定它在180后跳到0的。我甚至把它画在白板上,但我还是看不懂。首先我认为这是因为小数点弄乱了它。。。谢谢当输入稍微旋转超过180度时,输入值是多少?180后的下一个预期值是多少?如果180和-180是相等的(我不是说它们是相等的,因为我最近没有看过文档),那么问题是过滤器会将这两个值平均为零。sh@t为什么我没有想到(最后一句)。那可能是有道理的,谢谢你会看的。盯着这个代码看了一个星期现在错过了一些愚蠢的事情。。。