Прошло несколько дней с тех пор, как я начал использовать эту функцию, и пока не удалось получить действительные результаты.
То, что я хочу, это , в основном, преобразовать вектор ускорения из системы координат устройства в координаты реального мира . Я знаю, что это возможно, потому что у меня есть ускорение в относительных координатах, и я знаю ориентацию устройства в реальной системе.
Чтение Android-разработчиков кажется, что используя getRotationMatrix () я получаю R = матрицу вращения.
Итак, если я хочу A (вектор ускорения в мировой системе) из A '(вектор ускорения в телефонной системе), я должен сделать просто:
A=R*A'
Но я не могу понять, почему у вектора A ВСЕГДА первый и второй компоненты равны нулю (пример: +0,00; -0,00; +6,43)
Мой текущий код похож на это:
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
accelerometervalues = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomagneticmatrix =event.values.clone();
break;
}
if (geomagneticmatrix != null && accelerometervalues != null) {
float[] Rs = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(Rs, I, accelerometervalues, geomagneticmatrix);
float resultVec[] = new float[4];
float relativacc[]=new float [4];
relativacc[0]=accelerationvalues[0];
relativacc[1]=accelerationvalues[1];
relativacc[2]=accelerationvalues[2];
relativacc[3]=0;
Matrix.multiplyMV(resultVec, 0, Rs, 0, relativacc, 0);
//resultVec[] is the vector acceleration relative to world coordinates system..but doesn't WORK!!!!!
}
}
}
Этот вопрос очень похож на этот Преобразование данных акселерометра из координат устройства в координаты реального мира , но там я не могу найти решение ... Я перепробовал все способы ..
Пожалуйста, помогите мне, мне нужна помощь !!!
UPDATE:
Теперь мой код ниже, я пытался объяснить матричный продукт, но ничего не изменилось:
float[] Rs = new float[9];
float[] I = new float[9];
SensorManager.getRotationMatrix(Rs, I, accelerationvalues, geomagneticmatrix);
float resultVec[] = new float[4];
resultVec[0]=Rs[0]*accelerationvalues[0]+Rs[1]*accelerationvalues[1]+Rs[2]*accelerationvalues[2];
resultVec[1]=Rs[3]*accelerationvalues[0]+Rs[4]*accelerationvalues[1]+Rs[5]*accelerationvalues[2];
resultVec[2]=Rs[6]*accelerationvalues[0]+Rs[7]*accelerationvalues[1]+Rs[8]*accelerationvalues[2];
Вот пример чтения данных и результат:
Rs separated by " " Rs[0] Rs[1]....Rs[8]
Av separated by " " accelerationvalues[0] ...accelerationvalues[2]
rV separated by " " resultVec[0] ...resultVec[2]
Как вы можете заметить, компоненты на осях x и y в реальном мире равны нулю (вокруг), даже если вы двигаетесь со скоростью телефона. Вместо этого относительный вектор ускорения правильно определяет каждое движение !!!
РЕШЕНИЕ
Ошибки в нумераторах относятся к умножению чисел с плавающей запятой, которое отличается от двойного умножения.
Это сводится к тому, что матрица вращения не стоит, если телефон , даже если с той же ориентацией, ускоряется.
Поэтому невозможно перевести вектор ускорения в абсолютные координаты при движении ...
Это сложно, но это реальность.