Android 罗盘和加速度计精度
我用Android开发了自己的应用程序,使用指南针和加速计传感器来显示设备的旋转度和倾斜度。我初始化了所有我需要的侦听器和对象(我遵循了一些教程),现在我可以按照我的意愿捕获这些度。问题在于传感器返回的测量值不准确。我的意思是,即使我试图对从传感器捕捉到的度数进行四舍五入,它们每分之一秒都会在-/+7(或8)度之间振荡,即使我呆在远离任何干扰源的草地上。我想要的是一个精确的度数测量,类似于一种对我从传感器接收到的值进行四舍五入的方法Android 罗盘和加速度计精度,android,accelerometer,compass-geolocation,sensors,Android,Accelerometer,Compass Geolocation,Sensors,我用Android开发了自己的应用程序,使用指南针和加速计传感器来显示设备的旋转度和倾斜度。我初始化了所有我需要的侦听器和对象(我遵循了一些教程),现在我可以按照我的意愿捕获这些度。问题在于传感器返回的测量值不准确。我的意思是,即使我试图对从传感器捕捉到的度数进行四舍五入,它们每分之一秒都会在-/+7(或8)度之间振荡,即使我呆在远离任何干扰源的草地上。我想要的是一个精确的度数测量,类似于一种对我从传感器接收到的值进行四舍五入的方法 float[] mags = null; fl
float[] mags = null;
float[] accels = null;
float[] R = new float[matrix_size];
float[] outR = new float[matrix_size];
float[] I = new float[matrix_size];
float[] values = null;
private void startSensor() {
sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
return;
}
switch (event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
mags = event.values.clone();
break;
case Sensor.TYPE_ACCELEROMETER:
accels = event.values.clone();
break;
}
if (mags != null && accels != null) {
SensorManager.getRotationMatrix(R, I, accels, mags);
// Correct if screen is in Landscape
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X,
SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, values);
azimuth = (float) Math.round((Math.toDegrees(values[0]))*7)/7;
azimuth = ( azimuth + 360)%360;
//here is inclination. The problem is just the same with compass
//inclination=-Math.round((float) (values[1]*(360/(2*Math.PI))));
//other code to update my view
//in azimuth i have the degree value. It changes continuously
//even if i aim still the same direction
}
}
你所看到的是真实的东西——大多数手机上的方位传感器只能给你一个粗略的罗盘方位 如果您希望平滑显示的值,这样它就可以提供一些看起来不会随机更改的内容,我建议在该方向结果上用Java实现一个或其他平滑过滤器
为了获得最高的性能,您可以使用NDK编写过滤器,并使用Boost累加器库:您看到的是真实的东西-大多数手机上的方位传感器只足以为您提供粗略的指南针航向 如果您希望平滑显示的值,这样它就可以提供一些看起来不会随机更改的内容,我建议在该方向结果上用Java实现一个或其他平滑过滤器 要获得最高性能,您可以使用NDK编写过滤器,并使用增压蓄能器库:请参见我的答案: 在将加速计和magetometer事件值传递给
SensorManager.getRotationMatrix()
之前,我在加速计和magetometer事件值上运行此过滤器。我认为该算法的优点是不必保留大量历史值,只需保留先前的低通输出数组
该算法源于维基百科的以下条目:请参见我的答案:
在将加速计和magetometer事件值传递给SensorManager.getRotationMatrix()
之前,我在加速计和magetometer事件值上运行此过滤器。我认为该算法的优点是不必保留大量历史值,只需保留先前的低通输出数组
该算法是从维基百科的条目中衍生出来的:我在这里使用了卡尔曼滤波器: 我将数据发送到udp端口,并在PC上使用python平滑数据。
但是我想你可以在那里找到java/android的卡尔曼滤波器实现。我在这里使用卡尔曼滤波器: 我将数据发送到udp端口,并在PC上使用python平滑数据。
但是我想你可以在那里找到java/android的卡尔曼滤波实现。那么你看了原始传感器数据,它疯狂地波动着?或者只是在你试图处理数据之后?所以你看了原始的传感器数据,它在疯狂地波动?还是仅在您尝试处理数据之后?