Алгоритм слияния сенсоров Мэджвика на iOS

Я пытаюсь запустить алгоритм объединения датчиков Мэджвика на iOS. Поскольку код является открытым исходным кодом, я уже включил его в свой проект и вызываю методы с предоставленными значениями датчиков.

Но похоже, что алгоритм ожидает измерения сенсора в другой системе координат. Система датчиков Apple CoreMotion указана справа, а датчик Мэджвика - слева. Вот изображение различных систем координат. Обе системы следуют правилу правой руки. Мне кажется, что вокруг оси z есть поворот на 90 градусов. Но это не сработало.

разные системы координат

Я также попытался перевернуть оси x и y (и инвертировать z), как было предложено другие сообщения о stackoverflow для WP, но это тоже не сработало. Так у тебя есть подсказка? Было бы идеально, если бы вывод алогитма Мэджвика мог быть в той же системе, что и вывод CoreMotion (CMAttitudeReferenceFrameXM MagneticNorthZVertical).

Кроме того, я ищу хорошее рабочее значение для betaDef на iPhone. betaDef - это своего рода пропорциональное усиление, которое в настоящее время установлено на 0,1f.

Любая помощь о том, как достичь цели, будет оценена.


person flix    schedule 22.07.2013    source источник
comment
удалось ли вам выполнить задачу?   -  person hariszaman    schedule 18.11.2013
comment
Нет простите. У меня больше нет Mac.   -  person flix    schedule 18.11.2013
comment
спасибо за быстрый ответ   -  person hariszaman    schedule 18.11.2013
comment
Что уже работает? Фильтр Мэджвика работает следующим образом: 1) Используйте текущее положение для вычисления ошибок ориентации акселерометра / магнитометра в форме угловой оси 2) Вычтите часть этих ошибок из формы угла оси гироскопа 3) Обновите кватернион ориентации, интегрируя скорректированную ось. значения углов. Есть ли у вас какие-либо из этих шагов по отдельности? Фильтр Мэджвика должен работать в любой системе отсчета, но результирующий кватернион будет в системе отсчета входных данных. Я думаю, у вас может быть совсем другая проблема. Что вы получите, если примените фильтр как есть?   -  person marcv81    schedule 24.01.2014
comment
Привет, фликс. Вы решили проблему?   -  person Richard Le    schedule 20.11.2014
comment
@ Привет, фликс, ты решил проблему? Не могли бы вы поделиться своим решением   -  person Richard Le    schedule 20.11.2014


Ответы (1)


Я не уверен, как записать это в цели c, но вот как я выполнил преобразования координат в vanilla c. Я также хотел повернуть ориентацию так, чтобы + y было на север. Этот перевод также отражен в методе ниже.

Этот метод ожидает кватернион из 4 элементов в форме wxyz и возвращает переведенный кватернион в том же формате:

void madgeq_to_openglq(float *fMadgQ, float *fRetQ) {
  float fTmpQ[4];
  // Rotate around Z-axis, 90 degres:
  float fXYRotationQ[4] = { sqrt(0.5), 0, 0, -1.0*sqrt(0.5) };

  // Inverse the rotation vectors to accomodate handedness-issues:
  fTmpQ[0] = fMadgQ[0];
  fTmpQ[1] = fMadgQ[1] * -1.0f;
  fTmpQ[2] = fMadgQ[2];
  fTmpQ[3] = fMadgQ[3] * -1.0f;

  // And then store the translated Rotation into ret:
  quatMult((float *) &fTmpQ, (float *) &fXYRotationQ, fRetQ);
}

// Quaternion Multiplication operator. Expects its 4-element arrays in wxyz order 
void quatMult(float *a, float *b, float *ret) {
  ret[0] = (b[0] * a[0]) - (b[1] * a[1]) - (b[2] * a[2]) - (b[3] * a[3]);
  ret[1] = (b[0] * a[1]) + (b[1] * a[0]) + (b[2] * a[3]) - (b[3] * a[2]);
  ret[2] = (b[0] * a[2]) + (b[2] * a[0]) + (b[3] * a[1]) - (b[1] * a[3]);
  ret[3] = (b[0] * a[3]) + (b[3] * a[0]) + (b[1] * a[2]) - (b[2] * a[1]);

  return;
}

Надеюсь, это поможет!

person Chris DeRose    schedule 21.01.2014