gpt4 book ai didi

android - 如何在 Android 中使用 AcceleroMeter 正确计算线性加速度

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:27 25 4
gpt4 key购买 nike

令我最惊讶的是,在 Android 4.0+ 中,他们决定从可用的软件传感器中删除线性加速传感器,并将其放入硬件传感器中,这种陀螺仪在普通手机中很少见。我不知道他们为什么这样做,但想象一下当我交付在便宜的 2.3 手机上测试的软件时我的惊讶,并且在 2 个月大的手机上它显示无法实例化线性加速度传感器。他们为什么这样做?

为了挽救我的皮肤,我检查了手机中是否有加速度计,确实有。基于this article ,我应该能够使用加速度计的数据计算线性加速度。我检查了代码,发现一个没有可用声明的变量。

public void onSensorChanged(SensorEvent event){
// In this example, alpha is calculated as t / (t + dT),
// where t is the low-pass filter's time-constant and
// dT is the event delivery rate.

final float alpha = 0.8;
float[] gravity=new float[]{0.0f,0.0f,0.0f}; //should it be here???

// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

// Remove the gravity contribution with the high-pass filter.
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}

重力阵列在第一次运行中包含什么?我应该添加它吗

float[] gravity=new float[]{0.0f,0.0f,0.0f};

?

或者它应该包含通过重力传感器可用的真实重力数据(在常规设备中也不可用)?

计算结果是否正确的线加速度数据?是否可以仅通过从传入的传感器数据中减去一个数字来计算?

最佳答案

实际上,该文档提供的代码 fragment 中所做的是,它们从加速度计(包含重力和线性加速度)中获取数据并对其进行过滤。所以它基本上是如何工作的,我们获取原始数据并假设重力矢量是恒定的并且不能很快变化,这与线性加速度相反,线性加速度变化非常快。因此,假设我们采用过去计算的 80% 的重力矢量并添加 20% 的原始数据,我们过滤快速线性加速度峰值并获得重力矢量。如果我们从原始数据中移除重力矢量,我们将得到没有重力的线性加速度。 Google for exponential filter 了解更多信息。在这里你可以玩它http://copterpilot.ru/custom-app/exponential/ .因此,您可以轻松地用零初始化全局重力 float 组,并稍等片刻以获取过滤后的数据。这是代码 fragment

public class MainActivity extends AppCompatActivity implements SensorEventListener {
private float[] gravity = new float[3];
private float[] linear_acceleration = new float[3];

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
public void onSensorChanged(SensorEvent event) {
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate

final float alpha = 0.8f;

gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
}

关于android - 如何在 Android 中使用 AcceleroMeter 正确计算线性加速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20935587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com