C# 线性加速度传感器值随倾斜变化而急剧变化,但不随移动而变化

C# 线性加速度传感器值随倾斜变化而急剧变化,但不随移动而变化,c#,android,sensors,android-sensors,C#,Android,Sensors,Android Sensors,我的线性加速传感器的动作非常奇怪。即使我跑,停,跑,走,跑,停,走。。。在我的手机上,传感器对低于0.1的值几乎没有反应。但当我稍微改变手机的角度(倾斜)时,当我的手移动时,数值有时会变成3、4甚至5。我检查了我的加速计,它显示了在所有三个正轴上的近似引力(如9.7),在负轴上的引力稍强一点(如-10 m/s^2)。因此,它可能正在发挥作用。我想不出是怎么回事。 例如,当我将Y轴上的所有线性加速度传感器值添加到OnSensorChanged函数(如v=v+e.values[1];)上的变量时,它

我的线性加速传感器的动作非常奇怪。即使我跑,停,跑,走,跑,停,走。。。在我的手机上,传感器对低于0.1的值几乎没有反应。但当我稍微改变手机的角度(倾斜)时,当我的手移动时,数值有时会变成3、4甚至5。我检查了我的加速计,它显示了在所有三个正轴上的近似引力(如9.7),在负轴上的引力稍强一点(如-10 m/s^2)。因此,它可能正在发挥作用。我想不出是怎么回事。 例如,当我将Y轴上的所有线性加速度传感器值添加到OnSensorChanged函数(如
v=v+e.values[1];
)上的变量时,它从0开始并保持在其周围,当我将倾斜度更改为90°时,它显示的值类似于30并保持在其周围。任何帮助都将不胜感激。提前谢谢!基本上,我将每次传感器变化时水平落下的所有加速度相加,然后平均每0.1秒取一次。如果它大于我的阈值,即0.1 m/s^2,我将其添加到我的速度中,但随着我的问题的出现,我的速度几乎没有改变,当我跑,停,跑,走,跑,停,走。。。但当我改变手中手机的倾斜角度时,它会改变2-5个点。 这是我的密码:

    public void OnSensorChanged( SensorEvent e )
    {
        TextView textview2 = FindViewById<TextView>( Resource.Id.textView2 );
        TextView textview1 = FindViewById<TextView>( Resource.Id.textView1 );
        double aci = 0;
        lock( syncLock )
        {
            if( e.Sensor.Type==SensorType.Accelerometer )
            {
                aci = Math.Atan2( e.Values[ 1 ] , e.Values[ 2 ] );
                textview1.Text = "Phone tilt : " + ((int)( ( Math.Atan2( e.Values[ 1 ] , e.Values[ 2 ] ) ) * 180 / Math.PI )).ToString() + " °";
            }
            if( e.Sensor.Type==SensorType.LinearAcceleration )
            {
                ivme = ivme + e.Values[1]* Math.Cos( aci )+e.Values[2]*Math.Sin(aci);
                counta++;
                textview2.Text = "Linear acceleration : " + ((int)( e.Values[ 1 ] * Math.Cos( aci ) + e.Values[ 2 ] * Math.Sin( aci ) )).ToString();
            }
        }
    }

    private void yapbisiler( object sender , ElapsedEventArgs e )
    {
        if( counta != 0 )
        {
            if( Math.Abs( ivme/counta ) > 0.1 )
            {
                velocity = velocity + (ivme/counta) * 0.1;
                RunOnUiThread( () => {
                    TextView textview3 = FindViewById<TextView>( Resource.Id.textView3 );
                    textview3.Text = "Speed : "+ (int)velocity + " meters/second";
                } );
            }
        }
        if( Math.Abs(velocity) >0.1 )
        {
            displacement = displacement + velocity * 0.1; 
        }
        RunOnUiThread( () => {
            TextView textview4 = FindViewById<TextView>( Resource.Id.textView4 );
            textview4.Text = "Displacement : " + (int)displacement + " meters";
        } );
        counta = 0;
        ivme = 0;
    }

}100ms的间隔似乎很大。尝试1毫秒(0.001秒)。注意
试图用加速计计算速度是一个挑战。看看这个

通过加速度计的数据计算速度起初似乎是个好主意(我也这么认为),但实际上由于传感器的准确性,它要复杂得多,问题也大得多。我建议阅读,以便对这个话题有一个很好的介绍。(这让我对此事有了更现实的看法)
t.Interval = 100;
t.Elapsed += yapbisiler;
t.Start();

sensorManager = ( SensorManager )GetSystemService( SensorService );