Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Несмотря на то, что устройство неподвижно с течением времени происходит смещение. На 00:09 смещается с 0° на 359°. На 01:21 уменьшается до 358°. На 03:03 мы уже видим азимут 357°.
sm.registerListener(sensorEventListener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), sm.SENSOR_DELAY_NORMAL);
sm.registerListener(sensorEventListener, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), sm.SENSOR_DELAY_NORMAL);
sm.registerListener(sensorEventListener, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), sm.SENSOR_DELAY_NORMAL);
public void onSensorChanged(SensorEvent event)
{
switch (event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
System.arraycopy(event.values, 0, mGravs, 0, 3);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
System.arraycopy(event.values, 0, mGeoMags, 0, 3);
break;
case Sensor.TYPE_ORIENTATION:
System.arraycopy(event.values, 0, mOldOreintation, 0, 3);
break;
default:
return;
}
if (mGravs != null && mGeoMags != null)
{
if (SensorManager.getRotationMatrix(mRotationM, mInclinationM, mGravs, mGeoMags))
{
SensorManager.getOrientation(mRotationM, mOrientation);
// TODO
}
}
}
mat3 calibration_rotation_matrix_from_gravity(vec3 gravity)
{
/*
The calibration is per orientation.
The rotation origin is a gravity should be axis.
*** rules ***
A == G * M0
G == A * Mt
(1) M0 - the rotation matrix
(2) Mt - the transpose matrix of the rotation matrix
*/
vec3 a=vec3_normalize(gravity);
vec3 b=vec3_normalize(vec3_most_significant_basis_vector(gravity));
mat3 m=mat3_make_rotation_ab(a,b);
return(m);
}
На видео снят компас в режиме «гирокомпаса» настроенный точно на север запущен на устройстве, которое неподвижно лежит на столе. Несмотря на то, что устройство неподвижно с течением времени происходит смещение. На 00:09 смещается с 0° на 359°. На 01:21 уменьшается до 358°. На 03:03 мы уже видим азимут 357°.
Боремся с ошибками акселерометра, гироскопа, M7, цифрового компаса и других датчиков в iPhone 5S и не только