gpt4 book ai didi

android - 线性加速方向跟踪手机上下运动

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

我试图仅在垂直方向上跟踪设备的运动,即向上和向下运动。这应该与设备的方向无关。我已经知道或尝试过的是这些

  1. 线性加速度由传感器 TYPE_LINEAR_ACCELERATION 给出,轴是手机轴,因此跟踪任何特定轴都不会产生影响。

  2. 我尝试应用旋转矢量的转置或反转(旋转矢量的反转或转置相同),然后尝试跟踪线性加速度矢量的 z 方向。似乎没有帮助。

  3. 我正在尝试使用重力值 (TYPE_GRAVITY) 进行点积以获得加速度的方向,但它似乎很容易出错。即使我快速向上移动我的设备,它也会显示下降。

我会在这里概述这个方法

dotProduct = vectorA[0]*vectorB[0]+vectorA[1]*vectorB[1] + vectorA[2]*vectorB[2];    
cosineVal = dotProduct/(|vectorA|*|vectorB|)
if(cosineVal > 0 ) down else Up.

这个方法有什么缺陷?请帮忙,我已经坚持了一段时间了。

最佳答案

正如我所看到的,在第三种方法中,您试图找到两个向量(重力向量和加速度向量)之间的角度的余弦值。这个想法是,如果角度接近 180 度,则向上运动,如果角度接近 0 度,则向下运动。余弦是当角度从-90 度到 90 度时具有正值的函数。因此,当您的 cosineVal 值为正时,这意味着手机正在下降,即使接近 1 的 cosineVal 移动是直线下降。所以反之亦然。当余弦为负(从 90 度到 270 度)时,你有向上运动。

可能您可以从 https://developer.android.com/reference/android/hardware/SensorEvent.html#valuesSensor.TYPE_ACCELEROMETER 获取矢量那里有重力矢量和加速度矢量。
我在下面制作了一个代码 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];

float scalarProduct = gravity[0] * linear_acceleration[0] +
gravity[1] * linear_acceleration[1] +
gravity[2] * linear_acceleration[2];
float gravityVectorLength = (float) Math.sqrt(gravity[0] * gravity[0] +
gravity[1] * gravity[1] + gravity[2] * gravity[2]);
float lianearAccVectorLength = (float) Math.sqrt(linear_acceleration[0] * linear_acceleration[0] +
linear_acceleration[1] * linear_acceleration[1] + linear_acceleration[2] * linear_acceleration[2]);

float cosVectorAngle = scalarProduct / (gravityVectorLength * lianearAccVectorLength);

TextView tv = (TextView) findViewById(R.id.tv);
if (lianearAccVectorLength > 2) {//increase to detect only bigger accelerations, decrease to make detection more sensitive but noisy
if (cosVectorAngle > 0.5) {
tv.setText("Down");
} else if (cosVectorAngle < -0.5) {
tv.setText("Up");
}
}
}

@Override
public void onAccuracyChanged(Sensor sensor, int i) {

}
}

关于android - 线性加速方向跟踪手机上下运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26155639/

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