Dans le cadre d'un projet de mesure d'accélération, de rotation, et d'orientation, j'utilise un shield Sense HAT sur un RPi 3. Le Sense HAT possède un gyroscope/accéléromètre LSM9DS1, c'est ce dernier que j'utilise pour faire mes mesures. A ce jour, j'arrive à lire en C++ les valeurs d'accélération (accélération de la pesanteur, mesurée en g) et de rotation (vitesse angulaire, mesurée en degrés par seconde), autour de chacun des trois axes du RPi.
J'en arrive maintenant à mon problème : je dois également récupérer les valeurs d'orientation (angle par rapport à un référentiel fixe, mesuré en degrés). Après avoir fait pas mal de recherche, c'est le "filtre complémentaire" qui revient le plus souvent, et à propos du quel on peut trouver un grand nombre d'articles. Ce filtre est un calcul qui permet de combiner les valeurs d'accélération et de rotation d'un instant t pour obtenir les valeurs d'orientation à ce même instant t.
Je me suis donc basé sur cet article, concernant Arduino mais que j'ai adapté à mes besoins, pour obtenir le code suivant (du Python 3 pour tester, j'adapterai en C++ lorsque le problème sera résolu) :
Code : Tout sélectionner
from sense_hat import SenseHat
import time
import math
sh = SenseHat()
angle = 0.0
while (True):
acc = sh.get_accelerometer_raw() # Lecture des valeurs brutes d'accélération (en [i]g[/i]).
rot = sh.get_gyroscope_raw() # Lecture des valeurs brutes de rotation (en radians par seconde).
ax = acc['x']
ay = acc['y']
az = acc['z']
gx = rot['x']
gy = rot['y']
gz = rot['z']
angle = 0.98 * (angle + gy * 0.01 * 57.296) + 0.02 * math.atan2(ax, az) * 57.296 # 57,296 car conversion en degrés (angle * 180 / pi).
print("angle = ") + str(angle)) # Affichage de l'angle d'inclinaison selon l'axe Y.
time.sleep(0.01)
Pour la suite, je bloque un peu pour le calcul des angles selon les deux axes restants, X et Z.
Pour X, je dirais que je dois utiliser la formule suivante :
Code : Tout sélectionner
angle = 0.98 * (angle + gx * 0.01 * 57.296) + 0.02 * math.atan2(ay, az) * 57.296
En revanche, je n'ai aucune idée de comment adapter la formule pour obtenir l'angle selon l'axe Z vertical, et il me semble avoir lu que cette méthode ne permettait pas d'obtenir l'angle selon l'axe Z (évidemment, impossible de retrouver le lien...). Du coup, pourriez-vous me donner un coup de main pour cet axe ?
L'API officielle Python du Sense HAT propose une méthode get_orientation_degrees() qui est exactement ce dont j'ai besoin, mais qui utilise la bibliothèque RTIMULib que je n'utilise pas, la méthode getIMUData() pour être exact, mais je ne sais pas ce qu'elle fait car je ne trouve pas de fichier la décrivant, même sur le GitHub. D'un autre côté, le GitHub du Sense HAT indique que la biblio RTIMU est une custom version, donc qui n'a peut-être rien à voir.Idéalement, il me faudrait un équivalent de get_orientation_degrees() en C++...
Vous l'aurez compris : je suis paumé.
Je suis également preneur si vous avez des suggestions !