IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Affichage des résultats du sondage: Le code semble-t-il bon ?

Votants
0. Vous ne pouvez pas participer à ce sondage.
  • Oui

    0 0%
  • Non

    0 0%
Calcul scientifique Python Discussion :

Détermination de la position grâce à une centrale inertielle


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2024
    Messages : 1
    Par défaut Détermination de la position grâce à une centrale inertielle
    Bonjour,
    Pour un travail en classe préparatoire pour écoles d'ingénieures, je cherche à déterminer la position d'un solide grâce à une centrale inertielle (MPU6050 couplée à une carte Arduino et une carte SD).
    Je sais bien que les centrales inertielles ne sont pas toujours efficaces à causes de certaines approximations (blocage de cardan, perte d'un degré de liberté, incertitude, fréquence d'échantillonnage, erreurs d'intégrations, …), mais le but étant de comparer différentes méthodes d'études expérimentales de la position, cette experience est tout de même intéressante.

    Après avoir récolté les données dans un fichier csv test.txt, j'essaie, en utilisant les angles d'Euler (yaw, pitch, roll), de remonter jusqu'à la position de mon solide (à l'arrêt en position 0 à l'instant initiale) en python.
    Je représente ensuite les différentes positions de mon solide au cours du temps dans un graph en 3 dimensions.
    Cependant, la figure finale (ci-dessous) ne correspond pas à ce à quoi je m'attendais (la centrale inertielle est immobile mais la figure ne correspond pas au résultat attendu …).
    Nom : Figure_1.png
Affichages : 288
Taille : 65,6 Ko

    Serait-il possible d'avoir un retour sur mon code python, et peut-être des hypothèses sur les sources possibles d'erreurs, notamment dans le traitement de mes données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    import numpy as np
    import matplotlib.pyplot as plt
    import math
     
    # fonction pour importer facilement le fichier csv contenant les données
    def import_csv(filename):
        file = open(filename, 'r')
        fichier = file.readlines()
        file.close()
        head = fichier[0].split(', ')
        head[6] = head[6].replace("\n", "")
        print(head)
        data = [[], [], []]
        for i in range(1, len(fichier) - 1):
            words = fichier[i].split(',')
            data[0].append(float(words[0]))
            data[1].append([float(words[1]), float(words[2]), float(words[3])])
            data[2].append([float(words[4]), float(words[5]), float(words[6].replace("\n", "0"))])
        return head, data
     
    ######################### Importation du fichier ################################
    titre, donnees = import_csv('test.csv')
    time = [0.001 * donnees[0][i] for i in range(len(donnees[0]))]
     
    ######################### Changement de base grace aux angles d'Euler ################################
     
    lst_yaw = [math.radians(elem[0]) for elem in donnees[2]]
    lst_pitch = [math.radians(elem[1]) for elem in donnees[2]]
    lst_roll = [math.radians(elem[2]) for elem in donnees[2]]
     
    R = [] #Liste des matrices de passage d'une base à une autre
    for i in range(len(donnees[0])):
        yaw = lst_yaw[i]
        pitch = lst_pitch[i]
        roll = lst_roll[i]
        yawMatrix = np.array([[math.cos(yaw), -math.sin(yaw), 0],
                              [math.sin(yaw), math.cos(yaw), 0],
                              [0, 0, 1]])
        pitchMatrix = np.array([[math.cos(pitch), 0, math.sin(pitch)],
                                [0, 1, 0],
                                [-math.sin(pitch), 0, math.cos(pitch)]])
        rollMatrix = np.array([[1, 0, 0],
                               [0, math.cos(roll), -math.sin(roll)],
                               [0, math.sin(roll), math.cos(roll)]])
        R.append(np.dot(yawMatrix, np.dot(pitchMatrix, rollMatrix))) # Produit des 3 matrices de rotations
     
    acc_B = donnees[1] #accélérations dans la base orientée selon le barycentre de la centrale
    acc_O = [list(np.dot(R[i], acc_B[i])) for i in range(len(acc_B))] # accélération dans la base lié au barycentre de la centrale à l'instant initiale
     
    x = [0.5 * acc_O[i][0] * ((time[i+1] - time[i])**2) for i in range(len(acc_O)-1)]  # Création du tableau de l'axe x
    y = [0.5 * acc_O[i][1] * ((time[i+1] - time[i])**2) for i in range(len(acc_O)-1)]  # Création du tableau de l'axe y
    z = [0.5 * acc_O[i][2] * ((time[i+1] - time[i])**2) for i in range(len(acc_O)-1)]  # Création du tableau de l'axe z
     
    # Tracé du résultat en 3D
    fig = plt.figure()
    ax = fig.gca(projection='3d')  # Affichage en 3D
    ax.scatter(x, y, z, label='Courbe', marker='o')  # Tracé des points 3D
    plt.title("Points 3D")
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    plt.tight_layout()
    plt.show()
    Merci d'avance pour vos avis/réponses

  2. #2
    Membre éprouvé
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 130
    Par défaut
    A premiere vu, le code semble correct bravo!

    1) Pour le calcul de la position, tu utilises la formule x = 1/2 * a * t**2, (si on considère que tu pars à l'arret c'est correct). Mais dans ton implémentation, tu intègres avec la méthode des rectangles. En effet pour passer de la position t à t+dt tu ne considères que le point t, cela revient à dire que l'acceleration est constante sur ce segment. Pour plus de précision, tu peux considérer un acceleration "affine" ou même plus encore!

    2) Les centrales inertielles sont très bruitées, si tu connais l'acceleration maximum raisonable de ton module, tu peux filtrer les fréquences qui sont au dessus.

    3) En numpy, np.dot(A, B) s'écrit simplement A @ B

    Voilou!

Discussions similaires

  1. Filtre de Kalman - programmation d'une centrale inertielle
    Par superlucile dans le forum MATLAB
    Réponses: 6
    Dernier message: 11/01/2017, 16h51
  2. Position d'une ScrollBar dans un TRichEdit (ou TMemo)
    Par Troll dans le forum C++Builder
    Réponses: 9
    Dernier message: 24/02/2005, 15h18
  3. Récuperer la taille & position d'une fenêtre
    Par TheDarkLewis dans le forum Windows
    Réponses: 3
    Dernier message: 20/09/2004, 22h15
  4. Position d'une balise dans un document externe
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 02h56
  5. [VB6] Position d'une MDIchild dans un MDI
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2003, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo