logo

Qu'est-ce que l'ADAS ? 

Les voitures modernes deviennent de plus en plus intelligentes grâce aux ADAS (Advanced Driver Assistance Systems) qui améliorent la sécurité routière et rendent la conduite plus confortable. Ces systèmes, utilisant des caméras, des radars et d'autres capteurs, aident dans le contrôle du véhicule, détectent les autres véhicules, les piétons et les signaux des feux de circulation, fournissant au conducteur des informations à jour sur les conditions de la route et l'environnement alentour.

ADAS comprend diverses fonctions telles que le régulateur de vitesse adaptatif, qui ajuste la vitesse de la voiture en fonction du trafic devant, les systèmes de gestion de voie pour maintenir la voiture dans sa voie, le freinage automatique pour prévenir les collisions et les systèmes de stationnement automatique pour faciliter les manœuvres de stationnement. Différents types de capteurs, tels que des caméras, des radars, des lidars et des capteurs ultrasoniques, assurent le fonctionnement de ces systèmes, aidant la voiture à s'adapter aux conditions de la route et au style de conduite du conducteur.

 

Bruit des capteurs dans les ADAS

Les capteurs ADAS, malgré leur modernité et leur complexité, sont sujets aux interférences de bruit. Cela se produit pour plusieurs raisons. Premièrement, l'environnement peut avoir des effets imprévisibles sur les capteurs. Par exemple, la saleté, la poussière, la pluie ou la neige peuvent recouvrir les caméras et les radars, déformant les informations qu'ils reçoivent. C'est comme essayer de regarder à travers un verre sale : tout n'est pas visible et pas aussi clair, et la vue est obstruée par de nombreux artéfacts. Deuxièmement, les limitations techniques des capteurs eux-mêmes peuvent également conduire à du bruit. Par exemple, les capteurs peuvent mal fonctionner dans des conditions de faible luminosité ou dans de forts contrastes lumineux. Cela revient à essayer de discerner quelque chose dans le noir ou à regarder une source lumineuse trop éclatante – dans les deux cas, il devient extrêmement difficile de voir les détails. Lorsque les données reçues des capteurs sont déformées, le système d'assistance au conducteur peut mal interpréter la situation routière, ce qui dans certaines situations peut augmenter le risque d'accidents de la circulation.

 

Simulation du mouvement d'un point dans un système de coordonnées unidimensionnel

Pour commencer, écrivons le code pour simuler le mouvement d'une voiture dans un espace unidimensionnel. Pour exécuter le code, vous devrez configurer un environnement Python et installer les bibliothèques nécessaires.

