Я использую MPU9250 из Adafruit (https://learn.adafruit.com/adafruit-tdk ... -9-dof-imu)образной alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/hwd6r.png"/>
to
https://i.sstatic.net/ar9wh.png"/https: ... /ar9wh.png ». Калибровочный номер по < /p>
x offset = (max_x+min_x)/2
y offset = (max_y+min_y)/2
z offset = (max_z+min_z)/2
и я вычтите смещение в необработанные данные.
Однако я использовал расчет из (https://cdn-shop.adafruit.com/datasheet ... meters.pdf)Direction (y>0) = 90 - [arcTAN(x/y)]*180/PI
Direction (y
Тем не менее, направление универсает и неверно. < /p>
Например, когда я буду heAd 0 градуса (непосредственно на север) < /p>
x 15.749999999999998
y -0.9749999999999996
z 47.4
< /code>
и расчет возвращает 40,44 градуса.x 4.049999999999999
y -14.475
z 46.949999999999996
< /code>
Заголовок составляет 84,906 < /p>
, когда я направляюсь 270 градусов (запад) < /p>
x 1.3499999999999996
y 7.125
z 45.0
< /code>
Заголовок составляет 75,774 градуса < /p>
Когда я направляюсь 180 градусов (на юг) < /p>
x -11.55
y -2.9250000000000007
z 46.5
< /code>
и результат расчета - 128,99 градусов. < /p>
Моя методология для расчета заголовка неверна? Или моя калибровка требует больше шагов?def calibrationDataCollection():
i2c = board.I2C() # uses board.SCL and board.SDA
icm = adafruit_icm20x.ICM20948(i2c)
lx = kbhit.lxTerm()
lx.start()
x=[]
y=[]
z=[]
while True:
#print(icm.magnetic)
if lx.kbhit():
c = lx.getch()
c_ord = ord(c)
if c_ord == 32: # Spacebar
print("\nStop")
break
x.append(icm.magnetic[0])
y.append(icm.magnetic[1])
z.append(icm.magnetic[2])
print((max(x)+min(x))/2)
print((max(y)+min(y))/2)
print((max(z)+min(z))/2)
print()
time.sleep(0.1)
comp_df = pd.DataFrame({"x": x, "y": y, "z": z})
comp_df["offset_x"] = (comp_df.x.max()+comp_df.x.min())/2
comp_df["offset_y"] = (comp_df.y.max()+comp_df.y.min())/2
comp_df["offset_z"] = (comp_df.z.max()+comp_df.z.min())/2
toCSV(analysisPath, "Calibration_2.csv", comp_df)
< /code>
i калибровал датчик путем перемещения 8 -й формы в 3D (например, форма бесконечной цикла) < /p>
Затем, когда значения смещения становятся устойчивыми, я останавливаю калибровку и преобразую его в файл CSV.def Compass_2():
i2c = board.I2C() # uses board.SCL and board.SDA
icm = adafruit_icm20x.ICM20948(i2c)
while True:
x = icm.magnetic[0]- 12.15 #(these are my calibration offsets)
y = -icm.magnetic[1]+ 6.225
z = icm.magnetic[2]+ 14.4
print("x ", x)
print("y ", y)
print("z ", z)
heading = magToHeading2([x,y,z])
print("heading: ", heading)
time.sleep(0.5)
< /code>
Заголовок (magtoheading2) рассчитывается < /p>
def magToHeading2(magnetic):
heading = -1
if magnetic[1] > 0:
heading = 90-math.atan(magnetic[0]/magnetic[1]) * 180 / math.pi
elif magnetic[1] < 0:
heading = 270-math.atan(magnetic[0]/magnetic[1]) * 180 / math.pi
elif magnetic[1] == 0:
if magnetic[0] < 0:
heading = 180.0
else:
heading = 0.0
return round(heading,3)
Подробнее здесь: https://stackoverflow.com/questions/766 ... alculation
Расчет заголовка магнитометра? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение