首页 文章

Android TYPE_LINEAR_ACCELERATION传感器 - 它显示了什么?

提问于
浏览
34

我正在开发汽车加速跟踪应用程序 . 我使用标准加速度计,事先在特定位置校准 .

然后,假设手机的方向没有改变,我将加速度计数据记录了指定的时间并计算了移动参数,其中一个是测试结束时的汽车速度 .

它在一条平直的水平道路上工作得相当好:几个百分点的误差 .

但后来我发现,在API级别10中有一个名为 TYPE_LINEAR_ACCELERATION 的虚拟传感器,据我所知,它必须做我需要的:过滤重力,方向变化 - 所以我可以使用它并获得纯线性加速度移动设备

但在现实生活中......

我做了一个简单的应用程序,做了一点测试:

//public class Accelerometer implements SensorEventListener { ...
public void onSensorChanged(SensorEvent se) 
{
    if(!active)
        return;

    lastX = se.values[SensorManager.DATA_X];
    lastY = se.values[SensorManager.DATA_Y];
    lastZ = se.values[SensorManager.DATA_Z];
    long now = System.currentTimeMillis();
    interval = now - lastEvetn;
    lastEvetn = now;
    out.write(Float.toString(lastX) + ";" + 
                    Float.toString(lastY) + ";" + 
                    Float.toString(lastZ) + ";" + 
                    Long.toString(interval) + "\n");
}

我用以下参数绑定一个监听器:

mSensorManager.registerListener(linAcc,
                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                SensorManager.SENSOR_DELAY_GAME);

它工作正常,但是当我分析数据转储时,计算速度如 V = V0 + AT ,其中 V0 = 0 首先,然后 - 此前的间隔速度, A = acceleration (SQRT (x*x+y*y+z*z)) (t =间隔时间),最终我得到一个非常低的速度 - 比真正的速度 .

将传感器类型更改为 TYPE_ACCELEROMETER ,校准并使用相同的公式计算速度 - 我获得了良好的结果,更接近现实 .

所以,问题是:

Sensor.TYPE_LINEAR_ACCELERATION 真的显示了什么?

我错在哪里,或者 Sensor.TYPE_LINEAR_ACCELERATION 实施有什么问题?

我使用的是三星Nexus S手机 .

4 回答

  • 5

    非常有趣的问题!!!!

    我正在开发类似于你的应用程序的东西 . 我发现TYPE_LINEAR_ACCELERATION对我来说并不开心 .

    1)TYPE_LINEAR_ACCELERATION,TYPE_GRAVITY,ecc仅适用于Android 2.3(及以上)所以我有Android 2.2,我无法测试它们 .

    2)TYPE_LINEAR_ACCELERATION不是那么准确,因为当减去重力时存在一些简单的问题 . 事实上,这是一种“传感器融合”,它使用加速度计和方向来了解引力和引导的位置 . 它 .

    在这里,我找到了一个非常有用的答案来解释它:

    https://groups.google.com/forum/#!topic/android-developers/GOm9yhTFZaM

    TYPE_ACCELEROMETER使用加速度计,仅使用加速度计 . 它返回原始加速度计事件,最少或根本没有处理 . TYPE_GYROSCOPE(如果存在)使用陀螺仪而仅使用陀螺仪 . 如上所述,它返回原始事件(角速度un rad / s),根本没有处理(没有偏移/比例补偿) . 不推荐使用TYPE_ORIENTATION . 它将方向返回为偏航/俯仰/滚动的角度 . 它没有很好的定义,只有当设备没有“滚动”时才能依赖它 . 该传感器使用加速度计和磁力计的组合 . 使用SensorManager的助手可以获得更好的结果 . 该传感器经过大量“处理” . TYPE_LINEAR_ACCELERATION,TYPE_GRAVITY,TYPE_ROTATION_VECTOR是“融合”传感器,分别返回线性加速度,重力和旋转矢量(四元数) . 没有定义如何实现这些 . 在某些设备上,它们以h / w实现,在某些设备上,它们使用加速计,磁力计,在其他一些设备上,它们使用陀螺仪 . 在Nexus S和Xoom上,目前尚未使用陀螺仪 . 它们表现得好像没有陀螺仪,比如Nexus One或Droid . 我们计划在未来的版本中改善这种情况 . 目前,利用陀螺仪的唯一方法是使用TYPE_GYROSCOPE并手动整合输出 . Mathias,我希望这会有所帮助

    无论如何,在网络上的各个地方,我发现没有关于手机传感器和他们的潜力的最好的话,因为这是不准确的事实...

    使用卡尔曼滤波器可以达到更高的精度,但我不知道如何......

  • 20

    我意识到我的答案已经很晚了 . 我在寻找TYPE_LINEAR_ACCELERATION的一些信息时碰到了这个帖子 .

    做一个= sqrt(ax ^ 2 ay ^ 2 az ^ 2)然后做v = u at是不对的 . 只有当v和a处于完全相同的方向时,这才有效 . 任何偏差都会使错误加起来 . 加速度和速度是矢量,应该这样处理 . 你应该做vx = ux axt,vy = uy ayt和vz = uz azt . 然后v = sqrt(vx ^ 2 vy ^ 2 vz ^ 2) .

  • 3

    TYPE_LINEAR_ACCELERATION不显示来自传感器的“原始”数据,它显示由高频滤波器处理的数据,因此恒定加速度(如重力或任何其他缓慢变化的加速度)无法通过滤波器 .

    您的汽车具有相当恒定的加速度,无法通过过滤器 . 如果你改变你的加速非常快速按下制动器然后按下加速度计踏板然后再回到制动器,然后TYPE_LINEAR_ACCELERATION将显示非常正确的结果,否则它总是显示小于实际加速度值 .

    使用TYPE_ACCELEROMETER然后手动删除G(9.81) . 实际上,当实际加速度为0时你必须自己测量G,然后使用TYPE_ACCELEROMETER值作为G.在我的情况下它是9.6 .

    TYPE_ACCELEROMETER适用于快速变化的加速度,持续时间不到1秒,就像移动你的手模仿一个盒子或剑斗 .

  • 2

    TYPE_LINEAR_ACCELERATION是一个三维向量,表示沿每个设备轴的加速度,不包括重力 . TYPE_ACCELEROMETER = TYPE_GRAVITY TYPE_LINEAR_ACCELERATION

相关问题