MPU6050: Winkel/Querbeschleunigung im (Drohnen-) Flug messen

Ich bin dabei eine Drohne selbst zu bauen.
Nach meinen bisherigen Erkenntnissen benötige ich zur Regelung
der horizontalen Geschwindigkeit den Anstellwinkel oder die Querbeschleunigung.
Zum Messen meiner Fluglage verwende ich einen MPU6050, stoße dabei aber auf folgendes Problem:

  1. misst dieser die Winkelgeschwindigkeit um die X-, Y- und Z-Achse
    Problem: Die Messabweichungen werden beim Ermitteln des Winkels integriert,
    der Fehler nimmt mit der Zeit zu.

  2. misst dieser die Beschleunigung entlang der X-, Y- und Z-Achse
    Problem: Zusätzlich zur Gravitationskraft wirkt die eigentlich relevante Querbeschleunigung.
    Beide Kräfte heben sich aber gegenseitig auf, da der Anstellwinkel ja die Querbeschleunigung vorgibt.
    Zum Vergleich spürt man in einem Verkehrsflugzeug den Kurvenflug kaum, da sich Gewichts- und Fliehkraft in Querrichtung aufheben. Man merkt nur, dass man stärker in den Sitz gepresst wird.

Meine Idee wäre ein Algorithmus der grundsätzlich die Winkelgeschwindigkeiten auswertet.
Der Winkel aus der Beschleunigung wird zum Nullen des integrierten Messfehlers verwendet.
Dazu wird die Abweichung zwischen vor Start ermittelter Gewichtskraft und tatsächlich gemessener Kraft in Z-Richtung ermittelt. Diese Abweichung fließt dann anti-proportional quadratisch als Faktor ein.

Meine Frage ist nun, ob es eine einfachere Lösung gibt die Drohne,
insbesondere die Geschwindigkeit in X- und Y- Richtung, zu regeln.
Vielleicht hat jemand bereits eine Drohne gebaut und kann mir weiterhelfen.

Auf jeden Fall schon einmal vielen Dank im Voraus!

Ich habe meine Idee jetzt mal umgesetzt. Aus der Differenz zwischen Beschleunigung der Z-Achse und erwarteter Gravitation sowie aus eventuellen Querbeschleunigungen wird ein Faktor ermittelt. Dieser gibt gewissermaßen an, wie belastbar der aus der Beschleunigung ermittelte Winkel ist. Anschließend werden jeweils die Winkel aus Beschleunigung und Winkelgeschwindigkeit ermittelt und dann verrechnet.

  float factorAcc = accCoef * exp(-2000 * abs(accZ - accZoffset) * sqrt(accX * accX + accY * accY));
  float angleAccX = - atan2(accY, sqrt(accZ * accZ + accX * accX));
  float angleAccY = - atan2(accX, sqrt(accZ * accZ + accY * accY));

  float interval = (float)(millis() - previousMillis) / 1000;
  previousMillis = millis();
  float angleGyroX = m_angleX + m_gyroX * interval;
  float angleGyroY = m_angleY + m_gyroY * interval;
  float angleGyroZ = m_angleZ + m_gyroZ * interval;
  
  m_angleX = (1.0f - factorAcc) * angleGyroX + factorAcc * angleAccX;
  m_angleY = (1.0f - factorAcc) * angleGyroY + factorAcc * angleAccY;
  m_angleZ = angleGyroZ;

Es funktioniert, soweit ich das mit der Hand am Sensor simulieren kann, ganz gut.
Ich werde dennoch das Gefühl nicht los, dass es einfacher gehen könnte ...