Мне очень жаль, если это очень простой вопрос, но у меня нет выбора, но я задаю его: как вы переводите данные акселерометра из координат устройства в координаты реального мира?
Я имею в виду, если предположить, что акселерометр дает мне такие значения (Ax, Ay, Az) - в координатах устройства - какие преобразования я должен применить, чтобы преобразовать значения в (Ax ', Ay' , Az ') - в координатах реального мира -, поэтому я могу использовать вектор ускорения в координатах реального мира, чтобы вычислить, ускоряется ли устройство на севере, востоке, юго-западе и т. Д.
Я работал над этой проблемой в течение последних нескольких дней. Сначала я подумал, что это будет несложно, но после поиска на десятках страниц я не нашел ничего функционального.
Кстати, вот код с тем, что я реализовал:
private SensorEventListener mSensorEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy){
}
public void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
accelerometervalues = event.values.clone();
AX.setText(accelerometervalues[0]+"");
AY.setText(accelerometervalues[1]+"");
AZ.setText(accelerometervalues[2]+"");
break;
case Sensor.TYPE_ORIENTATION:
orientationvalues = event.values.clone();
azimuth.setText(orientationvalues[0]+"");
pitch.setText(orientationvalues[1]+"");
roll.setText(orientationvalues[2]+"");
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticmatrix =event.values.clone();
TAX.setText(geomagneticmatrix[0]+"");
TAY.setText(geomagneticmatrix[1]+"");
TAZ.setText(geomagneticmatrix[2]+"");
break;
}
if (geomagneticmatrix != null && accelerometervalues != null) {
float[] R = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(R, I, accelerometervalues, geomagneticmatrix);
//What should I do here to transform the components of accelerometervalues into real world acceleration components??
}
}
};
У меня есть:
Вектор ускорений в собственных координатах в accelerometervalues
.
Вектор значений магнитного поля в geomagneticmatrix
.
Азимут, шаг и крен в orientationvalues
.
Матрица вращения R
.
Матрица наклона I
.
Я думаю, что вся необходимая информация есть, азимут, шаг и поворот должны описывать смещение системы координат устройства по отношению к реальной системе координат. Кроме того, я считаю, что R
можно / можно использовать как истинный северный вектор внутри координат устройств.
Мне кажется, что получение значений ускорения в реальном мире является всего лишь математическим преобразованием этих данных. Я просто не могу понять это.
Заранее спасибо.
Отредактировано:
Я пытался напрямую умножить компоненты accelerometervalues
с матрицей вращения R
(trueaccel = accel * R), но это не сработало.
trueacceleration[0]= accelerometervalues[0]*R[0]+accelerometervalues[1]*R[1]+accelerometervalues[2]*R[2];
trueacceleration[1]= accelerometervalues[0]*R[1]+accelerometervalues[1]*R[4]+accelerometervalues[2]*R[7];
trueacceleration[2]= accelerometervalues[0]*R[2]+accelerometervalues[1]*R[5]+accelerometervalues[2]*R[8];
Я также пытался умножить accelerometervalues
с матрицей наклона I. Также умножал и на R, и на меня (trueaccel = accel * R * I), и это тоже не сработало. Так же как и вызов remapcoordinates()
, а затем умножение в любой из предыдущих форм.
Кто-нибудь имеет представление о том, что я делаю неправильно?