最近我进行了一些研究,使用加速度计和陀螺仪来跟踪智能手机,而不需要GPS的帮助(请参见此帖子)基于陀螺仪和加速度计的室内定位系统
为此,我需要我的方向(角度(俯仰,横滚等)),所以这是我迄今为止所做的:
public void onSensorChanged(SensorEvent arg0) {
if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
accel[0] = arg0.values[0];
accel[1] = arg0.values[1];
accel[2] = arg0.values[2];
pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2))));
tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll);
} else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE )
{
if (timestamp != 0) {
final float dT = (arg0.timestamp - timestamp) * NS2S;
angle[0] += arg0.values[0] * dT;
filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch);
}
timestamp = arg0.timestamp;
}
}
在这里,我正在尝试从我的加速度计(俯仰)角度(仅用于测试),通过时间积分陀螺仪_X并使用互补滤波器进行过滤来倾斜。
filtered_angle[0] = (0.98f) * (filtered_angle[0] + gyro_x * dT) + (0.02f)* (pitch)
dT 大约为 0.009 秒
但是我不知道为什么我的角度并不是非常准确... 当设备平放在桌子上(显示面向上)时。
Pitch (angle fromm accel) = 1.5 (average)
Integrate gyro = 0 to growing (normal it's drifting)
filtered gyro angle = 1.2
当我将手机向上抬起90度时(屏幕朝着我面前的墙),
Pitch (angle fromm accel) = 86 (MAXIMUM)
Integrate gyro = he is out ok its normal
filtered gyro angle = 83 (MAXIMUM)
因此,角度永远不会达到90度吗?即使我试图再将手机举高一点……为什么它不能达到90度?我的计算有误吗?还是传感器的质量很差?
另一件让我感到疑惑的事情是:在Android上,我没有“读取”传感器的值,但当它们发生变化时我会收到通知。问题在于,如您在代码中所见,加速度计和陀螺仪共享同一方法……因此,当我计算滤波后的角度时,我会提前0.009秒测量加速度计的俯仰角度,对吗?这可能是我的问题源头吗?
谢谢!