Магнитные поля, матрица вращения и глобальные координаты

Я думаю, что я прочитал все посты на эту тему, но все же я не могу понять несколько вещей:

Q1: Чтобы получить вектор магнитного поля в глобальных координатах, мне нужно умножить инвертированную матрицу вращения и вектор магнитного поля, почему мне нужно инвертировать матрицу вращения?

Q2: допустим, у меня есть устройство, и я могу рассчитать азимут на основе вращения по оси Z, используя метод getOrientation(...). Могу ли я использовать матрицу вращения или какой-либо другой метод для расчета азимута на магнитный север независимо от положения телефона? Так что, если я поверну телефон, угол между мной и магнитным севером останется прежним?

Q3: Когда я умножаю магнитный вектор (4-й столбец равен нулю) на инвертированную матрицу вращения, я получаю, что х очень близко к нулю. я знаю, что это нормально из других сообщений, но я не могу понять, почему?

Q4: Теоретически, допустим, что у меня есть два устройства, расположенные на расстоянии 1 метра друг от друга, возможно ли сделать пространственное положение двух устройств только на основе их магнитных полей (в глобальных координатах)?

Заранее спасибо.

PS Я уже читал эти посты: Получение значений магнитного поля в глобальных координатах, Как я могу получить вектор магнитного поля, независимый от вращения устройства?

Преобразовать значения магнитного поля X, Y, Z из устройства в глобальную систему отсчета

2 ответа

Решение

Если вы прочитаете мой ответ в разделе Преобразование значений магнитного поля X, Y, Z из устройства в глобальную систему отсчета, вы все равно не поймете это.

А1. Вы умножаете матрицу вращения на координаты вектора магнитного поля в системе координат устройства, чтобы получить координаты вектора магнитного поля в мировой системе координат.

Позвольте мне подчеркнуть: вышеупомянутая матрица вращения, а не инвертированная матрица вращения.

Матрица вращения получена путем вызова getRotationMatrix это изменение базовой матрицы от основы устройства до мировой основы. То есть задан любой вектор v с координатами в системе координат устройства, координаты в мировой системе координат того же вектора v можно получить путем умножения матрицы вращения на координаты в системе координат устройства.

Инвертированная матрица вращения - это изменение базисной матрицы от мировой основы до основы устройства. Таким образом, когда вы умножаете эту матрицу с координатами, она интерпретируется как умноженная матрица с координатами вектора в мировой системе координат, чтобы получить координаты этого же вектора в системе координат устройства. Поэтому, если вы умножите инвертированную матрицу вращения на координаты вектора магнитного поля, возвращаемые магнитным датчиком. Тогда координаты интерпретируются как координаты вектора в мировой системе координат и, следовательно , не представляют вектор магнитного поля, а полученное произведение не является координатами вектора магнитного поля в мировой системе координат. На самом деле это координаты вектора в системе координат устройства.

A2. getOrientation имеет смысл только если устройство плоское. Для меня это просто куча угловых расчетов. Я смотрю на то, что я пытаюсь сделать геометрически, а затем использую матрицу вращения, чтобы вычислить, что я хочу. Например, чтобы вычислить направление, куда указала задняя камера, я смотрю на него как на направление -z (противоположность вектора, перпендикулярного экрану). Таким образом, чтобы найти это направление, я спроецировал -z на мировую плоскость Восток-Север и рассчитал угол между этим вектором проекции и северной осью. Теперь, если вы так думаете, вращение устройства не изменит направление -z, поэтому векторы проекции такие же, как и при вращении устройства. Если вы используете getOrientation тогда вы должны предварительно позвонить remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR) за getOrientation чтобы дать вам правильный результат.

A3. getRotationMatrix предполагается, что геомагнитный параметр - это координаты вектора, полностью лежащего в плоскости северного неба. Ну, любой вектор, лежащий в этой плоскости, должен иметь координату х, равную 0. Это просто базовая линейная алгебра.

A4. Ответ - нет. Чтобы получить пространственное положение, вы должны выразить эти векторы относительно фиксированной системы координат. имея только координаты этих векторов в системе координат устройства, вы не сможете найти фиксированный базис, который позволит вам рассчитать изменение базисной матрицы от базиса устройства к этому фиксированному базису. 2 условия, указанные в моей ссылке выше, должны быть выполнены для расчета изменения базы.

A1. Вращение матрицы говорит о положении вашего телефона в мировых координатах. если вы хотите преобразовать магнитный вектор из ваших телефонных координат в мировые координаты, вы должны умножить на обратное.

A2. не совсем понял вопрос, извините.

A3. Координата x - это боковая составляющая магнитной силы, которая соответствует отклонению северного полюса от магнитного полюса или чего-то подобного. он должен быть довольно маленьким, таким же, как координата z, которая является вертикальной составляющей.

A4. теоретически это может работать, но с точностью датчиков, которые есть в вашем устройстве Android, такой подход кажется не очень возможным.

Другие вопросы по тегам