SensorManager.getRotationMatrix()
делает то, что описано ниже, написанное до того, как я это узнал. Я оставлю добавленное объяснение, потому что, если вы хотите скорректировать разницу между магнитным и истинным севером, оно вам все равно понадобится.
Грубый алгоритм состоит в том, чтобы получить матрицу вращения, умножить на нее вектор [0,0,-1]
, а затем настроить его на свою систему координат. Почему? Документы Android дают системы координат для устройства и мира.
![device](https://i.stack.imgur.com/XiRdp.png)
![мир](https://i.stack.imgur.com/4n9ep.png)
Обратите внимание, что [0,0,-1]
в координатах устройства Android указывает перпендикулярно назад от экрана. Если вы умножите матрицу вращения R на этот вектор, вы получите [0,0,-1]
в мировых координатах, когда устройство лежит на столе лицевой стороной вверх, как вы хотите. Когда он направлен на север, вы получите [0,-1,0]
, что указывает на то, что вы выбрали систему координат, в которой x
и y
поменялись местами по отношению к системе Android, но это просто изменение соглашений.
Примечание R * [0,0,-1]^T
- это всего лишь третий столбец R
с отрицанием. Отсюда я получаю псевдокод:
getRotationMatrix(R);
Let v = first three elements of third column of R.
swap v[0] and v[1]
Это должно получить то, что вы хотите.
Дополнительная информация о том, чем занимается getRotationMatrix()
, приведена ниже.
Вам нужны как данные акселерометра, чтобы установить направление «вниз», так и данные магнитометра, чтобы определить направление «север». Вам придется предположить, что акселерометры воспринимают только гравитацию (устройство стационарно или движется с постоянной скоростью). Затем вам нужно спроецировать вектор магнитометра на плоскость, перпендикулярную вектору силы тяжести (поскольку магнитное поле обычно не касается земной поверхности). Это дает вам две оси. Третий ортогонален, поэтому его можно вычислить методом перекрестного произведения. Это дает вам векторы координат Земли в системе устройства. Похоже, вы хотите обратное: координаты устройства в земных координатах. Для этого просто постройте матрицу направляющих косинусов и инвертируйте.
Я добавлю, что приведенное выше обсуждение предполагает, что вектор магнитометра указывает на север. Я думаю (из средней школы!) Это на самом деле к магнитному югу, но у меня нет под рукой устройства, поэтому я не могу попробовать. Конечно, магнитный север/юг отличается от истинного от нуля до 180 градусов, в зависимости от того, где вы находитесь на земле. Вы можете получить координаты GPS и вычислить фактическое смещение.
Если вы не знакомы с математикой, необходимой для этого, я могу объяснить подробнее, но это придется сделать позже.
person
Gene
schedule
17.06.2012