Voici les étapes pour installer les bibliothèques et exécuter le code :

  1. Pour exécuter le code, vous devrez configurer un environnement Python et installer les bibliothèques nécessaires. Voici les étapes pour installer les bibliothèques et exécuter le code : Installer Python : Si vous n'avez pas encore Python, téléchargez-le et installez-le depuis le site officiel de Python (https://www.python.org/downloads/). Il est recommandé d'utiliser la version 3.x de Python.
  2. Installez les bibliothèques nécessaires : Ouvrez la ligne de commande (sous Windows, cela peut être l'invite de commande ou PowerShell) et exécutez la commande suivante pour installer les bibliothèques :
    pip install matplotlib numpy filterpy
  3. Sauvegardez votre code : Copiez le code que vous avez fourni et enregistrez-le dans un fichier avec l'extension .py (par exemple, simulation.py)
  4. Exécutez le code : Dans la ligne de commande, naviguez jusqu'au répertoire où se trouve votre fichier de code et exécutez-le avec la commande suivante :
    python simulation.py 20 20 500

    Cette commande exécutera le code avec les arguments 20 (pour l'amplitude du bruit), 20 (pour la fréquence du bruit), et 500 (pour le nombre total de points de données sur le graphique). Vous pouvez modifier les valeurs des arguments selon vos besoins.

#
#  Copyright (C) 2024, SToFU Systems S.L.
#  All rights reserved.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License along
#  with this program; if not, write to the Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
import sys
import random
import time

# Named constants
AMPLITUDE_FACTOR = 5.0  # Factor for amplitude in the nonlinear acceleration function
WAVES = 4  # Number of waves in the nonlinear motion model
INITIAL_POSITION = 0  # Initial position
TRUE_VELOCITY_INITIAL = 2.0  # Initial true velocity (changed to float)
TRUE_VELOCITY_INCREMENT = 0.2  # Increment for true velocity (added as a constant)
PREDICTION_INTERVAL = 10  # Interval for predictions
DIM_X = 2  # Dimension of state vector in Kalman filter
DIM_Z = 1  # Dimension of measurement vector in Kalman filter
INITIAL_P_COVARIANCE = 1000  # Initial state covariance for Kalman filter
RANDOM_SEED = 42  # Seed for random number generator

# Initialize random number generator with the current time
random.seed(int(time.time()))  # Using the current time to initialize the random number generator

# Read noise_percentage, noise_probability, and total_points from command line arguments
noise_percentage = float(sys.argv[1]) / 100.0 if len(sys.argv) > 1 else 0.1
noise_probability = float(sys.argv[2]) / 100.0 if len(sys.argv) > 2 else 0.2
total_points = int(sys.argv[3]) if len(sys.argv) > 3 else 2000
interval = PREDICTION_INTERVAL / total_points  # Time interval between data points

# Define a nonlinear acceleration function that varies with time
def nonlinear_acceleration(t):
    # Calculate the amplitude of acceleration based on time
    amplitude = AMPLITUDE_FACTOR * 200.0 * (1 - abs((t % (total_points / WAVES) - (total_points / (2 * WAVES))) / (total_points / (2 * WAVES))))
    # Calculate the nonlinear acceleration based on time and amplitude
    return amplitude * np.sin(2.0 * np.pi * t / (total_points / WAVES))

# Function to add noise to true positions with a given probability
def add_noise(true_positions, probability):
    # Add Gaussian noise to true positions with specified probability
    return [p + np.random.normal(0, scale=noise_percentage * np.mean(true_positions)) if random.uniform(0, 1) <= probability else p for p in true_positions]

# Function to close the animation on pressing the ESC key
def close_animation(event):
    if event.key == 'escape':
        plt.close()

# Function for creating an animation without the Kalman Filter
def animate_without_ekf(i):
    plt.cla()
    # Plot the true position and sensor data up to the current time
    plt.plot(true_positions_nonlinear[:i], color='green', alpha=0.5, label='True Position')
    plt.plot(sensor_positions_with_noise[:i], color='red', alpha=0.5, label='Sensor Data', linewidth=0.5)

    # Set plot limits and labels
    plt.xlim(0, total_points)
    plt.ylim(min(true_positions_nonlinear + sensor_positions_with_noise),
             max(true_positions_nonlinear + sensor_positions_with_noise))
    plt.xlabel('Time (Index)')
    plt.ylabel('Position: X-Axis Coordinate')
    plt.title('Simulation of Nonlinear One-Dimensional Motion')

    # Display the legend
    plt.legend()

# Main entry point of the code
if __name__ == "__main__":
    # Create a figure for the animation
    fig, ax = plt.subplots(figsize=(10, 6))

    # Use connect to add an event handler for key presses
    fig.canvas.mpl_connect('key_press_event', close_animation)

    # Initialize true_positions_nonlinear with the initial position and true_velocity
    true_positions_nonlinear = [INITIAL_POSITION]
    true_velocity = TRUE_VELOCITY_INITIAL

    # Generate true positions based on the nonlinear motion model
    for t in range(1, total_points):
        acc = nonlinear_acceleration(t)
        true_velocity += acc * interval
        true_positions_nonlinear.append(true_positions_nonlinear[-1] + true_velocity * interval)

    # Add noise to true positions to simulate sensor data
    sensor_positions_with_noise = add_noise(true_positions_nonlinear, noise_probability)

    # Create the animation using FuncAnimation
    ani = FuncAnimation(fig, animate_without_ekf, frames=total_points, interval=interval * 1000, repeat=False)

    # Display the animation
    plt.show()

Ceci est une simulation du mouvement d'une voiture dans un espace unidimensionnel :

La voiture se déplace avec une accélération variable, et un capteur mesure la coordonnée X de la voiture. Dans cette simulation, nous ajoutons du bruit aux données du capteur pour prendre en compte les éventuelles erreurs de mesure.

Le code fourni précédemment visualise cette simulation, où la ligne verte représente la position "réelle" de la voiture, et la ligne rouge représente les données du capteur, en tenant compte du bruit ajouté. L'accélération varie dans le temps, créant une simulation plus réaliste du mouvement de la voiture.

Ce code peut être utilisé pour visualiser et analyser différents scénarios de mouvement de voiture, en tenant compte des changements d'accélération et des éventuelles erreurs de capteurs.

Pour simuler un mouvement linéaire, vous pouvez simplement modifier la fonction nonlinear_acceleration(t) pour qu'elle renvoie toujours 0 :

def nonlinear_acceleration(t):
    return 0

Ce changement rendra le mouvement de la voiture linéaire avec une vitesse constante.

 

Le filtre de Kalman

Le Kalman Filter est un algorithme développé par Rudolf E. Kalman en 1960. Cet algorithme permet l'estimation de l'état d'un système dynamique à partir d'un ensemble de mesures incomplètes et bruyantes. Initialement, le Kalman Filter a été développé pour résoudre des problèmes en ingénierie aérospatiale, mais au fil du temps, il a trouvé de larges applications dans divers domaines. L'avantage principal du Kalman Filter est qu'il est récursif, ce qui signifie qu'il utilise les mesures les plus récentes et l'état précédent pour calculer l'état actuel du système. Cela le rend efficace pour le traitement de données en temps réel en ligne.

Le filtre de Kalman a trouvé des applications dans de nombreux domaines, y compris la navigation et le contrôle des véhicules, le traitement du signal, l'économétrie, la robotique, et de nombreux autres domaines où l'estimation de processus variables dans le temps basée sur des données imparfaites ou incomplètes est nécessaire.

Le filtre de Kalman présente plusieurs avantages clés par rapport à d'autres algorithmes d'estimation et de filtrage de données :

  1. Optimalité : Sous certaines conditions (système linéaire, bruit gaussien), le Kalman Filter est optimal en termes de minimisation de l'erreur quadratique moyenne d'estimation.
  2. Efficacité en temps réel : Le Kalman Filter est récursif, ce qui signifie qu'il utilise uniquement les dernières mesures et l'état précédent pour calculer l'état actuel. Cela le rend adapté aux applications en temps réel.
  3. Exigence minimale de mémoire : Puisque le filtre utilise seulement la mesure la plus récente et l'estimation de l'état actuel, il n'a pas besoin de stocker l'ensemble de l'historique des données.
  4. Robustesse aux erreurs de mesure : Le filtre est capable de traiter efficacement les données bruitées, minimisant l'impact des erreurs de mesure aléatoires.
  5. Applications Versatiles : En raison de sa polyvalence, le Kalman Filter a été appliqué dans divers domaines, de l'ingénierie aérospatiale à l'économétrie.
  6. Facilité de mise en œuvre : L'algorithme est relativement facile à comprendre et à mettre en œuvre, le rendant accessible à un large éventail de professionnels.

Implémentons un filtre de Kalman basique pour un capteur mesurant la position de notre voiture, qui se déplace dans un système unidimensionnel avec une vitesse constante mais avec des mesures de capteur bruyantes.

#
#  Copyright (C) 2024, SToFU Systems S.L.
#  All rights reserved.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License along
#  with this program; if not, write to the Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
from filterpy.kalman import KalmanFilter
from filterpy.common import Q_discrete_white_noise
import sys
import random

# Read noise_percentage, noise_probability, total_points from the command line
noise_percentage = float(sys.argv[1]) / 100.0 if len(sys.argv) > 1 else 0.1
noise_probability = float(sys.argv[2]) / 100.0 if len(sys.argv) > 2 else 0.2
total_points = int(sys.argv[3]) if len(sys.argv) > 3 else 2000
interval = 10 / total_points

# Initialize true positions and velocity
true_positions_linear = [0]
true_velocity = 2

for t in range(1, total_points):
    true_positions_linear.append(true_positions_linear[-1] + true_velocity * interval)

# Function to add noise to true positions
def add_noise(true_positions, probability):
    return [p + np.random.normal(0, scale=noise_percentage * np.mean(true_positions))
            if random.uniform(0, 1) <= probability else p for p in true_positions]

sensor_positions_with_noise = add_noise(true_positions_linear, noise_probability)

# Initialize Kalman Filter (KF)
kf = KalmanFilter(dim_x=2, dim_z=1)
kf.F = np.array([[1, interval],
                 [0, 1]])
kf.H = np.array([[1, 0]])
kf.P *= 1000
kf.R = noise_percentage * np.mean(true_positions_linear)
kf.Q = Q_discrete_white_noise(dim=2, dt=interval, var=0.001)

x = np.array([[sensor_positions_with_noise[0]],
              [0]])
kf_positions = [x[0, 0]]

# Function to update Kalman Filter with sensor data
def update_kalman_filter(z):
    kf.predict()
    kf.update(z)
    return kf.x[0, 0]

# Function to create an animation with Kalman Filter (KF) estimation
def animate_with_kalman(i):
    plt.cla()
    plt.plot(true_positions_linear[:i], color='green', alpha=0.5, label='True Position')
    plt.plot(sensor_positions_with_noise[:i], color='red', alpha=0.5, linewidth=0.5, label='Sensor Data')

    if i < total_points:
        kf_estimate = update_kalman_filter(sensor_positions_with_noise[i])
        kf_positions.append(kf_estimate)

    plt.plot(kf_positions[:i + 1], color='blue', alpha=0.5, label='Kalman Filter (KF) Estimate')

    plt.xlim(0, total_points)
    plt.ylim(min(true_positions_linear + sensor_positions_with_noise),
             max(true_positions_linear + sensor_positions_with_noise))
    plt.xlabel('Time (Index)')
    plt.ylabel('Position: X-Axis Coordinate')
    plt.title('Simulation of Linear One-Dimensional Motion with Kalman Filter (KF)')
    plt.legend()

# Main entry point
if __name__ == "__main__":
    # Create a figure and animation
    fig, ax = plt.subplots(figsize=(10, 6))
    ani = FuncAnimation(fig, animate_with_kalman, frames=total_points, interval=interval * 1000, repeat=False)

    # Display the animation
    plt.show()

 

Comme on peut le voir, le Kalman Filter est bien adapté pour une utilisation dans des systèmes linéaires même en présence de bruit intense. Cependant, le mouvement de la voiture n'est pas linéaire ; la voiture accélère avec des magnitudes et des directions variables.

Complichons un peu notre code en rendant le mouvement de la voiture non linéaire et en introduisant une accélération variable. Pour simplifier et clarifier, nous utiliserons une fonction sinusoïdale pour modéliser l'accélération. Nous conserverons le même niveau de bruit.

Comme nous pouvons le voir, le filtre de Kalman classique n'est pas adapté aux modèles non linéaires. Pour ces cas, le Extended Kalman Filter (EKF) a été développé.

 

Filtre de Kalman Étendu (EKF)

Le Extended Kalman Filter (EKF) est une modification du filtre de Kalman classique conçu pour fonctionner avec des systèmes non linéaires. Alors que le filtre de Kalman standard est destiné aux systèmes linéaires, l'EKF étend son applicabilité pour gérer les cas non linéaires.

Le Extended Kalman Filter a été développé après le Kalman Filter original, introduit par Rudolf Kalman en 1960. Il est apparu suite aux efforts des ingénieurs et des scientifiques pour adapter le Kalman Filter à l'utilisation avec des systèmes non linéaires, notamment dans les domaines de l'aéronautique et de la navigation maritime dans les années 1960 et 1970. La date précise de sa création et les auteurs spécifiques sont moins bien connus, car l'EKF a évolué progressivement et dans le cadre de divers groupes de recherche.

Le filtre de Kalman étendu (EKF) est largement utilisé dans les tâches où l'estimation d'état des systèmes décrits par des équations non linéaires est nécessaire. Ses principaux domaines d'application incluent la robotique (pour estimer la position et l'orientation des robots), l'industrie automobile (dans les systèmes de conduite autonome et la navigation), l'ingénierie aérospatiale (pour la navigation orbitale des satellites et des engins spatiaux), les communications mobiles, et de nombreux autres domaines techniques et d'ingénierie.

Les principales différences entre le Extended Kalman Filter (EKF) et le standard Kalman Filter résident principalement dans la manière dont ils gèrent la dynamique et les mesures du système.

Les principales distinctions incluent les éléments suivants :

  • Gestion de la non-linéarité : Le filtre de Kalman standard suppose que la dynamique du système et le processus de mesure sont linéaires. Cela signifie que les fonctions de transition d'état et de mesure peuvent être représentées sous forme de matrices linéaires. Le filtre de Kalman étendu (EKF) est conçu pour fonctionner avec des systèmes non linéaires. Au lieu de matrices linéaires, il utilise des fonctions non linéaires pour décrire la dynamique du système et le processus de mesure.
  • Linéarisation : Dans l'EKF, la linéarisation est utilisée pour approximer des fonctions non linéaires, typiquement par une expansion en série de Taylor du premier ordre autour de l'estimation de l'état actuel. Cela fournit des contreparties linéarisées des fonctions de transition d'état et de mesure, qui sont ensuite utilisées dans le filtre.
  • Fonctions de Transition d'État et de Mesure : Dans le filtre de Kalman standard, les fonctions de transition d'état et de mesure sont représentées par des matrices (par exemple, matrice de transition d'état et matrice de mesure). Dans l'EKF, ces fonctions peuvent être n'importe quelles fonctions non linéaires différentiables. Cela ajoute de la flexibilité mais augmente également la complexité et les exigences computationnelles.
  • Complexité Computationnelle : L'EKF nécessite une complexité computationnelle plus élevée en raison de la nécessité de linéariser des fonctions non linéaires et des calculs subséquents.

La principale différence entre le Extended Kalman Filter et le standard est sa capacité à travailler avec des systèmes non linéaires en utilisant des fonctions non linéaires et leur linéarisation.

#
#  Copyright (C) 2024, SToFU Systems S.L.
#  All rights reserved.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License along
#  with this program; if not, write to the Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
from filterpy.kalman import KalmanFilter
from filterpy.common import Q_discrete_white_noise
import sys
import random

# Named constants
AMPLITUDE_FACTOR = 5.0  # Factor for amplitude in the nonlinear acceleration function
WAVES = 4  # Number of waves in the nonlinear motion model
INITIAL_POSITION = 0  # Initial position
TRUE_VELOCITY_INITIAL = 2.0  # Initial true velocity (changed to float)
TRUE_VELOCITY_INCREMENT = 0.2  # Increment for true velocity (added as a constant)
PREDICTION_INTERVAL = 10  # Interval for predictions
DIM_X = 2  # Dimension of state vector in Kalman filter
DIM_Z = 1  # Dimension of measurement vector in Kalman filter
INITIAL_P_COVARIANCE = 1000  # Initial state covariance for Kalman filter

# Initialize random number generator with the current time
random.seed()

# Read noise_percentage, noise_probability, and total_points from command line arguments
noise_percentage = float(sys.argv[1]) / 100.0 if len(sys.argv) > 1 else 0.1
noise_probability = float(sys.argv[2]) / 100.0 if len(sys.argv) > 2 else 0.2
total_points = int(sys.argv[3]) if len(sys.argv) > 3 else 2000
interval = PREDICTION_INTERVAL / total_points  # Time interval between data points

# Define a nonlinear acceleration function that varies with time
def nonlinear_acceleration(t):
    # Calculate the amplitude of acceleration based on time
    amplitude = AMPLITUDE_FACTOR * 200.0 * (1 - abs((t % (total_points / WAVES) - (total_points / (2 * WAVES))) / (total_points / (2 * WAVES))))
    # Calculate the nonlinear acceleration based on time and amplitude
    return amplitude * np.sin(2.0 * np.pi * t / (total_points / WAVES))

# Function to add noise to true positions with a given probability
def add_noise(true_positions, probability):
    # Add Gaussian noise to true positions with specified probability
    return [p + np.random.normal(0, scale=noise_percentage * np.mean(true_positions)) if random.uniform(0, 1) <= probability else p for p in true_positions]

# Function to update the Extended Kalman Filter (EKF) with sensor measurements
def update_extended_kalman_filter(z):
    ekf.predict()  # Predict the next state
    ekf.update(z)  # Update the state based on sensor measurements
    return ekf.x[0, 0]  # Return the estimated position

# Функция для закрытия анимации при нажатии клавиши ESC
def close_animation(event):
    if event.key == 'escape':
        plt.close()

# Function for creating an animation with EKF estimates
def animate_with_ekf(i):
    plt.cla()
    # Plot the true position and sensor data up to the current time
    plt.plot(true_positions_nonlinear[:i], color='green', alpha=0.5, label='True Position')
    plt.plot(sensor_positions_with_noise[:i], color='red', alpha=0.5, label='Sensor Data', linewidth=0.5)

    if i < total_points:
        # Update the EKF with the current sensor measurement and obtain the estimate
        ekf_estimate = update_extended_kalman_filter(sensor_positions_with_noise[i])
        ekf_positions.append(ekf_estimate)

    # Plot the EKF estimate up to the current time
    plt.plot(ekf_positions[:i + 1], color='purple', alpha=0.5, label='Extended Kalman Filter (EKF) Estimate')

    # Set plot limits and labels
    plt.xlim(0, total_points)
    plt.ylim(min(true_positions_nonlinear + sensor_positions_with_noise),
             max(true_positions_nonlinear + sensor_positions_with_noise))
    plt.xlabel('Time (Index)')
    plt.ylabel('Position: X-Axis Coordinate')
    plt.title('Simulation of Nonlinear One-Dimensional Motion with Extended Kalman Filter (EKF)')
    plt.legend()

# Main entry point of the code
if __name__ == "__main__":
    # Create a figure for the animation
    fig, ax = plt.subplots(figsize=(10, 6))

    # Используйте connect для добавления обработчика событий
    fig.canvas.mpl_connect('key_press_event', close_animation)

    # Initialize true_positions_nonlinear with the initial position and true_velocity
    true_positions_nonlinear = [INITIAL_POSITION]
    true_velocity = TRUE_VELOCITY_INITIAL

    # Generate true positions based on the nonlinear motion model
    for t in range(1, total_points):
        acc = nonlinear_acceleration(t)
        true_velocity += acc * interval
        true_positions_nonlinear.append(true_positions_nonlinear[-1] + true_velocity * interval)

    # Add noise to true positions to simulate sensor data
    sensor_positions_with_noise = add_noise(true_positions_nonlinear, noise_probability)

    # Initialize an Extended Kalman Filter (EKF)
    ekf = KalmanFilter(dim_x=DIM_X, dim_z=DIM_Z)
    ekf.F = np.array([[1, interval],
                    [0, 1]])
    ekf.H = np.array([[1, 0]])
    ekf.P *= INITIAL_P_COVARIANCE
    ekf.R = noise_percentage * np.mean(true_positions_nonlinear)

    ekf_x = np.array([[sensor_positions_with_noise[0]],
                    [0]])
    ekf_positions = [ekf_x[0, 0]]

    # Create the animation using FuncAnimation
    ani = FuncAnimation(fig, animate_with_ekf, frames=total_points, interval=interval * 1000, repeat=False)

    # Display the animation
    plt.show()

Appliquez le Filtre de Kalman Étendu pour un mouvement non linéaire.

Maintenant, augmentons considérablement le niveau de bruit du capteur.

Comme nous pouvons le voir, le Extended Kalman Filter fonctionne bien même dans les cas de données fortement bruitées.

 

Matériaux supplémentaires

 

Conclusion

Le Extended Kalman Filter (EKF) est un outil puissant pour estimer l'état des systèmes dynamiques, surtout lorsque cette estimation doit être basée sur des données provenant de plusieurs capteurs simultanément. Un des principaux avantages de l'EKF est sa capacité à intégrer des informations provenant de diverses sources, ce qui le rend extrêmement utile dans les systèmes complexes tels que les systèmes de navigation automobile, la robotique ou l'ingénierie aérospatiale.

Compte tenu des données bruyantes et souvent imparfaites provenant de différents capteurs, l'EKF est capable de fusionner ces données en un ensemble unifié, fournissant une estimation de l'état plus précise et fiable. Par exemple, dans une voiture, l'EKF peut utiliser les données GPS pour déterminer la position et les données de l'accéléromètre pour calculer la vitesse et l'accélération, créant ainsi une image plus complète du mouvement du véhicule.

Le Extended Kalman Filter (EKF) est capable de réduire l'incertitude globale résultant du bruit et des erreurs de chaque capteur individuel. Étant donné que ces erreurs sont souvent non corrélées, leur traitement conjoint dans l'EKF permet d'obtenir des estimations plus stables et précises. Il convient également de noter que l'EKF présente une grande robustesse : en cas de problème avec l'un des capteurs, le système peut continuer à fonctionner en s'appuyant sur les données des autres capteurs restants. Cela rend l'EKF particulièrement précieux dans les applications critiques où la fiabilité et la précision sont de la plus haute importance. Un autre aspect important lors de l'utilisation de plusieurs capteurs est la synchronisation temporelle des mesures. L'EKF gère habilement ces différences temporelles, assurant une fusion correcte des données.

Grâce à sa capacité à agréger et analyser des informations provenant de multiples sources, le EKF est un outil inestimable dans les domaines où une estimation d'état de haute précision est nécessaire dans des conditions d'incertitude et de changements dynamiques.

En conclusion, le logiciel de lutte contre le bruit des capteurs est un processus difficile qui englobe des méthodes statiques, statistiques et l'application de l'intelligence artificielle pour la classification et l'atténuation des types de bruit.

Notre entreprise possède une expertise substantielle dans la gestion des problèmes de bruit de capteur.

Pour toute question concernant cet article, n'hésitez pas à nous contacter à articles@stofu.io.

Pour des opportunités de collaboration, vous pouvez nous contacter à info@stofu.io.

Tous les fichiers de code sont disponibles dans notre dépôt : https://github.com/SToFU-Systems/EKF_Usage.

Je vous souhaite tout le meilleur,

Équipe des systèmes SToFU 

https://stofu.io