java - Android线性加速,计算轨迹

标签 java android accelerometer physics

我想在车上使用加速度计,并根据加速度计值,在 Excel 或任何其他平台中绘制一条轨迹,其原点位于第一个位置值,即路径的起点。

我怎样才能实现这个目标?请给我详细信息,我没有任何物理概念。

请帮忙,提前致谢。

PS:我已经对 SensorListener 进行了编程...

例如,我有这个:

@Override
public void onSensorChanged(SensorEvent event){
    if(last_values != null){
        float dt = (event.timestamp - last_timestamp) * NS2S;
        for(int index = 0 ; index < 3 ; ++index){
            acceleration[index] = event.values[index];
            velocity[index] += (acceleration[index] + last_values[index])/2 * dt;
            position[index] += velocity[index] * dt;
        }
        vxarr.add(velocity[0]);
        vyarr.add(velocity[1]);
        vzarr.add(velocity[2]);
        axarr.add(acceleration[0]);
        ayarr.add(acceleration[1]);
        azarr.add(acceleration[2]);
    }
    else{
        last_values = new float[3];
        acceleration = 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;
    }
    xarr.add(position[0]);
    yarr.add(position[1]);
    zarr.add(position[2]);
    tvX.setText(String.valueOf(acceleration[0]));
    tvY.setText(String.valueOf(acceleration[1]));
    tvZ.setText(String.valueOf(acceleration[2]));
    last_timestamp = event.timestamp;
}

但是当我用手机画一个圆圈时,我得到了这个:

enter image description here

有时我只有负值,有时我只有正值,我从来没有为了圈子而同时拥有负值和正值。

最佳答案

加速度是速度对时间的导数(换句话说,速度的变化率);速度是位置对时间的导数。因此,加速度是位置的二阶导数。相反,位置是加速度的二阶反导数。您可以进行加速度计测量并随着时间的推移进行双重积分以获得轨迹的位置,但有两个问题除外:

1) 这是一个不定积分,即有无限多个解(例如 https://en.wikipedia.org/wiki/Antiderivative )。在这种情况下,这意味着您的测量结果无法告诉您任何有关初始速度的信息。但是您可以从 GPS(精度有限)或某种形式的用户输入中获取它(例如,假设当用户点击某个按钮开始计算轨迹时速度为零)。

2) 误差累积。假设任何给定方向上的加速度计误差 a = 0.01 m/s^2(根据我的手机粗略猜测)。在 t = 5 分钟内,误差为 a*t^2/2 = 450 米。

所以你无法获得非常准确的轨迹,尤其是在很长一段时间内。如果这对您来说并不重要,您也许可以使用其他答案中的代码,或者编写自己的代码等。但首先您需要认识到这种方法的非常严重的局限性。

关于java - Android线性加速,计算轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35412045/

相关文章:

java - 从函数生成常量表达式

java - 文本到语音功能在我的 ListView 中不起作用

python - 如何动态消除蓝牙加速度计的噪声?

java - 找不到 spring 类路径资源,因为它不存在

java - 在 Android 上使用 Teechart 制作动画

android - 使用 rawQuery 和 CursorAdapter 时如何关闭我的 Cursor

android - 通过聊天发送日历事件 (XMPP) Android

iphone - 陀螺仪与加速度计?

android - 初学者指南使用加速度计?

java - Java 是否像 C++ 那样具有未定义的行为?