android - 使用加速度计读取 android 手机的 x y z 坐标

标签 android accelerometer android-2.3-gingerbread

我打算开发一个需要读取手机在 3D 空间上的 x,y,z 坐标的 Android 应用程序。

我想写一个简单的代码并在设备上测试..

我在设备和模拟器上都使用 Gingerbread 。

最佳答案

要从加速度中获取位置,您需要对其进行两次积分。

积分加速度为您提供速度,积分速度为您提供位置。

请记住,集成噪声会产生漂移,而集成漂移会产生大量漂移,Android 传感器往往会产生大量噪声。

在我的 Galaxy S3 上,我已经能够使用 Google 的线性加速度计复合传感器在 5 秒内将位置漂移降低到 0.02 m。

我不确定您是否可以在 Gingerbread 上使用线性加速度计传感器。如果不能,则必须在积分之前消除重力。

如果您还没有,请在此处阅读所有内容 http://developer.android.com/guide/topics/sensors/sensors_motion.html

关于 android 中的运动传感器的精彩演讲

http://www.youtube.com/watch?v=C7JQ7Rpwn2k

代码:

static final float NS2S = 1.0f / 1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
long last_timestamp = 0;

@Override
public void onSensorChanged(SensorEvent event) {
    if(last_values != null){
        float dt = (event.timestamp - last_timestamp) * NS2S;

        for(int index = 0; index < 3;++index){
            velocity[index] += (event.values[index] + last_values[index])/2 * dt;
            position[index] += velocity[index] * dt;
        }
    }
    else{
        last_values = new float[3];
        velocity = new float[3];
        position = new float[3];
        velocity[0] = velocity[1] = velocity[2] = 0f;
        position[0] = position[1] = position[2] = 0f;
    }
    System.arraycopy(event.values, 0, last_values, 0, 3);
    last_timestamp = event.timestamp;
}

现在您有了 3d 空间中的位置,请记住它假定手机在开始采样时是静止的。

如果你不消除重力,它很快就会很远。

这根本不会过滤数据,会产生很多漂移。

关于android - 使用加速度计读取 android 手机的 x y z 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11068671/

相关文章:

android - 使用 SuperSLiM 库检测 RecyclerView 的 GridLayoutManager 滚动结束

python - 从 Python 上的 IMU 传感器获取 3D 位置坐标

javascript - 在 html5 移动设备中检测晃动

android - "Unable to open log device '/dev/log/main ': No such file or directory"

android - 使用 SSL 自签名证书连接到 HTTPS 站点的步骤是什么?

java - Android 中滑动刷新后如何保留 UI 更改

java - 以编程方式发送 Whatsapp 消息到特定号码

java - 如何在 Android 滑动标签中使用 ListFragment?

iphone - 为什么我的 iOS 事件以错误的顺序触发?

android - 开源安卓启动器列表