Projet - image 3D avec Matlab et Arduino avec un IMU

Bonjour,

Pour ceux qui se rappelle, j’avais déjà posté sur quelque chose d’assez similaire (vu qu’il s’agit de la “suite” de l’utilisation d’un gyroscope).

Toujours est-il que j’ai pour objectif de réaliser une image 3D avec un gyroscope renvoyant l’accélération, l’intensité du champs magnétique et l’angle sur les 3 axes.

Je voulais savoir si, seulement à partir des données d’accélérations, je pouvais remonter à la position (et pas au déplacement).
J’ai regardé tout le trifouillis des filtres de Karlman, quaternions, tout ça tout ça, mais ça m’inspire vraiment vraiment pas.

Bon, je sais que c’est plus ou moins obligé d’utiliser un filtre, mais mes acquisitions ne se feront que sur des durées assez courtes (typiquement inférieures à 5s), ce qui devrait limiter les erreurs d’intégration.
Aussi, les accélérations seront linéaires, et il n’y aura pas de rotations quelconques, j’ai classiquement une pattern en 2D mais à différentes altitudes (chaque acquisition aura une altitude différente en gros).

Je comptais aussi utiliser un code plus ou moins comme ça :

#include "MPU9250.h"
MPU9250 IMU(Wire,0x68);
int status;

void setup() {
  // serial to display data
  Serial.begin(9600);

  while(!Serial) {}

  // start communication with IMU 
  status = IMU.begin();
  if (status < 0) {
    Serial.println("IMU initialization unsuccessful");
    Serial.println("Check IMU wiring or try cycling power");
    Serial.print("Status: ");
    Serial.println(status);
    while(1) {}
  }
}
void loop() {
  // read the sensor
  IMU.readSensor();
  // display the data
  Serial.print("AccelX: ");
  Serial.print(IMU.getAccelX_mss(),6);
  Serial.print("  ");
  Serial.print("AccelY: ");  
  Serial.print(IMU.getAccelY_mss(),6);

  
  Serial.print(" ");
  Serial.print("GyroX: ");
  Serial.print(IMU.getGyroX_rads(),6);
  Serial.print("  ");
  Serial.print("GyroY: ");  
  Serial.print(IMU.getGyroY_rads(),6);
  Serial.print("  ");
  Serial.print("GyroZ: ");  
  Serial.print(IMU.getGyroZ_rads(),6);
  delay(20);
long accelx = 0; long accely =0;              // C.I
long speedx = 0; long speedy=0;
long displacementx=0; long displacementy =0;
deltaTime = 0,02;

long avgAccelx = (accelx + IMU.getAccelX_mss() ) / 2;
long avgAccely = (accely + IMU.getAccelY_mss() ) / 2;

long newSpeedx = speedx + (avgAccelx  * deltaTime);
long newSpeedy = speedy + (avgAccely  * deltaTime);
long avgSpeedx = (speedx + newSpeedx) / 2;           //Moyennage pour les beaux yeux.
long avgSpeedy = (speedy + newSpeedy) / 2;

long newDisplacementx = displacementx + (avgSpeedx * deltaTime);
long newDisplacementy = displacementy + (avgSpeedy * deltaTime);

speedx = newSpeedx ;
speedy = newSpeedy ;
displacementx = newDisplacementx;
displacementy = newDisplacementy;

Serial.println(newDisplacementx);
Serial.println(newDisplacementy);
delay(20);
}

Bon en vrai, pour moi j’obtiens le déplacement, est-il possible d’obtenir la position en restant avec ce setup (Arduino UNO, MPU9265, MAG3110) ?
Je précise que les capteurs renvoient des données “comme il faut”, j’ai juste des doutes concernant la dernière partie de mon code pour intégrer…

Cordialement.

PS: J’ai pas mis la coordonnée selon Z, mais c’est un peu trivial si les deux autres marchent.