Я пытался визуализировать калибровку магнитометра с моей платы 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()