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

Mae*_*aep 36 android sensor accelerometer

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

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

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

但后来我发现,在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");
}
Run Code Online (Sandbox Code Playgroud)

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

  mSensorManager.registerListener(linAcc,
                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                SensorManager.SENSOR_DELAY_GAME);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我分析数据转储时,计算速度,比如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手机.

Lor*_*ork 22

非常有趣的问题!!!!

我正在开发类似于你的应用程序的东西.我发现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并手动整合输出.

我希望这有帮助,

马蒂亚斯

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

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


小智 5

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

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

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

TYPE_ACCELEROMETER 适用于持续时间少于 1 秒的快速变化的加速度,例如模拟拳击或剑战的移动手。


sud*_*udP 5

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

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