我正在尝试从SensorManager获取的传感器数据中构建加权平均值。 我的问题是,轴承,俯仰和滚动具有最大值,当我正好在这一点时,值从0到359或向后交换。 我的平均值目前仅仅是所有值的加法和一个除以值的数量。
假设我得到了值:1,359,350,10 在这种情况下,我希望平均值为0.我如何更改方程式才能获得此功能?
我是否必须检查到0/360的“最近”距离并使用此值而不是实际值?
如果我的值大约为180,这也会带来一些麻烦:
160,200 - >平均值必须是180,但是我的最近距离的想法是160,因为200 + 160 = 360。
我该如何解决这个问题?
编辑:这是我从SensorManager获得的值。
Edit2:抱歉,我忘了提到我使用的是加权平均值:
double sum = 0;
for int i = 0; i < max; i++
sum += value[i] * (i / (triangular_number(max))
return sum
答案 0 :(得分:1)
我发现了一个blog post。
简要总结一下:您必须计算所有aizmuth值的正弦值和aizmuth值的余弦的平均值,然后将这些平均值放在atan2函数中,然后在必要时使结果为正通过添加2 * PI。不要忘记将度数值转换为弧度,反之亦然。
答案 1 :(得分:1)
要计算角度的平均值,请使用以下
public static final float averageAngle(float[] terms, int totalTerm)
{
float sumSin = 0;
float sumCos = 0;
for (int i = 0; i < totalTerm; i++)
{
sumSin += Math.sin(terms[i]);
sumCos += Math.cos(terms[i]);
}
return (float) Math.atan2(sumSin / totalTerm, sumCos / totalTerm);
}