Aller au contenu

Acquisition d'une accélération et traitement

Nous allons voir un exemple d'acquisition d'une accélération avec son smartphone et son traitement.

La mesure est effectuée lors d'un petit saut vers le haut avec une légère prise d'élan. Le smartphone est tenu à la main.

Acquisition de l'accélération

Pour effectuer la mesure, nous allons utiliser un smartphone sous Android et l'application phyphox (qui fonctionne aussi bien sous Android que sous iOS).

  1. Lancer l'application phyphox
  2. Dans capteurs sélectionner "Accélération avec g" ou "Accélération (sans g)"
    App
  3. Lancer l'acquisition en cliquant sur l'icône play
    Mesure
  4. Dans le menu hamburger, exporter en CSV
    Export

Récupération des données sous Python

Une fois le fichier CSV exporté (fichier : Raw Data.csv), on le copie dans le même répertoire que le programme python.

import numpy as np

# Lecture des en-têtes des données avec comme délimiteur le point-virgule
head = np.loadtxt('Raw Data.csv', delimiter=';', max_rows=1, dtype=np.str)
head = np.char.replace(head, '"', '')
# Lecture des données au format float
data = np.loadtxt('Raw Data.csv', delimiter=';', skiprows=1)

# Affichage des en-têtes
print(head)
print(data[0])

temps = np.asarray(
    data[:, 0], dtype=np.float, order='C')
acc_x = np.asarray(
    data[:, 1], dtype=np.float, order='C')
acc_y = np.asarray(
    data[:, 2], dtype=np.float, order='C')
acc_z = np.asarray(
    data[:, 3], dtype=np.float, order='C')
1
2
3
['Time (s)' 'Acceleration x (m/s^2)' 'Acceleration y (m/s^2)'
 'Acceleration z (m/s^2)' 'Absolute acceleration (m/s^2)']
[ 0.          0.89920044  1.07887268 10.11953735 10.21653385]
import matplotlib.pyplot as plt  # Module pour tracer les graphiques

# Ajout des courbe
plt.plot(temps, acc_x, label="Accélération sur l'axe x")
plt.plot(temps, acc_y, label="Accélération sur l'axe y")
plt.plot(temps, acc_z, label="Accélération sur l'axe z")
plt.ylabel('Accélération (m/s²)')  # Titre de l'axe y
plt.xlabel("Temps (s)")  # Titre de l'axe x
plt.title("Accélération")  # Titre du graphique
plt.legend()
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

Ici on voit que la grandeur qui varie nettement est l'accélération sur l'axe z.

On choisira donc cette grandeur pour la suite. De plus, la mesure étant prise avec g, un décalage apparait qu'il faudra enlever.

Sélection des données utiles

On peut faire une sécure après 2,5 secondes, car les données ne correspondent pas au mouvement à traiter.

# On cherche les instants où le temps est inférieur à 2,5 secondes
index = np.where(temps < 2.5)

# On ne garde que les données avant les 2,5 secondes
temps = temps[index]
acc_z = acc_z[index]-9.81  # On enlève la valeur de la pesanteur

Filtrage

Ici on va appliquer un filtre passe-bas pour nettoyer le signal et éliminer les parasites.

from scipy import signal

# Fréquence d'échantillonnage
sample_rate = 1/(temps[1]-temps[0])

# Fréquence de nyquist
nyq_rate = sample_rate / 2.

# Fréquence de coupure
cutoff_hz = 15.0

# Préparation du filtre de Butterworth en passe-bas
b, a = signal.butter(6, cutoff_hz/nyq_rate, 'low', analog=False)

# Application du filtre
acc_zf = signal.filtfilt(b, a, acc_z)

# Ajout du d'une courbe
plt.plot(temps, acc_z, label="Accélération sur l'axe z")
plt.plot(temps, acc_zf, label="Signal filtré")  # Ajout du d'une courbe
plt.ylabel('Accélération (m/s²)')  # Titre de l'axe y
plt.xlabel("Temps (s)")  # Titre de l'axe x
plt.title("Accélération")  # Titre du graphique
plt.legend()
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

Intégration pour avoir la vitesse et la position

Nous allons ici intégrer deux fois l'accélération pour obtenir la position.

from scipy.integrate import cumtrapz  # Module d'intégration "cumtrapz"

# Détermination de la vitesse par intégration numérique, la vitesse initiale est nulle
v = cumtrapz(acc_zf, temps, initial=0)

plt.plot(temps, v, label="Vitesse")  # Ajout d'une courbe
plt.ylabel('Vitesse (m/s)')  # Titre de l'axe y
plt.xlabel("Temps (s)")  # Titre de l'axe x
plt.title("Vitesse")  # Titre du graphique
plt.legend()
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

# Calcul de la position par intégration numérique, la position initiale est nulle
p = cumtrapz(v, temps, initial=0)

plt.plot(temps, p, label="Position")  # Ajout du d'une courbe
plt.ylabel('Position (m)')  # Titre de l'axe y
plt.xlabel("Temps (s)")  # Titre de l'axe x
plt.title("Position")  # Titre du graphique
plt.legend()
plt.grid(True)  # Affichage de la grille
plt.show()  # Affichage d'une courbe

png

On peut voir sur la courbe de la position, la prise d'élan, puis le saut et la réception.