Bonjour,
Merci pour la photo. Est-ce que tu penses que tu pourrais aussi m'ajouter une photo d'une roue vue de coté? (si l'alternative d'un encodeur fait maison t'intéresse potentiellement, sinon pas la peine).
Pour les 1 mesures toutes les N secondes, je penses que c'est les valeurs à l’instant t, pas une moyenne (d'après la datasheet (https://www.invensen...-Datasheet1.pdf, voir p13), tu peux ajouter un filtre passe bas, mais avec une fréquence de coupure entre 5 et 260 Hz, donc aucune chance que ce soit ça pour toutes les 5 secondes (0.2Hz) sauf si en plus t'as un passe bas numérique dans ton programme).
De toute façon, en listant l'accélération toutes les 5 secondes, tu n'arriveras à rien (imagine que tu es à l'arrêt à t=0s, puis tu roule pendant 4.5s et puis tu t'arrête : tu ne te rendrais même pas compte que tu as bougé!!!). Il faut au contraire lire l'accéléromètre aussi souvent que possible (je te conseille de lire au moins à 100 Hz : plus tu lis souvent, moins tu as de temps entre deux lectures, et mieux tu approxime ta vitesse/position).
Pour les valeurs que tu lis, probablement normal, car l'unité est probablement pas le m/s², pour la simple raison que travailler avec des nombres à virgule est peu pratique pour les capteurs, du coups ils utilisent des unités qui permettent de renvoyer un entier.
Si tu regardes la datasheet page 13, tu verra qu'en fonction du choix de la plage de mesure (AFS_SEL), tu as une correspondance entre la valeur et l'accélération (donné dans la partie "Sensitivity Scale Factor") :
AFS_SEL=0 16384 LSB/g
AFS_SEL=1 8192 LSB/g
AFS_SEL=2 4096 LSB/g
AFS_SEL=3 2048 LSB/g
Si par exemple tu choisis une plage de mesure de +-2g (la plus petite, que je te conseille car tu ne vas probablement pas accélérer à plus de 9.81m/s²), ce qui correspond à AFS_SEL=0, alors tu as 16384 LSB/g, ce qui veut dire qu'une accélération de 1g (ie 9.81m/s²) correspond à une valeur de 16384.
Donc pour obtenir ta vitesse en m/s², tu doit multiplier ton nombre par g=9.81 et diviser par 16384.
Si tu as une plage differente de AFS_SEL=0, alors tu prends a valeur correspondante.
Un bon moyen de vérifier que tu as pas fait d'erreur, c'est de mesurer l'accélération sur les 3 axes (avec le capteur immobile), de convertir pour chaque axe, et d'en prendre la norme : tu dois obtenir g=9.81m/s² à peu de chose près
A noter que si tu ne vas pas lire directement le capteur, mais que tu passes par une librairie, alors il faut vérifier si celle-ci fait des conversions ou pas.
Sinon, pour l'intégration, je suppose que ce qui t'intéresse, c'est la vitesse du robot dans le référentiel du sol?
Si c'est bien ça, alors tu ne peux pas intégrer directement les accélérations en x et en y, car ils correspondent aux axes et y du référentiel lié au robot (du coup tu serais oublié de rajouter toutes les forces d'inerties dues au fait que c'est un référentiel non galiléen).
La solution la plus simple est de projeter l'accélération dans le référentiel du sol, puis de faire l'intégration dans celui-ci, qui est galiléen. Ce coup-ci, une intégration par trapèze est très bien (à condition d'utiliser un delta_t assez petit, d'où mon conseil de mesurer au moins à 100Hz (delta_t=0.01s)).
Pour pouvoir projeter tes accélérations, tu dois connaître l'orientation de ton robot, ce que tu peux faire en intégrant (trapèze) la vitesse de rotation autour de l'axe vertical (gyro).
Voici un pseudo code :
NB : toutes les variables sont supposées être en unités du système international
NB : je te mets un pseudo code avec le méthode des rectangles (ie j'utilise juste la valeur courante) pour plus de simplicité, mais l'idéal est de l'adapter pour la méthode des trapèzes.
NB : j'ai supposé que les fonctions pour lire la valeur de l'accéléromètre ou du gyroscope se chargent à la fois de prendre en compte les effets de la calibration (à effectuer au préalable) et de la conversion vers les unites du système u=internationnal)
t_precedent=temps_courant(); //lire le temps courant (depuis le lancement du programme)
alpha=0; // angle du robot dans le référentiel du sol
a_x_s=0; //accélération selon l'axe x du référentiel lié au sol
a_y_s=0; //accélération selon l'axe y du référentiel lié au sol
v_x_s=0; //vitesse selon l'axe x du référentiel lié au sol
v_y_s=0; //vitesse selon l'axe y du référentiel lié au sol
x_s=0; //position selon l'axe x du référentiel lié au sol
y_s=0; //position selon l'axe x du référentiel lié au sol
boucle_inifine :
t=temps_courrant();
dt=t-t_precedent;
alpha=alpha + dt*lire_gyro_z(); //intégrer la vitesse de rotation autour de l'axe z
a_x_r=lire_acceleration_x(); //lire l'accélération selon l'axe x du référentiel de l'accéléromètre
a_y_r=lire_acceleration_y(); //lire l'accélération selon l'axe y du référentiel de l'accéléromètre
a_x_s=cos(alpha)*a_x_r - sin(alpha) * a_y_r; //changement de référentiel : rotation
a_y_s=sin(alpha)*a_x_r + cos(alpha) * a_y_r; //changement de référentiel : rotation
v_x = v_x + dt * a_x_s; //intégrer la vitesse en x
v_y = v_y + dt * a_x_y; //intégrer la vitesse en x
x = x + dt * v_x_s; //intégrer la position en x
y = y + dt * v_y_s; //intégrer la position en y
t_precedent=t; //sauvegarder le temps
//si besoin attendre ou faire autre chose
fin de la boucle
Bonne journée
Sandro