实际上 姿态传感器 Sensor.TYPE_ORIENTATION 的值并非为直接的 与水平面的夹角 所以不能直接这样使用三角函数计算重力加速度在Android文档中 建议使用高通滤波来除去的重力的影响It should be apparent that in order to measure the real acceleration of the device, the contribution of the force of gravity must be eliminated. This can be achieved by applying a high-pass filter. Conversely, a low-pass filter can be used to isolate the force of gravity. 很明显,为了测量设备的实际加速度,必须消除重力的影响。这可以用过高通滤波器来实现。相反的,低通滤波器和一用来分离重力。 相应的代码如下: public void onSensorChanged(SensorEvent event) { // alpha is calculated as t / (t + dT) // with t, the low-pass filter's time-constant // and dT, the event delivery rate final float alpha = 0.8; gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; }
很明显,为了测量设备的实际加速度,必须消除重力的影响。这可以用过高通滤波器来实现。相反的,低通滤波器和一用来分离重力。
相应的代码如下:
public void onSensorChanged(SensorEvent event)
{
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate final float alpha = 0.8; gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
多谢前辈,再请问这个gravity[0]是指由gravity传感器收集到的数据吗?
所谓低通滤波 是指只有低频信号可以通过的装置或者处理过程
因为重力只有在设备旋转的时候会发生变化 因此一定是低频信号
通过对传感器三轴的测量值进行低通滤波 可以获得重力在各个轴上的分量
然后再在三轴测量值上减去重力的分量 即可获得设备实际的加速度值alpha是滤波参数 可以根据需要进行更改
event.values 是传感器收集到数据
gravity 是重力加速度在三轴上的分量
linear_acceleration 是三轴线性加速度
所谓低通滤波 是指只有低频信号可以通过的装置或者处理过程
因为重力只有在设备旋转的时候会发生变化 因此一定是低频信号
通过对传感器三轴的测量值进行低通滤波 可以获得重力在各个轴上的分量
然后再在三轴测量值上减去重力的分量 即可获得设备实际的加速度值alpha是滤波参数 可以根据需要进行更改
event.values 是传感器收集到数据
gravity 是重力加速度在三轴上的分量
linear_acceleration 是三轴线性加速度
这个阈值应该会比较小才对
这个阈值应该会比较小才对
如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了
如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和
你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应
这个阈值应该会比较小才对
如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了
如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和
这个阈值应该会比较小才对
如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了
如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和还有一个问题,我在debug的时候,一开始Z轴的加速度很大,将近10,受重力加速度的影响。这个怎么解决呢
// 用低通滤波器分离出重力加速度
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];gravity 是重力加速度在三轴上的分量
linear_acceleration 是三轴线性加速度gravity怎样求出来?
多谢前辈,再请问这个gravity[0]是指由gravity传感器收集到的数据吗?请问这样算下来,gravity永远等于event.values,那这样获得的加速度岂不是永远等于0