Ce README servira davantage de feuille de route/journal de bord qu'un README classique. Les quelques documents pouvant être utiles seront tout de même répertoriés ici.
Lors de la réunion de début de stage (01-06-2023), le projet de stage et de simulation a été présenté de la manière suivante :
L'objectif est de simuler une foule en 2D en utilisant des modèles physiques existants. Cependant, il est nécessaire de paralléliser autant que possible la simulation en utilisant CUDA dans un premier temps.
- Étude de modèles de foule -> Théorie mathématique
- Congestion du trafic routier
- Simulations principalement réalisées avec MatLab, ce qui limite l'optimisation des calculs et n'autorise aucune parallélisation.
- La taille de la population influence la qualité des résultats. Plus elle est importante, plus les résultats sont intéressants.
- Simulation uniquement en 2D
- Plusieurs façons de procéder avec de nombreux modèles mathématiques
Il existe des simulations basées sur des particules pour cela, mais nous n'utiliserons pas ces modèles.
- Nous optons pour un fonctionnement basé sur une grille (avec des "roomels" - éléments de la pièce - d'une dimension de 1, mais cela n'a pas d'importance).
- Chaque roomel ne peut contenir qu'une seule personne et elles ne peuvent pas se comprimer.
- Dans un premier temps, nous avons une distribution aléatoire d'individus dans la pièce.
- Les individus ont pour objectif de sortir de la pièce et ils se déplacent tous à la même vitesse.
Lors du déplacement, il peut y avoir des situations problématiques, si une personne est déjà présente sur la case, ou si on rencontre un mure. Il faut donc prévoire ces cas.
- Ne rien faire.
- Prendre une case voisine au hasard.
- Prendre la case voisine la plus proche.
Même si, dans la vraie vie, nous avons tendance à privilégier les personnes les plus proches de la sortie.
Pour le mélange, nous pouvons mélanger un tableau d'indices pointant vers les individus.
Le programme se divise en trois étapes principales : l'initialisation, la simulation et le retour. Au sein de la simulation, plusieurs sous-étapes sont réalisées à chaque frame, telles que le mélange des individus et l'application du modèle. Le programme comporte également des paramètres de simulation, des constantes de simulation et des variables de support. Le choix du modèle dépend de plusieurs paramètres, tels que le domaine (continu ou discret), l'utilisation d'un arbre de coûts et le comportement vis-à-vis des obstacles. Différents modèles sont disponibles, tels que l'actuel, le "sage ignorant", le RNG, l'impatient ignorant, le meilleur coût, le meilleur coût avec déplacement forcé et le conne de vision. Le coût peut être calculé en effectuant une inondation à partir de la sortie, et un balayage en deux passes permet d'obtenir un coût optimal. Les individus choisiront donc une case voisine ayant un coût inférieur ou égal.
---
title : Structure du programme
---
flowchart TB;
subgraph principal
direction LR
a[Initialisation] --> b[Simulation] --> c[Retour]
b -->sB
c -->sC
a -->sA
end
subgraph sA [Paramètres]
sa1[Variables de Simulation]
sa3[Constante de Simulation]
sa2[Variables de support]
sa4[Choix du model]
end
subgraph sB [Pour chaque frame]
direction TB
sb1[Shuffle des individue] -->sb2
sb2[Applicaiton du model] --> |Pour chaque individu| sb2
end
subgraph sC [Retour]
sc1[Temps de caclul]
sc2[Congestion]
sc3[Annimation]
end
---
title : Models
---
flowchart TB;
a([Domaine])
b1([Coûts])
b2([Coûts])
c12([Comportement])
c22([Comportement])
c21([Comportement])
m11[Actuel]
m12["Sage
Ignorant"]
m21[Rng]
m22["Imptiant
Ignorant"]
m3[Meilleur coût]
m4["Meilleur coût
& Déplacement"]
m5[Forcée]
m6[Conne de vision]
a -->|Continue| b1
a -->|Discret| b2
b1 -->|Sans| c12
b2 -->|Sans| c22
b2 -->|Avec| c21
c12 -->|Attendre| m11
c22 -->|Attendre| m12
c12 -->|Random| m21
c22 -->|Random| m22
c21 -->|Meilleur coût| m3
c21 -->|Meilleur coût + Déplacement| m4
c22 -->|Forcée| m5
c22 -->|Conne de vision| m6
Le rendu final n'est pas une priorité. Nous pourrions générer des fichiers binaires qui seront lus par un programme Processing pour produire des images ou des vidéos. Le programme doit être modifiable à l'aide de fichiers de configuration au format JSON. Nous devons également pouvoir récupérer des données de sortie (tableau de fichiers binaires).
Pour linux :
apt install nvidia-cuda-toolkit
Puis avec CMake nous allons généré le projet.
cmake CMakeLists.txt
make
Dans un premier temps, j'ai commencé par créer un programme qui implémente ce que nous avons décrit, mais uniquement en utilisant le CPU. La documentation détaillée de ce programme est disponible dans le fichier onlyCPU.md.
Cepandant dans un premier temps vous pouvez essayer le programme onlyCPU
sur votre propre machine. Elle doit néanmoins être équipé d'un terminal et de bach.
La bibliothèque HDF5 (Hierarchical Data Format 5) est utilisée pour stocker et organiser de grandes quantités de données de manière efficace et structurée. Elle offre des fonctionnalités avancées telles que la compression des données, l'indexation, la gestion des métadonnées et la possibilité de travailler avec des ensembles de données hiérarchiques. HDF5 est largement utilisée dans le domaine de la science, de la recherche et de l'analyse de données pour gérer et échanger des données complexes, volumineuses et multidimensionnelles, offrant une solution flexible et performante pour le stockage et la manipulation de données. Elle est utilisé dans ce projet pour exporter chaque frames de la simulation en perdant le moins de temps possible.
Pour installer HDF5 sur Ubuntu, vous pouvez suivre les étapes suivantes :
-
Mettez à jour les référentiels de packages en exécutant la commande suivante :
sudo apt update
-
Installez le package HDF5 en utilisant la commande suivante :
sudo apt install libhdf5-dev
-
Une fois l'installation terminée, vous pouvez vérifier la version installée en exécutant la commande suivante :
h5cc -showconfig
Cette commande affichera les informations sur la bibliothèque HDF5 installée, y compris sa version. La version minimale requise est la 1.10.x.
Pour installer OpenCV sur Ubuntu, vous pouvez suivre les étapes suivantes :
-
Mettre à jour les paquets existants :
sudo apt update
-
Installer les dépendances nécessaires à OpenCV :
sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
-
Installer les bibliothèques et les outils de développement spécifiques à l'image et à la vidéo :
sudo apt install libjpeg-dev libpng-dev libtiff-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev
-
Accéder au répertoire OpenCV du projet:
-
Créer un répertoire de construction :
mkdir build cd build
-
Générer les fichiers de configuration CMake :
cmake ..
-
Compiler les sources :
make -j$(nproc)
-
Installer OpenCV sur votre système :
sudo make install
Une fois ces étapes terminées, OpenCV sera installé sur votre système Ubuntu. Vous pouvez maintenant utiliser la bibliothèque OpenCV dans vos projets C++ en incluant les en-têtes nécessaires et en liant les bibliothèques lors de la compilation.
Attention il faut le codec gif :
-
Ouvrez un terminal.
-
Mettez à jour les packages disponibles en exécutant la commande suivante :
sudo apt update
-
Installez le paquet
ffmpeg
qui contient le codec nécessaire pour le format GIF :sudo apt install ffmpeg
Une fois l'installation terminée, le codec GIF devrait être installé sur votre système Ubuntu, et OpenCV devrait être capable d'encoder les fichiers GIF correctement.
À faire
- Réalisation du fichier README.md
- Explication du projet
- Refaire le fichier
gitignore
de manière approp - Créer un fichier Makefile.
- finir les export au propre (image)
- liste d'attente de chaque individu
- gestion des murs
- carte des couts
- mettre en place un nouveau model (model avec calcul de distance des case voisines les plus proche)
- parsseur d'images pour la création d'une map
- version "mac" CPU
- Le Pin qui n'est pas bon dans le model 2 -> po de gestion de la fin // annimation C'était un problème lors de la création de la vidéo. j'enregistrais 2 frame a chaque fois.
- Trop gourmand en ressource quand on fait des grosse vidéo
- La sortie n'apparait pas toujours -> ordre de plot dans la fonction qui créer les frames.
- J'affiche des var de debg a la fin du programme -> supprimé.
- Maybee faire l'inondation sur GPU ? C'est long avec des grosse matrice.
La doc de la verion la plus aboutie qui peut tourner sous mac est ici src/gpuObjectVersion/README.md