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).
- Lancer l'application phyphox
- Dans capteurs sélectionner "Accélération avec g" ou "Accélération (sans g)"
- Lancer l'acquisition en cliquant sur l'icône play
- Dans le menu hamburger, exporter en CSV
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 |
|
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
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
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
# 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
On peut voir sur la courbe de la position, la prise d'élan, puis le saut et la réception.