Skip to content
Snippets Groups Projects
Commit 19457ec8 authored by simon.fanetti's avatar simon.fanetti
Browse files

add doc

parent 3bd33937
Branches
No related tags found
No related merge requests found
Showing
with 644 additions and 0 deletions
% !TeX spellcheck = fr_FR
\thispagestyle{noheader}
\chapter*{Résumé} % No (numbered) toc entry with *
\addcontentsline{toc}{chapter}{Résumé} % Adding toc entry
\thispagestyle{noheader}
\vspace{118pt}
\begin{center}
{\Large < Insérez ici la page d’énoncé complété et signé\\*[-0.8em]
par l’enseignant-e responsable (cf. feuille de style fournie) >\\*[1em]
(obligatoire)\\*[1em]
\textit{Attention : Tout l’énoncé doit tenir sur une seule page}}
\end{center}
\ No newline at end of file
% !TeX spellcheck = fr_FR
\chapter*{Remerciements} % No (numbered) toc entry with *
\addcontentsline{toc}{chapter}{Remerciements} % Adding toc entry
\textit{< Formulez ici vos remerciements aux personnes qui vous ont aidé dans la réalisation de votre travail. >}
\ No newline at end of file
% !TeX spellcheck = fr_FR
\printnoidxglossary[type=\acronymtype,title={Liste de acronymes}]
% Use the acronyms
\vspace{5cm}
\textit{NB : Vous pouvez utiliser des acronymes en les définissant dans le fichier externe \texttt{/glossary/acronyms}. Une page dans la table des matières sera automatiquement ajoutée. Vous pourrez ensuite les référencer dans votre texte comme dans l'exemple ci-après:}\medskip
\gls{utc} is 3 hours behind \gls{adt} and 10 hours ahead of \gls{est}.\medskip
\textit{Lors de la première déclaration, l'acronyme est accompagné de sa définition, mais lors des utilisations suivantes, il ne l'est plus, comme illustré ci-dessous:}\medskip
\gls{utc} is 3 hours behind \gls{adt} and 10 hours ahead of \gls{est}.
\ No newline at end of file
% !TeX spellcheck = fr_FR
\addcontentsline{toc}{chapter}{Annexes} % Adding toc entry
%%% COMMENT THESES LINES IF YOU DO NOT USE DEDICATED TOC FOR ANNEXES
\stopcontents[default]
\resumecontents[annexes]
%%% /COMMENT THESES LINES IF YOU DO NOT USE DEDICATED TOC FOR ANNEXES
\chapter*{Annexes}
\begin{center}
\textit{Imprimer idéalement cette page sur une page de couleur.}
\textit{Chaque annexe doit commencer sur une nouvelle page et doit être numérotée : Annexe 1 puis Annexe 2, etc.}
\end{center}
\chapter*{Annexe 1}
\addcontentsline{toc}{chapter}{Annexe 1}
\chapter*{Annexe 2}
\addcontentsline{toc}{chapter}{Annexe 2}
\chapter*{Annexe 3}
\addcontentsline{toc}{chapter}{Annexe 3}
%%% COMMENT THESES LINES IF YOU DO NOT USE DEDICATED TOC FOR ANNEXES
\stopcontents[annexes]
\resumecontents[default]
%%% /COMMENT THESES LINES IF YOU DO NOT USE DEDICATED TOC FOR ANNEXES
\ No newline at end of file
% !TeX spellcheck = fr_FR
\chapter*{Liste des annexes} % No (numbered) toc entry with *
\addcontentsline{toc}{chapter}{Liste des annexes} % Adding toc entry
\printcontents[annexes]{ }{2}{}
\ No newline at end of file
\chapter{Architecture logicielle}
\section{Librairies}
\begin{figure}[H]
\centering
\includegraphics[scale=0.5]{archi_sandbox_api.jpg}
\end{figure}
Dans cette architecture, les classes sont assez représentatives de l'infrastructure réelle. Nous avons Beamer qui représente les informations liées au vidéoprojecteur et méthodes liées à l'étape de configuration. Elle contient aussi FrameProcessProfil, qui est un profil contenant des informations liées au traitement d'images et est utilisé lors de configuration de la librairie. Camera est l'interface utilisant la librairie realsense 2, permettant l'utilisation de la camera Intel. Elle est notamment utilisée par Beamer.
\\
Ensuite nous avons Projection, qui contient les traitements nécessaires à appliquer à une image projetée. Puis il y a SandboxConfig, qui est une classe permettant de lire et écrire les informations liées à la configuration de la librairie dans un fichier yaml.
\\
Enfin nous avons les interfaces de la librairie sandbox, respectivement Sandbox pour les applications utilisateur et SandboxSetup pour les applications permettant génération de la configuration utilisée par Sandbox.
\section{API Sandbox}
Sandbox instancie Camera, Beamer et Projection et fait le lien entre le tout. Elle va s'occuper de fournir de quoi initlialiser la camera et charger la configuration. Elle fournira les méthodes permettant de récupérer les images de profondeur et de couleur de la camera adaptées à la zone d'affichage du vidéoprojecteur, et de quoi ajuster une image à projeter sur le bac à sable.
\section{API SandboxSetup}
SandboxSetup instancie aussi Camera, Beamer et Projection et permet d'accéder aux méthodes de configuration de la librairie. Elle permet de déterminer les variables liées à l'infrastructure qui serviront à avoir un rendu correcte sur le bac à sable. Hormis le fait que nous n'allons pas utiliser les méthodes de traitement d'images de Projection, Camera et Beamer seront solicités pour déterminer la position du Beamer par rapport à la caméra et pour récupérer les images capturés sans traitement. Une fois que la configuration déterminé, SandboxConfig permettra de la sauvegarder.
\section{Application de calibration}
Pour faciliter la génération du fichier de configuration, il a fallut faire une application plus sympa pour l'utilisateur. L'application de configuration utilise la librairie SandboxSetup et est basé sur le framework Qt.
\begin{figure}[H]
\centering
\includegraphics[scale=0.4]{archi_setup_app.jpg}
\end{figure}
Cette application est basé sur MainWindow, qui sera l'interface parent tout au long de la procédure de configuration. Elle instancie SandboxSetup, afin qu'elle puisse utiliser l'infrastructure du bac à sable, et toutes les classes héritant de SubApp. SubApp représente une étape de la configuration, donc chaque classes en héritant, correspondra à une phase de la configuration. En l'occurence les classes InitCameraGui, MonitorGui, ProjectionGui, CameraFocusGui, CroppingMaskGui, BeamerLocationGui et SaveConfigGui.
\\
InitCameraGui sert à initialiser la caméra et vérifier qu'elle soit disponible. MonitorGui sert à sélectionner la sortie correspondant au vidéoprojecteur et sa résolution. ProjectionGui sert à correctement placer le vidéoprojecteur et la caméra. CameraFocusGui permet d'établir le FrameProcessProfil qui contient des valeurs permettant un meilleur rendu de l'image capturée par la caméra. CroppingMaskGui permet de déterminer la matrice de rotation et la zone intéréssante dans les images de la caméra, qui seront utilisées lors de l'ajustement de l'image projetée. BeamerLocationGui permet d'executer la routine permettant d'établir la position du vidéoprojecteur. Enfin SaveConfigGui permet de sauvegarder la configuration dans un fichier.
\section{Applications utilisateur}
Lorsqu'un utilisateur veut utiliser la librairie Sandbox, il devra toujours passer par ces étapes.
\begin{figure}[H]
\centering
\includegraphics[scale=0.4]{sandbox_activity_diagram.jpg}
\end{figure}
Il devra initialiser la librairie pour s'assurer que l'infrastructure est disponible. Puis charger la configuration et s'assurer qu'elle soit présente, pour ensuite exécuter son application avec la confirmation que la librairie fonctionnera correctement.
\chapter{Besoins et Fonctionnalités}
\section{Définition des besoins}
La librairie doit permettre à l'utilisateur de l'utiliser simplement en l'important dans son projet. Il faut réduire sa complexité en :
\begin{itemize}
\item supprimant l'architecture client-serveur
\item retirant l'affichage de librairie et la délégant à l'application utilisateur
\end{itemize}
Il faut aussi :
\begin{itemize}
\item faciliter la calibration pour l'utilisateur
\item sauvegarder la configuration pour la rendre persistante
\item améliorer la précision de l'affichage d'une image
\item améliorer les performances de la librairie
\end{itemize}
\section{Fonctionnalités}
La librairie devra être séparé en deux parties distinctes. Une devra fournir les fonctionnalités de calibration de la librairie, et l'autre devra fournir les fonctionnalités d'utilisation de la librairie.
\begin{itemize}
\item Librairie d'utilisation
\begin{itemize}
\item capture les photos de profondeurs et couleurs avec la camera
\item ajuste une image à projeter sur le bac à sable
\item charge la configuration depuis le fichier
\item initialise le bac à sable
\end{itemize}
\item Librairie de calibration
\begin{itemize}
\item charge certaines informations du fichier de config si disponible
\item fournit les methodes de calibration
\item sauve la config dans un fichier
\end{itemize}
\end{itemize}
Il faudra aussi fournir une application de calibration qui produira un fichier de configuration pour faciliter la calibration de la librairie avec son environnement et ne pas devoir la répéter à chaque utilisations de la librairie d'usage. L'application utilisera la librairie de calibration.
% !TeX spellcheck = fr_FR
\chapter*{Conclusion}
\addcontentsline{toc}{chapter}{Conclusion} % Adding toc entry
Les paysagistes et architectes peinent à modifier leurs maquettes une fois qu’elles sont créées. C’est pourquoi nous proposons de mettre à disposition un bac à sable de réalité augmentée qui leur servira de substitue à leur maquette tant que leurs plans ne sont pas définitifs. Les diverses applications basées sur le bac utiliseront l’API C++ refaite, permettant une utilisation similaire aux autres librairies C++ standard. Grâce à l’amélioration de la précision et de l’affichage de la librairie, les applications seront plus justement rendues. De plus, comme la librairie nécessite des données de configuration, une application de calibration a été créée afin qu’il soit plus facile de saisir ces données en cas de configuration et qu’il ne soit plus nécessaire de le faire à chaque utilisations.\\
Ce travail m’a permis de développer des compétences avec le langage C++ et le framework Qt. Ainsi que de me pousser à mieux maîtriser la librairie OpenCV durant la phase d’optimisation et d’avoir une introduction à l’utilisation d’outils de profiling. J’ai aussi appris à tout d’abord réaliser une solution fonctionnelle avant de l’améliorer, comme ce fut le cas lors de l’utilisation de la librairie xrandr.
\section{Amélioration}
La manière de déterminer la matrice de rotation pourrait être revue, afin de prendre en compte le centre du rectangle dessiné par l’utilisateur lors de la phase de calibration, cela permettrait à la mise en place du vidéoprojecteur d’être un peu plus permissive. De plus, il serait judicieux d’essayer d’améliorer la vitesse de l’application des filtres sur les images prises par la caméra. Puis, l’amélioration de la vitesse d’ajustement d’une image projetée permettra d’améliorer la réactiver des applications utilisateurs. Ensuite, les différentes données de calibration pourraient toutes être regroupées dans une classe de calibration. Finalement, nous pourrions faciliter l’installation de la librairie, afin de permettre aux développeurs C++ d’inclure la librairie comme tout autre librairie système. Mais encore, la présence direct d’un exécutable pour l’application de calibration et la possibilité de choisir le lieu de sauvegarde du fichier de configuration en fin de calibration.\\
Donc je pense que globalement le projet est stable et que la prochaine étape est l’amélioration des performances et la facilitation de l’expérience utilisateur/développeur. Ainsi, les différents projets de réalité augmentée utilisant le bac à sable et la librairie pourront voir le jour.
\chapter{Description du dispositif}
Le projet utilise une camera pour récupérer la topologie du bac à sable qui nous permettra d'ajuster en conséquence l'image à projetée par le vidéoprojecteur sur le bac à sable.
\begin{figure}[H]
\centering
\includegraphics[scale=0.5]{dispositif.jpg}
\end{figure}
Dans notre cas, nous utilisons la camera Intel D415 avec la librairie realsense 2.
\\\\
Le but de la librairie sandbox est de fournir les images de couleurs et de profondeurs transmisent par la caméra correspondant à la zone d'affichage du vidéoprojecteur.
\begin{figure}[H]
\centering
\includegraphics[scale=0.35]{camera_zones.jpg}
\end{figure}
Elle doit aussi adapter l'affichage d'une image projetée par rapport au point de vue du vidéoprojecteur.
\begin{figure}[H]
\centering
\includegraphics[scale=0.4]{adjust_pixel.jpg}
\end{figure}
Si on ne corrige pas l'image projetée, on aura un décalage des pixels. Par défaut le pixel orange sera projetée à la position bleu. Tandis qu'avec la correction, il sera à la position orange. Le plan sur lequel les points rouge et vert sont alignés nous sert de base pour l'ajustement.
\\\\
Il faut aussi corriger la rotation de la projection pour que la zone affichée corresponde à celle de la camera, car le vidéoprojecteur ne sera pas forcément toujours bien positionné.
\begin{figure}[H]
\centering
\includegraphics[scale=0.4]{rotation.jpg}
\end{figure}
\chapter{Etude de l'existant}
Le projet duquel est inspiré celui-ci était une application qui permettait l'utilisation du bac en réalité augmentée. Malheureusement, il était impossible de partir de ce projet pour faire d'autres applications.
\\
Dans la version précédente réalisé par mon prédécesseur, le but était faire une première version de la librairie.
\begin{figure}[H]
\centering
\includegraphics[scale=0.3]{old_lib_srv.jpg}
\end{figure}
Cette version de la librairie est basé sur une architecture client-serveur et était encore trop lié à l'application. Il fallait donc vraiment dissocier l'API des applications et réduire au maximum sa complexité. Autrement dit, une librairie sans architecture client-server.
\chapter{Fonctionnalités}
La librairie devra être séparé en deux parties distinctes. Une devra fournir les fonctionnalités de calibration de la librairie, et l'autre devra fournir les fonctionnalités d'utilisation de la librairie.
\begin{itemize}
\item Librairie d'utilisation
\begin{itemize}
\item capture les photos de profondeurs et couleurs avec la camera
\item ajuste une image à projeter sur le bac à sable
\item charge la configuration depuis le fichier
\item initialise le bac à sable
\end{itemize}
\item Librairie de calibration
\begin{itemize}
\item charge certaines informations du fichier de config si disponible
\item fournit les methodes de calibration
\item sauve la config dans un fichier
\end{itemize}
\end{itemize}
Il faudra aussi fournir une application de calibration qui produira un fichier de configuration pour faciliter la calibration de la librairie avec son environnement et ne pas devoir la répéter à chaque utilisations de la librairie d'usage. L'application utilisera la librairie de calibration.
This diff is collapsed.
% !TeX spellcheck = fr_FR
\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction} % Adding toc entry
Produire une maquette en tant qu'architecte ou paysagiste a un coût en ressources et en temps. C'est pourquoi il est fastidieux de modifier une maquette une fois contrsuite.
Afin de palier à ce problème, HEPIA c'est inspiré d'un projet permettant de faire de la réalité augmenté basé sur un bac à sable. Dans le but de reproduite ce projet, HEPIA a installé une infrastructure similaire permettant cette réalité augmenté.
Mais pour faire fonctionner le bac correctement, il faut une libraire permettant de l'exploiter. Hors, le projet d'origine n'en dispose d'aucune, le rendant complexe et peu flexible.
\\
\\
Un prototype de libraire avait été fait par l'étudiant précédent impliqué dans ce projet. Son but était de permettre la création de diverse application intéragissant avec le bac à sable. Mais comme il s'agissait d'une "proof of concept", certains points du projet ne correspondaient pas à ce qu'on attendait de la librairie, elle méritait donc une refonte. Durant le processus, nous avons remarqué que les données de configuration nécessaires au bon fonctionnement de la libraire méritaient une saisie facilité pour l'utilisateur et une persistance, afin d'éviter de configurer la librairie à chaque utilisation. Une fois la librairie stable, il a fallu améliorer les performances de la librairie pour lui permettre d'être plus réactive.
\\
\\
Tout d'abord, nous verrons ce qui constitue l'infrastructure nécessaire au projet. Puis nous verrons un comparatif avec ce qui était présent auparavant et les besoins de la nouvelle librairie. Suivi des fonctionnalités de chaque parties du projet et de l'architecture logicielle. Vous aurez ainsi une bonne vue globale du projet. Ensuite nous verrons les différentes technologies et outils utilisés dans le projet. Puis la conception et l'implémentation avec plus de détails sur l'application de configuration et une partie "application utilisateur", où tout deux utilisent la librairie. Enfin nous terminerons par les tests liés à l'optimisation avec les résultats du projet et la conclusion.
\chapter{Tests et résultats}
\section{Optimisation}
La librairie fonctionne, mais elle souffre de mauvaise performances, c’est pourquoi le but est d’entâmer une amélioration de celles-ci. Tout d’abords nous avons commencé à utiliser Valgrind, car son interface permettait de lire les données graphiquement, contrairement à Gprof qui retourne les informations dans la console. Ensuite en analysant les données retournées par Valgrind, nous nous voulions voir si les conclusions tirées d’un outil de profiling s’appliquaient pour tout outils. Nous avons donc testé avec Gperftools, qui est un autre outil graphique de profiling. Nous avons remarqué que les deux ne nous donnaient différent retours, mais que certaines informations étaient quand même redondantes dans nos deux cas. Enfin en testant avec Gprof, nous avons aussi remarqué qu’une fonction se démarquaient des autres. Cette fonction permettait de reconstruire l’image lors de l’ajustement de l’image projetée en parcourant chaque pixel pour ajuster sa valeur.\\
L’idée de modifier le code pour qu’il fonctionne sur GPU était alors concevable, mais pas raisonnable pour le moment, car il fallait s’assurer que le code était bien optimisé sur CPU, avant de l’adapter sur GPU. Donc nous avons décidée d’améliorer le code existant.\\
Pour ce faire, nous nous sommes atardés sur la gestion de la mémoire des buffers utilisées lors d’une utilisation standard de la librairie. C’est à dire, récupération d’une image de couleur ou profondeur, puis ajustement de l’image projetée. En ce qui concerne la caméra, nous avons limité les buffers à la capture des images couleurs et profondeurs (avec chacunes leur buffer) et le retour d’une copie de ces buffers lors de la récupération de ces images.\\
Puis lors de l’ajustement de l’image, nous gardons en mémoire les buffers utilisés dans la fonction. C’est à dire celui contenant l’image de sortie et les quatres autres utilisés dans la fonction d’ajustement. Ce qui nous fait cinqs zones mémoires de la taille de l’image de sortie. Enfin une copie est faite de l’image de sortie, ce qui nous rajoute un buffer.\\
Lors de l’analyse avec Gperftools, nous avons eu ce graphique :
\begin{figure}[H]
\centering
\includegraphics[scale=0.3]{gperftools_grpah.jpg}
\end{figure}
Nous sommes mitigé face à ce graphique, car nous avons des informations qui parraissent cohérentes, mais nous avons aussi l’inverse, comme le fait que la fonction HoughCircle soit appelé lors d’une redimension d’une matrice. Toute fois, le fait que le filtre spatial de la librairie realsense prenne une place aussi importante lors de l’execution est tout à fait envisageable. De plus nous voyons aussi que la méthode copyPixelsInto prends du temps. Cependant, comme nous avons décidé de simplifier le code, cette méthode n’existe plus et ce graphique est donc moyennement représentatif de l’exécution standard de la librairie. Comme le temps manquait, nous n’avons pu aller plus loin dans l’optimisation.
\section{Tests}
Nous avons testé les points clé de la librairie. Tout d’abord nous avons testé la précision de la librairie en utilisant l’application de courbe de niveau sur un terrain plat et en creusant des trous comme s’il s’agissait d’une grille. Comme la librairie précédente perdait en précision dans les bords, nous avons vérifié que s’il y avait une erreur, qu’elle ne s’accentutait pas avec l’éloignement du centre. Le test était positif et la seul marge d’erreur présente était lié à l’approximation de la position du vidéoprojecteur dans la configuration.\\
Ensuite, nous avons testé la résolution des images projetées, car auparavant, la résolution de l’image projetée dépendait de la résolution de la caméra. Pour testé nous avons simplement afficher une image de haute résolution et le résultat était positif.\\
Finalement, nous voulions testé le gain de performance lié à l’optimisation de la mémoire. Pour ce faire, nous avons calculé le temps d’initialisation de nos variables. Malheureusement, l’allocation ne dépassait que rarement 0 milisecondes sans l’optimisation et ne dépassait pas 0 avec.
\section{Utilisation}
La librairie généré par le Makefile retourne un fichier "libsandbox.so", qu’il va falloir inclure dans les projets C++. Pour ce faire, il faudra indiquer le chemin des en-têtes de fichiers lors de la compilation et indiquer le chemin vers le fichier .so lors du lien entre les librairies.\\
De plus, pour pouvoir exécuter l’application de calibration, il faudra indiquer à la console où trouver le fichier .so nécessaire à l’exécution de l’application. Pour ce faire, il suffit de sauvegarder le chemin vers le fichier .so dans la variable d’environnement LD-LIBRARY-PATH.\\
Une fois la calibration faite, l’application utilisateur devra respecter cette routine, afin de s’assurer du bon fonctionnement de la librairie.
\begin{figure}[H]
\centering
\includegraphics[scale=0.5]{sandbox_activity_diagram.jpg}
\end{figure}
Nous avons l’initialisation qui permet de vérifier que les compsants physique soit disponible. Puis le chargement de la configuration. Une fois tout validé, l’application utilisateur pourra s’exécuter.
\chapter{Technologies et outils}
\begin{itemize}
\item C++ : 11.0
\item g++ : 7.5.0
\item OpenCV : 3.2.0
\item realsense 2 : 2.35.2
\item yaml-cpp : \url{https://github.com/jbeder/yaml-cpp}
\item Qt : 5.9.5
\item Profiling
\begin{itemize}
\item Valgrind
\item Gprof
\item Gperftools
\end{itemize}
\end{itemize}
% !TeX spellcheck = fr_FR
\vspace*{120pt} % DO NOT MODIFY THIS VALUE
\begin{flushright}
\textit{< Insérez ici votre dédicace >} (facultatif)
\end{flushright}
\ No newline at end of file
% !TeX spellcheck = fr_FR
\renewcommand{\listfigurename}{Liste des illustrations}
\listoffigures
\addcontentsline{toc}{chapter}{\listfigurename} % Adding toc entry
\paragraph{Références des URL}
\begin{itemize}
\item URL01 \href{ce-site.ch/bla/bli/blo/blou.html}{ce-site.ch/bla/bli/blo/blou.html}
\item URL03 \href{ce-site.ch/blou/bli/bla.html}{ce-site.ch/blou/bli/bla.html}
\item URL04 \href{https://commons.wikimedia.org/w/index.php?curid=906980}{https://commons.wikimedia.org/w/index.php?curid=906980}
\item URL06 \href{ce-site.ch/monrapportdestage.pdf}{ce-site.ch/monrapportdestage.pdf}
\end{itemize}
\ No newline at end of file
% !TeX spellcheck = fr_FR
\chapter*{Table des matières}
\startcontents[default]
\printcontents[default]{ }{1}{}
\startcontents[annexes]
\stopcontents[annexes]
% !TeX spellcheck = fr_FR
\chapter*{Références documentaires}
\addcontentsline{toc}{chapter}{Références documentaires} % Adding toc entry
\noindent\textit{Sites Web consultés – Code repris d’ailleurs – Notices techniques – Articles de presse – Ouvrage imprimés – Ouvrages électroniques – Chapitre dans un ouvrage imprimé – Rapports imprimés – Travaux universitaires – Articles de revues imprimés – Articles de périodiques électroniques – Communication dans un congrès. Pour chacun de ces types de document, les mise en forme sont dans le document « Méthode de citation et de rédaction d’une bibliographie ».}\\
\textit{Afin de gagner du temps, pensez à utiliser le logiciel de gestion bibliographique Zotero (et/ou BibTeX si vous utilisez LaTeX) pour la mise en forme et l’édition automatique de vos références à la norme ISO690.}
\ No newline at end of file
% !TeX spellcheck = fr_FR
\thispagestyle{noheader}
\chapter*{Énoncé du sujet} % No (numbered) toc entry with *
\addcontentsline{toc}{chapter}{Énoncé du sujet} % Adding toc entry
\thispagestyle{noheader}
\begin{figure}[tbph!]
\centering
\includegraphics[scale=0.7]{fanetti_enonce_dipl_2020.jpg}
\end{figure}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment