Skip to content

Projet pointeur rouge - projet beta Adimaker 24/25

Notifications You must be signed in to change notification settings

massmr/pid_tracker

Repository files navigation

pid_tracker.py | projet pointeur rouge

Sommaire

Introduction

Présentation

Le projet "pointeur rouge" a été réalisé dans le cadre de nos études.
Il s'inscrit dans le domaine de la robotique et de la computer vision.
Le but est de créer un pointeur laser qui puisse tracker un objet de notre choix de manière autonome.
L'objet à tracker est laissé libre. Ceci nous oblige à explorer les différentes solutions de computer vision.

Objectifs

Domaine : robotique - computer vision;
But : tracker un objet par un laser de manière autonome;
Objet à traquer : au choix de l'équipe;
Décision de l'équipe : zone du corps - main ou tête : à adapter selon algorithme de computer vision.

Contraintes

Budget limite : 150€.

Installation

Hardware

Ordinateur : Raspberry Pi 3, 4;
Controle des moteurs : Module PCA9685;
OS : Raspbery Pi OS.

Matériel

Motorisation : 2* servos 9g;
Laser : diode laser;
Caméra : Pi caméra V2;
Articulation : Pan-tilt impression 3D.

Cloner le repository

git clone [email protected]:massmr/pid_tracker.git

Arborescence du repository

├── README.md
├── haarcascade_frontalface_default.xml
├── pid_tracking.py
└── classes
    ├── __init__.py
    ├── __pycache__
    ├── objCenter.py
    └── pid.py

Les fichiers supplementaires sont présents pour la phase de developpement.

Prérequis

  • python3

Bibliothèques nécessaires

  • imutils : Fournit des fonctions utilitaires pour manipuler les images et simplifier les opérations de traitement d'image avec OpenCV;
  • opencv-python : Utilisé pour le traitement d'image, la détection d'objets et d'autres tâches liées à la vision par ordinateur;
  • adafruit-circuitpython-pca9685: Utilisé pour le controle des servos via protocole PCA9685;
  • numpy : Utilisé pour la gestion des matrices après conversion du flux vidéo;
pip install imutils opencv-python adafruit-circuitpython-pca9685 numpy

Utilisation

Lancement du programme

python3 pid_tracking.py [-c !ou! --cascade] [path_to_haar_file]

Description des fichiers

haarcascade_frontalface_default.xml - Algorithme de détection des visages

Description

haarcascade_frontalface_default.xml contient les paramètres d'un classificateur en cascade Haar spécialement entraîné pour la détection de visages dans des images. Il fait partie des outils d'OpenCV pour la vision par ordinateur et repose sur les caractéristiques haar : des motifs de luminosité permettant de détecter des formes distinctes (comme les yeux, le nez et la bouche) dans une région.

Avantages

Détection rapide et efficace : la cascade de Haar est optimisée pour être rapide, en passant par une série de filtres de plus en plus précis. Calcul peu énergivore : permet d'éviter une surcharge au niveau du processeur du RPI 3, 4.

Limites

Ce modèle est sensible à l’orientation et à l'éclairage, ce qui signifie qu’il peut être moins efficace si les visages sont inclinés ou mal éclairés.

Fonctionnement

Chaque niveau du classificateur vérifie si une région de l’image présente des caractéristiques de visage, filtrant successivement les zones jusqu’à isoler le visage.

Utilisation

Ce fichier est chargé dans OpenCV pour initialiser un détecteur de visages, et il peut ensuite être appliqué sur chaque image ou image vidéo pour détecter des visages en temps réel.

Documentation

https://docs.opencv.org/3.4/d2/d99/tutorial_js_face_detection.html

objCenter.py - Détection de Visages avec OpenCV

Description

ObjCenter est une classe Python conçue pour détecter un objet dans des frames à l'aide de la bibliothèque OpenCV. Ici, elle utilise un classificateur en cascade Haar pour identifier les visages et retourne les coordonnées du centre du visage détecté.

Fonctionnement

La classe suit le processus suivant :

  • Capture de Frame : récupère la frame actuelle.
  • Détection des l’Objet : utilise un classificateur en cascade (chargé depuis le fichier Haar) pour détecter les zones correspondant à l'objet. Si plusieurs objets sont detectés, celui présentant les plus grandes dimensions est isolé. Le postulat suivant est établi : objet le plus grand = objet le plus proche.
  • Calcul du Centre : si un objet est détecté, il calcule et renvoie les coordonnées centrales.

Utilisation

Le fichier objCenter.py est appelé dans le script principal (pid_tracking.py), qui utilise la position du centre de l'objet pour diriger les servos de manière dynamique et ajuster la trajectoire du laser.

pid.py - Régulateur PID "Proportionnel Intégral Dérivé"

Description

pid.py contient une classe de contrôleur PID (Proportionnel Intégral Dérivé) qui aide à stabiliser et à ajuster la position du laser pour suivre l'objet détecté de manière fluide. Le contrôleur PID corrige la position des servos en fonction des erreurs de position accumulées, permettant une réaction douce et progressive aux mouvements de l'objet suivi.

Fonctionnement

Le PID ajuste la position selon trois composants :

  • Proportionnel (P) : ajuste proportionnellement à l'erreur actuelle (distance de l'objet par rapport au centre);
  • Intégral (I) : cumul des erreurs passées pour réduire l'oscillation et atteindre une position stable;
  • Dérivé (D) : tient compte de la variation de l'erreur pour anticiper les corrections nécessaires.

Utilisation

Le fichier est utilisé par le script principal (pid_tracking.py) pour appliquer la correction de position des servos en continu, en tenant compte des données fournies par objCenter.py.

Ressources utiles

https://fr.wikipedia.org/wiki/R%C3%A9gulateur_PID

pid_tracking.py - main script

Description

pid_tracking.py est le script principal du projet qui orchestre le processus complet de suivi de l’objet. Il initialise la caméra, configure les objets de détection et de PID, et met à jour la position des servos pour maintenir l’objet centré en continu.

Fonctionnement

  • Initialisation : charge les bibliothèques, initialise les paramètres de suivi, et configure la caméra.
  • Détection de l’Objet : récupère la frame de la caméra, détecte la position de l'objet avec objCenter.
  • Mise à Jour des Servos : applique les corrections PID pour ajuster la position des servos.
  • Affichage Vidéo : montre la vidéo en temps réel avec la zone de suivi.
  • Nettoyage : ferme et libère les ressources à la fin.