Android TYPE_LINEAR_ACCELERATION传感器 – 它显示了什么?
我正在开发汽车加速追踪应用程序。 我使用标准的加速度计,事先在特定的位置进行校准。
然后,假设手机的方向不变,我将加速计数据logging了一段指定的时间,并计算了移动参数,其中一个参数是testing结束时的车速。
它在一条平直的,横向的道路上工作得很好:几个百分点的错误。
但后来我发现,在API级别10中有一个名为TYPE_LINEAR_ACCELERATION
的虚拟传感器,据我所知,它必须做我所需要的:过滤引力,方向变化 – 所以我可以使用它,并获得纯粹的线性加速度的移动设备。
但在现实生活中..
我做了一个简单的应用程序,做了一个小testing:
//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 =时间间隔),最终我得到一个非常低的速度 – 比实际速度低三倍。
将传感器types更改为TYPE_ACCELEROMETER
,校准并使用相同的公式计算速度 – 我得到了很好的结果,更接近实际。
所以,问题是:
Sensor.TYPE_LINEAR_ACCELERATION
真的显示什么?
我在哪里错了,或者Sensor.TYPE_LINEAR_ACCELERATION
实现有什么问题?
我使用三星Nexus S手机。
非常有趣的问题!
我正在开发类似于你的应用程序的东西。 我发现TYPE_LINEAR_ACCELERATION对我来说并不开心。
1)TYPE_LINEAR_ACCELERATION,TYPE_GRAVITY,ECC只适用于Android 2.3(及以上)所以我有Android 2.2,我无法testing它们。
2)TYPE_LINEAR_ACCELERATION不是那么准确,因为在减less重力的时候有一些简单的问题。 事实上是一个“传感器融合”,使用加速度计和方向知道在哪里引导重力,然后潜艇。 它。
在这里我find了一个非常有用的答案来解释它:
https://groups.google.com/forum/#!topic/android-developers/GOm9yhTFZaM
TYPE_ACCELEROMETER使用加速度计,只使用加速度计。 它返回原始的加速度计事件,根本不需要处理。
TYPE_GYROSCOPE (如果存在)使用陀螺仪,只使用陀螺仪。 像上面一样,它返回原始事件(angular速度un rad / s),根本不处理(无偏移/尺度补偿)。
TYPE_ORIENTATION已弃用。 它以degar方式返回偏航/俯仰/滚转的方向。 它没有很好的定义,只能在设备没有“滚动”时才能使用。 该传感器使用加速度计和磁力计的组合。 使用SensorManager的帮助程序可以获得更好的结果。 这个传感器被严重“处理”。
TYPE_LINEAR_ACCELERATION,TYPE_GRAVITY,TYPE_ROTATION_VECTOR是分别返回线性加速度,重力和旋转向量(四元数)的“融合”传感器。 没有定义如何实施这些。 在一些设备上,它们以h / w实现,在某些设备上,他们使用加速度计+磁力计,在其他一些设备上使用陀螺仪。
在Nexus S和Xoom上,陀螺仪目前不使用。 他们的行为好像没有陀螺仪一样,像Nexus One或Droid。 我们正计划在未来的版本中改善这种情况。
目前,利用陀螺仪的唯一方法是使用TYPE_GYROSCOPE并手动整合输出。
我希望这有帮助,
马蒂亚斯
无论如何,在networking上的各个地方,我发现没有关于手机传感器和他们的潜力最好的词,由于事实不准确…
使用卡尔曼滤波器可以达到更高的精度,但我不知道如何…
我意识到我的答案很晚。 我在searchTYPE_LINEAR_ACCELERATION上的一些信息时碰到了这个线程。
做a = sqrt(ax ^ 2 + ay ^ 2 + az ^ 2)然后做v = u + a t是不对的。 只有当v和a在同一个方向时,这才会起作用。 而任何偏差都会使错误加起来。 加速度和速度是vector,应该这样对待。 你应该做vx = ux + ax t,vy = uy + ay t和vz = uz + az t。 然后v = sqrt(vx ^ 2 + vy ^ 2 + vz ^ 2)。
TYPE_LINEAR_ACCELERATION不显示来自传感器的“原始”数据,它显示的是由高频滤波器处理的数据,所以恒定加速度如重力或任何其他缓慢变化的加速度不能通过滤波器。
你的车有恒定的加速度,不能通过filter。 如果快速改变加速度,按下刹车,然后按下加速度计踏板,然后回到刹车,那么TYPE_LINEAR_ACCELERATION将显示非常正确的结果,否则它总是显示小于真实的加速度值。
使用TYPE_ACCELEROMETER,然后手动删除G(9.81)。 实际上,当真实加速度为0时,您必须自己测量G,然后使用TYPE_ACCELEROMETER值作为G.在我的情况下,它是9.6。
TYPE_ACCELEROMETER对于持续时间less于1秒的快速变化的加速是很好的,就像移动你的手来模拟一个盒子或剑的战斗一样。
TYPE_LINEAR_ACCELERATION是一个三维向量,表示沿着每个设备轴的加速度,不包括重力。 TYPE_ACCELEROMETER = TYPE_GRAVITY + TYPE_LINEAR_ACCELERATION