Traducido del Türkçe por IA ·
Ampliar la ventana aumenta el retraso, hay que hacer lo contrario. Tuve el mismo problema una vez mientras trabajaba con drones.La fuente del retraso es el promedio en sí: un promedio móvil de 20 lecturas llega con unos 1 segundo de retraso, y el error crece a medida que aumenta la velocidad de giro. La falta de calibración que mencionó Büşra Hanım también explica la diferencia entre el giro a la derecha y a la izquierda.La solución es combinarlo con el giroscopio. El giroscopio detecta la rotación al instante pero se desvía lentamente, el magnetómetro es lento pero no se desvía. Un filtro complementario combina ambos:
// dt = 0.1 s, gz = derece/s (z ekseni jiroskop)
float a = 0.98;
heading = a * (heading + gz * dt) + (1 - a) * magHeading;
// 0/360 geçişini düzelt
float fark = magHeading - heading;
if (fark > 180) heading += 360 * (1 - a);
if (fark < -180) heading -= 360 * (1 - a);
heading = fmod(heading + 360, 360);
Si la placa no tiene giroscopio, añadir un MPU6050 es la forma más barata. Primero, haga girar el barco dos vueltas completas en el agua y realice la calibración hard/soft iron.El problema del 180 es aparte: un ángulo no se puede promediar. El promedio de 359 y 1 da 180. El gráfico semanal lee valores agregados por hora y la función predeterminada es average. En el gráfico del rumbo, cambie la función a last, y para el análisis envíe heading_sin y heading_cos junto al rumbo; su promedio sale correctamente.
Pencereyi büyütmek gecikmeyi artırır, tersini yapmak lazım. Bir dönem drone ile uğraşırken aynı şeyi yaşadım.
Gecikmenin kaynağı ortalamanın kendisi: 20 okumalık hareketli ortalama yaklaşık 1 saniye geriden gelir, dönüş hızı arttıkça hata büyür. Büşra Hanım’ın dediği kalibrasyon eksikliği de sağ-sol farkını açıklıyor.
Çözüm jiroskopla birleştirmek. Jiroskop dönüşü anında görür ama yavaşça kayar, manyetometre yavaş ama kaymaz. Tamamlayıcı filtre ikisini birleştirir:
// dt = 0.1 s, gz = derece/s (z ekseni jiroskop)
float a = 0.98;
heading = a * (heading + gz * dt) + (1 - a) * magHeading;
// 0/360 geçişini düzelt
float fark = magHeading - heading;
if (fark > 180) heading += 360 * (1 - a);
if (fark < -180) heading -= 360 * (1 - a);
heading = fmod(heading + 360, 360);
Kartta jiroskop yoksa bir MPU6050 eklemek en ucuz yol. Önce tekneyi suda iki tam tur döndürüp hard/soft iron kalibrasyonunu yapın.
180 meselesi ayrı: açının ortalaması alınamaz. 359 ile 1’in ortalaması 180 çıkar. Haftalık grafik saatlik toplu değerleri okuyor ve varsayılan fonksiyon ortalama. Başlık grafiğinde fonksiyonu last yapın, analiz için de başlığın yanında heading_sin ve heading_cos gönderin, onların ortalaması doğru çıkar.

