Почему мой код калибровки магнитометра python не работает при помехах от мягкого железа? - PullRequest
0 голосов
/ 11 июля 2020

Я пытался визуализировать калибровку магнитометра с моей платы STM32F3. Я отправляю необработанные 3-осевые (16 битов без знака на ось) через USB для считывания, преобразования в 16-битное плавающее со знаком со знаком, калибровки и, наконец, отображения в моем коде python. Когда я рисую откалиброванные данные магнитометра, кажется, что смещение жесткого железа работает (поскольку график центрирован в точке (0,0)), но эллипс из мягкого железа не превращается в круг, что меня действительно смущает. Я новичок в python, поэтому думаю, что это может быть моя ошибка. Я следую уравнениям (6) и (7) из этой статьи здесь , а вот мой код python ниже и мои «калиброванные результаты»

(величина не имеет значения для меня единицы измерения являются необработанными целыми числами датчика, а не в Гауссе).

Любая помощь будет очень принята!

import numpy as np
import serial
import matplotlib.pyplot as plt
import time

#USB Com Port 16bit signed integer Communication 
s = serial.Serial('COM4')

magx = []
magy = []
magz = []

for i in range(0, 250):
    
    ret = s.read(6)
    magx.append(np.int16((np.uint16(ret[0]) << 8) + ret[1]))
    magy.append(np.int16((np.uint16(ret[2]) << 8) + ret[3]))
    magz.append(np.int16((np.uint16(ret[4]) << 8) + ret[5]))
    
    time.sleep(0.05)

s.close()

#Calibaration terms
Xmax = max(magx)
Xmin = min(magx)

Ymax = max(magy)
Ymin = min(magy)

Xsf = (Ymax - Ymin) / (Xmax - Xmin)
Ysf = (Xmax - Xmin) / (Ymax - Ymin) 

if Xsf < 1:
    Xsf = 1
if Ysf < 1:
    Ysf = 1

Xoff = ((Xmax - Xmin)/2 - Xmax) * Xsf
Yoff = ((Ymax - Ymin)/2 - Ymax) * Ysf

print("Xsf = ",Xsf,"Ysf = ",Ysf,"\r")
print("Xoff = ",Xoff,"Yoff = ",Yoff,"\r\r")

for i in range(0, 250):
    magx[i] = magx[i]*Xsf + Xoff
    magy[i] = magy[i]*Ysf + Yoff


plt.grid()
plt.scatter(magx, magy, marker="o",c='w',edgecolors='r')
plt.show()

...