Как преобразовать необработанные данные магнитометра xyz в курс?

Я использую встроенное устройство с простым 3-осевым магнитометром. В настоящее время он отображает значения X Y Z в микро-Теслах, но как мне преобразовать их в направление по компасу? Я пытался найти это в Google, но все, что я нахожу, кажется чрезвычайно сложным/плохо объясненным.

Если возможно, я хотел бы знать, как это сделать как с компенсацией наклона, так и без компенсации наклона.

Значения, которые я сейчас получаю на плоской поверхности для X, Y, Z, составляют 70, 0,8 и 34,1 соответственно, если это как-то поможет.

P.S. Если это поможет, вот фрагмент кода, который я использую для магнитометра:

mSensor.enable();

while(true){
    wait(1);
    mSensor.getAxis(mData);
    lcd.cls();
    lcd.locate(0,3);
    lcd.printf("X=%4.1f micro-Tesla\n\rY=%4.1f micro-Tesla\n\rZ=%4.1f micro-Tesla", mData.x, mData.y, mData.z);

person Cypher236    schedule 24.02.2016    source источник
comment
Это могло бы стать темой диссертации...   -  person YSC    schedule 24.02.2016
comment
Что получить значение заголовка из значений X, Y, Z? Это должно быть просто использование тригонометрии, конечно.   -  person Cypher236    schedule 24.02.2016


Ответы (2)


Без компенсации наклона не так уж и сложно:

angle = atan2(Y, X);

На самом деле это то же самое, что преобразовать вектор в декартовых координатах [X, Y] в вектор в полярных координатах [длина, угол], без указания длины.

Для версии с компенсацией наклона вам нужно сначала спроецировать 3D-вектор [X, Y, Z] на плоскость [X2, Y2], а затем использовать ту же формулу, что и раньше. Но для этого вам понадобится акселерометр, чтобы знать величину наклона.

person alain    schedule 24.02.2016
comment
Это идеально, спасибо, именно то, что я хотел. Честно говоря, акселерометр, который мы используем, недостаточно точен для полноценного компаса с компенсацией наклона, поэтому я не против сделать это просто. - person Cypher236; 24.02.2016
comment
Спасибо, я рад, что смог помочь. - person alain; 24.02.2016

Сначала вам потребуется калибровка (либо с использованием метода калибровки устройства, либо путем вращения устройства по полному кругу для определения полной напряженности поля).

Затем вы можете использовать показания X, Y и Z, чтобы вычислить местоположение «севера» относительно того, куда вы указываете (имея в виду, что «север» изменяется на целых 30 градусов в зависимости от того, где вы находитесь на земле (называется склонение — см. http://www.magnetic-declination.com/), и что это не либо горизонтально по отношению к земле (что сбивает с толку, называется «наклоном» - см. -укажите-вниз-или-вверх-по-разному-на-белом/283782">https://physics.stackexchange.com/questions/283761/if-you-hold-a-compass-needle-vertical-does-it- точка-вниз-вверх-по-разному-на-wh/283782 )

Если вы представите показания X, Y и Z как означающие «где на воображаемой окружности находится направление магнетизма — где эти 3 окружности находятся в 3 разных плоскостях, вы можете вычислить логическое положение вектора, указывающего на магнитный север в 3 Габаритные размеры.

Плохая новость - нет простого способа сделать то, что вы хотите, точно, и определенно нет такого, который будет работать без триггерной математики во всех трех показаниях (вы не можете просто использовать X и/или Y по отдельности).

Хорошие новости: вам, вероятно, не нужно знать фактический «заголовок» — большинству приложений просто нужно какое-то локальное относительное направление по сравнению с тем, что вы уже знаете.

Остерегайтесь того, что сильные магниты (например, во всех современных двигателях) серьезно искажают показания с большого расстояния (даже 10 или более футов) — возьмите приложение из своего магазина телефонов, которое показывает показания магнитометра вашего телефона, и помахайте магнитом вокруг, чтобы увидеть это легко!

person Community    schedule 27.10.2018