gpt4 book ai didi

java - 集成 Android 加速度计以查找速度和位置

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:56 25 4
gpt4 key购买 nike

我正在尝试使用 Android 设备上的加速度计计算位移 (Sensor.TYPE_LINEAR_ACCELERATION)。这是我的 OnSensorChanged() 方法:

public void onSensorChanged(SensorEvent event) {
accelX = event.values[0];
accelY = event.values[1];
accelZ = event.values[2];

long currentTime = System.currentTimeMillis() / 1000;

if(prevTime == 0) prevTime = currentTime;

long interval = currentTime - prevTime;
prevTime = currentTime;

velX += accelX * interval;
velY += accelY * interval;
velZ += accelZ * interval;

distX += prevVelX + velX * interval;
distY += prevVelY + velY * interval;
distZ += prevVelZ + velZ * interval;

prevAccelX = accelX;
prevAccelY = accelY;
prevAccelZ = accelZ;

prevVelX = velX;
prevVelY = velY;
prevVelZ = velZ;
}

然而,速度在任何类型的移动后都不会返回到 0。除非非常突然,否则减速几乎没有影响。这会导致一些非常不准确的距离值。

加速度计也很吵,所以我添加了这个:

accelX = (accelX * accelKFactor) + prevAccelX * (1 - accelKFactor);
accelY = (accelY * accelKFactor) + prevAccelY * (1 - accelKFactor);
accelY = (accelX * accelKFactor) + prevAccelY * (1 - accelKFactor);

其中 accelKFactor = .01

我是否遗漏了一些明显的东西?

我的最终目标只是能够判断设备移动是否超过 ~10 英尺,但现在,我的数据几乎没有用。

编辑:

我发现了部分问题。 currentTime 很长,但我将以毫秒为单位的系统时间除以 1000 以获得秒数。所以速度只能真正每 1 秒更新一次。将 currentTime 更改为 double 会有所帮助,但并不能完全解决问题。

最佳答案

SensorEvent 有一个时间戳字段,它是以纳秒为单位的时间。使用它代替 System.currentTimeMillis()。这是文档中的示例:

private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;

public void onSensorChanged(SensorEvent event) {
// This timestep's delta rotation to be multiplied by the current rotation
// after computing it from the gyro sample data.
if (timestamp != 0) {
final float dT = (event.timestamp - timestamp) * NS2S;

以这种方式跟踪位移对初始条件极其敏感,因此这应该有所帮助。

此外,使用 Location.getSpeed() 可能会更好。如果您无法获得信号,请考虑仅将加速度计用作备用。

关于java - 集成 Android 加速度计以查找速度和位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443727/

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