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

时间:2011-10-22 10:07:09

标签: android accelerometer sensor

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

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

在直线水平道路上运行得相当好:几个百分点的错误。

然后我发现,在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手机。

6 个答案:

答案 0 :(得分:20)

非常有趣的问题!!!!

我正在开发类似于您的应用程序的东西。我发现有关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

无论如何,在网络上的各个地方,我发现没有关于手机传感器及其潜力的最佳消息,因为它们不准确...

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

答案 1 :(得分: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)。

答案 2 :(得分:4)

TYPE_LINEAR_ACCELERATION没有显示" raw"来自传感器的数据,它显示由高频滤波器处理的数据,因此像重力或任何其他缓慢变化的加速度的恒定加速度不能通过滤波器。

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

您应该将从TYPE_LINEAR_ACCELERATION获得的绝对矢量乘以TYPE_ROTATION_VECTOR的反矩阵。

答案 5 :(得分:0)

正如@thxmxx所说,TYPE_LINEAR_ACCELERATION向量在设备坐标系中给出。因此,要估算惯性(世界)坐标系中的速度,需要在集成之前按估算的设备方向旋转。

但是,即使您这样做,估计的速度也不会长期保持准确。假设您的加速度估算在设备x轴上始终偏离0.1 m / s ^ 2。这大约是重力加速度的1/100-与设备要测量的加速度大小相比,这是一个很小的误差。然后,在静止不动十秒钟后,您在设备x轴上的速度估算值将为1 m / s。

即使是很小的错误也会累加成大错误。如果您进一步整合速度估算值以形成位置估算值,则错误会更快地复合。

要获得可靠的速度估算值,您需要:

  • 一种测量速度的传感器,例如飞机上的皮托管/静态系统或汽车上的车轮里程表。
  • 用于测量位置的传感器(例如GPS,LIDAR或基于视觉的SLAM),以及一种传感器融合算法,其使用随时间变化的位置估计序列来校正速度估计中的漂移。
  • 一种非常精确的IMU,类似于导弹中使用的类型。

第二个选项对于基于电话的应用程序最有用。