我正在开发汽车加速跟踪应用程序。我用的是标准加速度计,事先在特定位置进行了校准。
然后,假设手机的方向没有改变,我记录了指定时间的加速计数据,并计算出移动参数,其中之一是测试结束时的车速。
它在一条笔直的水平道路上工作得相当好:误差只有几个百分点。
但后来我发现,在API-level 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手机。
发布于 2011-11-04 16:54:39
非常有趣的问题!
我正在开发一些类似于你的应用程序的东西。我对TYPE_LINEAR_ACCELERATION的发现并不让我高兴。
1) TYPE_LINEAR_ACCELERATION,TYPE_GRAVITY,ecc只在Android2.3(和更高版本)上实现,所以我有Android2.2,我不能测试它们。
2) TYPE_LINEAR_ACCELERATION并不像它应该的那样准确,因为在减去重力时存在一些简单的问题。事实上,这是一种“传感器融合”,它使用加速计和方位来知道重力指向哪里,然后潜水。它。
在这里,我找到了一个非常有用的答案来解释它:
https://groups.google.com/forum/#!topic/android-developers/GOm9yhTFZaM
TYPE_ACCELEROMETER使用加速度计,并且仅使用加速度计。它返回原始的加速计事件,只有很少的处理,甚至根本没有处理。
TYPE_GYROSCOPE (如果存在)使用陀螺仪,并且仅使用陀螺仪。与上面一样,它返回原始事件(角速度/ rad/s),根本不进行任何处理(没有偏移/刻度补偿)。
TYPE_ORIENTATION已弃用。它以偏航/俯仰/滚动度为单位返回方向。它的定义不是很好,只有当设备没有“滚动”时才能被依赖。该传感器使用加速度计和磁力计的组合。使用SensorManager的帮助器可以获得稍微更好的结果。这个传感器被严重“处理”了。
TYPE_LINEAR_ACCELERATION,TYPE_GRAVITY,TYPE_ROTATION_VECTOR是“融合”的传感器,分别返回线性加速度,重力和旋转向量(一个四元数)。没有定义这些是如何实现的。在一些设备上,它们以硬件实现,在一些设备上,它们使用加速计+磁强计,在其他设备上,它们使用陀螺仪。
在Nexus S和Xoom上,当前未使用陀螺仪。它们的表现就像没有陀螺仪可用一样,就像Nexus One或Droid一样。我们计划在未来的版本中改善这种情况。
目前,利用陀螺仪的唯一方法是使用TYPE_GYROSCOPE并手动积分输出。
我希望这能帮到你,
马蒂亚斯
无论如何,在网络上的许多地方,我没有找到关于手机传感器及其潜力的最佳词语,因为事实是不准确的……
使用卡尔曼滤波器可以达到更高的精度,但我不知道如何...
发布于 2015-11-14 19:27:41
我意识到我的回答来得太晚了。我在搜索TYPE_LINEAR_ACCELERATION上的一些信息时遇到了这个帖子。
先做a= 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)。
发布于 2015-06-29 02:07:34
TYPE_LINEAR_ACCELERATION不显示来自传感器的“原始”数据,它显示经过高频滤波器处理的数据,因此像重力这样的恒定加速度或任何其他缓慢变化的加速度都无法通过滤波器。
你的车有非常恒定的加速度,不能通过过滤器。如果您非常快地更改您的加速度按下刹车,然后按下加速度计踏板,然后回到刹车,那么TYPE_LINEAR_ACCELERATION将显示相当正确的结果,否则它总是显示小于实际的加速值。
使用TYPE_ACCELEROMETER,然后手动删除G (9.81)。实际上,当实际加速度为0时,你必须自己测量G,然后使用TYPE_ACCELEROMETER值作为G,在我的例子中是9.6。
TYPE_ACCELEROMETER很适合快速变化的加速度,持续时间不到1秒,比如移动你的手,模仿盒子或击剑。
https://stackoverflow.com/questions/7858759
复制相似问题