J'utilise actuellement l'attitude CMMotionManager pour obtenir le roulis, le tangage et le lacet. Cependant, après avoir couru pendant quelques minutes, le lacet dérive et devient inexact. J'ai lu qu'il y a un moyen de calculer le lacet en utilisant une combinaison d'accéléromètre et de magnétomètre qui gardera le lacet précis avec une compensation pour la dérive constante, mais je n'ai pas encore trouvé de formule de travail.Utiliser un magnétomètre et un accéléromètre pour calculer le lacet précis
Voici une petite partie de mon code que j'utilise pour obtenir des mises à jour de mouvement.
motionManager.deviceMotionUpdateInterval = 0.1
motionManager.showsDeviceMovementDisplay = true
motionManager.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, to: OperationQueue.current!)
{ deviceManager, error in
if let deviceManager = deviceManager {
let roll = deviceManager?.attitude.roll
let pitch deviceManager?.attitude.pitch
let yaw = deviceManager?.attitude.yaw // Get drifted over time
...
Une idée?
MISE À JOUR
je pouvais compenser la dérive de lacet en utilisant la formule suivante:
Créer le point initial de référence (référence de cadre mondial fixe) à l'aide magnétomètre:
m_w = (m_x,m_y,m_z)
Prenez magnetomer courant point (également référentiel fixe) utilisant un magnétomètre:
n_w = (n_x,n_y,n_z)
Convertir des angles de lecture projetée
a = atan2(m_z,m_x)
b = atan2(n_z,n_x)
dérive Yaw peut être calculée comme suit
y_d = (a-b) * 180/PI
Maintenant déduisons le résultat de lacet de l'accéléromètre en cours.
WALLA!
C'est ce que je fais pour le moment comme je l'ai dit, j'utilise un CMMotionManager pour obtenir les mises à jour de roll, pitch et yaw. Cependant, le lacet se dérive après un certain temps, et je comprends que c'est un problème commun avec les gyroscopes. Je cherche une solution. –