Commit 8d61c3d2 authored by Hugo LEVY-FALK's avatar Hugo LEVY-FALK

Beamer et rapport

parent 704168f2
File added
@misc{photo_drone,
title = {Fotogallery {\textbar} {Parrot} {Bebop} {Drone}},
howpublished = "\url{https://www.thedigeon.com/it/robot/fotogallery-parrot-bebop-drone.html}",
url = {https://www.thedigeon.com/it/robot/fotogallery-parrot-bebop-drone.html},
abstract = {Parrot Bebop Drone pesa appena 390 grammi, è del 25 per cento più compatto del modello AR.Drone, è robusto, grazie al corpo in abs che contiene il 15\% di fibra di vetro ed è dotato di 11 + 11 minuti di autonomia di volo, grazie alle due batterie ai polimeri di litio di serie (1.200 mAh).Cliccate sul simbolo a X nella barra di controllo grigia della fotogallery per vedere le foto a tutto schermo},
urldate = {2019-05-25},
journal = {The Digeon},
keywords = {projet2a}
}
@misc{zieg_nic,
title = {PI Controller Design (Ziegler-Nichols) and Unit Step Response Graphing for 4th order system},
howpublished = "\url{https://electronics.stackexchange.com/questions/396028/pi-controller-design-ziegler-nichols-and-unit-step-response-graphing-for-4th-o}",
urldate = {2019-05-25},
}
@misc{wiki_ros,
title = {Documentation ROS},
howpublished = "\url{http://wiki.ros.org/}",
}
@misc{scipy,
title = {Documentation Scipy},
howpublished = "\url{https://docs.scipy.org/doc/}",
}
@misc{sav_gol,
title = {Savitzky-Golay filter},
howpublished = "\url{https://en.wikipedia.org/wiki/Savitzky\%E2\%80\%93Golay_filter}",
}
@misc{freq_ech,
title = {Reading from Bebop},
howpublished = "\url{https://bebop-autonomy.readthedocs.io/en/latest/reading.html}",
}
@misc{zieg_nic_premier,
title = {Ziegler-Nichols Tuning Rules for PID},
howpublisehd = "\url{http://www.mstarlabs.com/control/znrule.html}",
}
@misc{gitlab_frezza,
title= {Gitlab du projet initial},
howpublisehd = "\url{https://gitlab.centralesupelec.fr/frezza/drone_demo}"
}
@misc{julia,
title={Langage Julia},
howpublished = "\url{https://julialang.org}"
}
\ No newline at end of file
\chapter{Conclusion}
L'objectif du projet est atteint. L'asservissement en position du drone est désormais bien plus stable. En outre, le script \verb|control_compute.py| peut aisément être réutilisé dans d'autres projets avec ROS pour implémenter facilement des modules de contrôle.
Ce projet a également été l'occasion pour nous de découvrir et de nous familiariser avec ROS, en plus de mettre en pratique de nombreux cours de Supélec (Génie logiciel, Signaux et Systèmes, Automatique et Commande d'entraînements à vitesse variable notamment).
Nous souhaitons en particulier remercier messieurs \bsc{Frezza-Buet} et \bsc{Gutzwiller} pour leur accompagnement et leurs conseils tout au long du projet.
L'intégralité du travail réalisé pour ce projet peut être retrouvé à cette adresse : \url{https://gitlab.rezometz.org/klafyvel/drone-rigide}. Les codes ont été testés sous Ubuntu 18.04 avec la version de ROS "melodic" sous une architecture 64 bits. Si à l'avenir le dépôt se trouvait indisponible, les auteurs peuvent être contactés :
\begin{description}
\item[Joanne \bsc{Steiner}] \verb|joannesteiner@hotmail.fr|
\item[Hugo \bsc{Levy--Falk}] \verb|me@klafyvel.me|
\end{description}
\ No newline at end of file
\chapter{Utilisation et génération des fichiers de configuration}
\label{chap:configuration}
À plusieurs reprises lors de notre projet, nous avons eu à utiliser des fichiers de configuration.
Ce type de fichier nous a permis de définir des paramètres et de générer une fenêtre dans laquelle nous pouvons les régler en direct. Nos fichiers de configuration débutent par :
\begin{minted}{python}
#!/usr/bin/env python
PACKAGE = "detect_targets"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
\end{minted}
Nous allons donc utiliser dynamic\_reconfigure afin de créer un générateur de paramètres. Dans ce fichier, l'ajout d'un paramètre dans le générateur se déroulera toujours de la même façon :
\begin{minted}{python}
gen.add("name",type,0,"description",default value, min, max)
\end{minted}
Cela nous a permis de générer de nouveaux paramètres et de les régler à la main tout au long du projet.
\ No newline at end of file
\chapter{Export du relevé de position}
\label{chap:export}
\section{Relevé}
ROS permet, grâce à la commande \verb|rosbag| d'exporter les données publiées sur un topic ROS pour les jouer plus tard. Pour cela on peut utiliser la commande :
\begin{minted}{bash}
rosbag record <topic> -O record.bag
\end{minted}
\verb|<topic>| est le topic à enregistrer.
Après avoir lancé \mintinline{bash}|roscore|, on enregistre la sortie dans un format que le script de l'annexe \ref{chap:test_filter} accepte.
\begin{minted}{bash}
rostopic echo <topic> | python3 parse_topic.py
\end{minted}
Le script \verb|parse_topic.py| accepte plusieurs arguments.
\begin{minted}
Usage: parse_topic.py [OPTIONS]
Options:
--output TEXT Output file
--time / --no-time Add the number of seconds
--field TEXT YAML field to store
--help Show this message and exit.
\end{minted}
On peut alors, dans un autre terminal, jouer l'enregistrement avec la commande suivante.
\begin{minted}{bash}
rosbag play record.bag
\end{minted}
Enfin, on peut arrêter le script \mintinline{bash}|parse_topic.py| en pressant \verb|Ctrl + C|.
\section{Script \mintinline{bash}|parse_topic.py|}
\inputminted[frame=lines,linenos,breaklines=true]{python}{scripts/parse_topic.py}
\ No newline at end of file
\chapter{Génération des images afin de vérifier le script pour trouver la cible, script \mintinline{bash}{test_find_targets.py}}
\label{chap:test_find_targets}
\inputminted[frame=lines,linenos,breaklines=true]{python}{scripts/test_find_targets.py}
\ No newline at end of file
\chapter{Installation de ROS et du projet}
\label{chap:installation_projet}
Tout d'abord, il faut installer ROS sur votre machine \cite{wiki_ros}. Afin d'installer ROS et les modules nécessaires à l'utilisation du projet, nous allons nous référer au tutoriel de M. Frezza-Buet disponible sur son site.
Suivez le lien suivant http://wiki.ros.org/ROS/Installation afin d'installer ROS sur votre machine. Lors de notre projet, nous avons utilisé la version suivante : ROS Melodic Morenia qui était alors la plus récente disponible.
Une fois ROS installé, installez les "catkins tools" qui permettront de créer des espaces de travail ROS
\begin{minted}{bash}
sudo apt install python-catkin-tools
\end{minted}
Créez un workspace sur lequel vous enregistrerez le projet :
\begin{minted}{bash}
cd ~
mkdir -p drone-rigide/src
cd drone-rigide/src
\end{minted}
Procédez à l'installation de bebop\_autonomy :
\begin{minted}{bash}
sudo apt-get install build-essential python-rosdep
\end{minted}
Récupérez également le dépôt teleop-tools, nécessaire à l'utilisation de bebop\_autonomy :
\begin{minted}{bash}
git clone https://github.com/ros-teleop/teleop_tools
\end{minted}
Procédez à l'installation de Parrot-ARSDK et indiquez enfin le chemin de Parrot-ARSDK pour bebop\_autonomy :
\begin{minted}{bash}
sudo apt install ros-melodic-parrot-arsdk
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/melodic/lib/parrot_arsdk
git clone https://github.com/AutonomyLab/bebop_autonomy.git bebop_autonomy
\end{minted}
Pensez à copier le répertoire \verb|bebop_driver| qui se trouve dans \verb|bebop_autonomy| dans le répertoire \verb|src|.
\begin{minted}{bash}
cp -r bebop_autonomy/bebop_driver ./
\end{minted}
Attention à la version de ROS qui n'est pas forcément melodic.
Installez vq2
\begin{minted}{bash}
https://github.com/HerveFrezza-Buet/vq2
\end{minted}
Ramenez les modules du projet sur votre workspace :
\begin{minted}{bash}
git clone https://gitlab.rezometz.org/klafyvel/drone-rigide
\end{minted}
Récupérez le dépôt Gitlab de M. Frezza-Buet suivant :
\begin{minted}{bash}
git clone https://github.com/HerveFrezza-Buet/demo-teleop
git clone https://github.com/HerveFrezza-Buet/vqimg
\end{minted}
Ce module permet de contrôler le drone à l'aide du clavier et de reprendre la main sur ce dernier à tout instant.
Il faut maintenant procéder à la compilation. Tout d'abord, indiquez sous quelle version de ROS vous travaillez (à adapter à votre version) :
\begin{minted}{bash}
source /opt/ros/melodic/setup.bash
\end{minted}
Puis compilez votre workspace :
\begin{minted}{bash}
cd ~/drone-rigide
catkin build
\end{minted}
Désormais, à chaque fois que vous ouvrirez un nouveau terminal pour travailler sous ROS, il faudra indiquer au terminal sous quel version de ROS vous voulez travailler et dans quel workspace. Pour cela, écrivez la commande suivante :
\begin{minted}{bash}
source ~/drone-rigide/devel/setup.bash
\end{minted}
Ouvrez un terminal et lancez :
\begin{minted}{bash}
roscore
\end{minted}
Dans un nouveau terminal, placez-vous dans drone-rigide/src :
\begin{minted}{bash}
cd drone-rigide/src
\end{minted}
Et lancez le fichier \verb|simple_loop.launch| par l'instruction suivante :
\begin{minted}{bash}
roslaunch detect_targets/launch/simple_loop.launch
\end{minted}
\ No newline at end of file
\chapter{Introduction}
Le campus de Metz de CentraleSupélec dispose de drones quadricoptères Bebop 2 (Parrot). Ces derniers sont capables de réaliser des mouvements brusques ce qui rend leur pilotage complexe. Il faut donc les manipuler avec précautions, ce qui revient à sous-exploiter leurs capacités.
Jusqu'à présent, le drone était asservi à l'aide d'une cible présente dans son champ visuel. Le drone suivait la cible (bleue) et se positionnait en face de cette dernière. Toutefois, le drone se déplaçait lentement et se montrait prudent. De plus, une fois face à la cible, le drone n'était pas stable. Il oscillait verticalement face à la cible. Ce résultat avait été obtenu suite à un projet d'élèves.
L'objectif de ce projet est donc de rendre l'asservissement du drone plus "rigide" afin de mieux exploiter les capacités de ce dernier.
\ No newline at end of file
\chapter{Modélisation du problème}
\section{Modélisation mécanique}
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/modelisation/drone_axes.png}
\caption{Axes du drone parrot \cite{photo_drone}}
\label{fig:drone_axes}
\end{figure}
Le contrôle du drone selon les différents axes (figure \ref{fig:drone_axes}) n'est pas identique. Ainsi on contrôle le drone en vitesse pour la translation et la rotation sur l'axe z, alors que le contrôle sur les axes x et y s'effectue par l'inclinaison de la machine.
\subsection{Axe z}
Les drones BeBop nous permettent de spécifier directement une vitesse en rotation et en translation sur l'axe $z$. L'asservissement interne du drone se chargeant de faire respecter la consigne. On a donc une une réponse fréquencielle de la forme de celle de la figure \ref{fig:bode_z}. On peut alors assimiler la fonction de transfert sur cet axe à un simple intégrateur dans notre domaine fréquentiel de travail. Pour la correction, on pourra utiliser un simple PID.
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\linewidth]{images/modelisation/bode_z.eps}
\caption{Diagramme de Bode simplifié de la réponse sur l'axe $z$}
\label{fig:bode_z}
\end{figure}
\subsection{Axes x et y}
Les axes x et y ayant des comportements similaires, nous pouvons les assimiler à un axe $u$ pour les calculs. On suppose que les moteurs du drone fournissent une force de portance constante $\vec{F}_m$ et que le drone doit faire face à une force de frottements fluides $\vec{F}_f=-\alpha \dot{u}$.
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/modelisation/forces.eps}
\caption{Modélisation des forces appliquées au drone dans le cas d'une translation dans le sens positif de $\vec{u}$}
\label{fig:forces}
\end{figure}
En appliquant le principe fondamental de la dynamique dans le cadre des forces appliquées dans le schéma de la figure \ref{fig:forces}, on a :
\begin{eqnarray}
m \ddot{u} &=& \sin{(\theta)} F_{m} - \alpha \dot{u}
\end{eqnarray}
Dans le domaine de Laplace, et en se plaçant dans le domaine des faibles inclinaisons, on a donc :
\begin{eqnarray}
m p^2 u &=& \theta F_{m} - \alpha p u \\
u &=& \frac{F_{m}}{\alpha p(\frac{m}{\alpha}p + 1)} \theta
\end{eqnarray}
Ce qui donne un diagramme de Bode similaire à celui de la figure \ref{fig:bode_u}.
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\linewidth]{images/modelisation/bode_u.eps}
\caption{Diagramme de Bode simplifié de la réponse sur l'axe $u$}
\label{fig:bode_u}
\end{figure}
Malheureusement, nous ne connaissons pas le paramètre $\alpha$. Cependant, d'après M. Frezza, à pleine vitesse, le drone met plusieurs seconde à atteindre sa vitesse limite (correspondant à la fréquence à laquelle la fonction de transfert peut être assimilée à un simple intégrateur). On peut donc supposer que pour les fréquences de travail du cadre de ce projet, les axes $x$ et $y$ se comportent comme des doubles intégrateurs. C'est pourquoi le correcteur qui semble adapté pour ces deux axes est un correcteur Proportionnel Dérivé.
\section{Modélisation primaire de l'asservissement}
On peut dans un premier temps modéliser l'asservissement de la manière de la figure \ref{fig:model_simple}.
\begin{figure}[h!]
\centering
\begin{tikzpicture}[auto, node distance=2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input, node distance=3cm] (sum) {};
\node [block, right of=sum] (controller) {Correcteur};
\node [block, right of=controller,
node distance=3cm] (system) {Drone};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u$} (system);
\node [output, right of=system, node distance=5cm] (output) {};
\node [block, below of=u] (measurements) {Mesure};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {position attendue} (sum);
\draw [->] (sum) -- node {$\epsilon$} (controller);
\draw [->] (system) -- node [name=y] {position réelle du drone}(output);
\draw [->] (y) |- (measurements);
\draw [->] (measurements) -| node[pos=0.99] {$-$}
node [near end] {mesure de la position} (sum);
\end{tikzpicture}
\caption{Modélisation simple de l'asservissement}
\label{fig:model_simple}
\end{figure}
Le drone diffuse un flux optique, qui permet de calculer sa position vis-à-vis d'une cible. La mesure peut se décomposer en trois éléments, comme le montre la figure \ref{fig:decomp_mesure}.
\begin{figure}[h!]
\centering
\begin{tikzpicture}[auto, node distance=3cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [block, right of=input] (cam) {Caméra};
\node [block, right of=cam] (transm) {Transmission};
\node [block, right of=transm] (trait) {Traitement};
\node [output, right of=system] (output) {};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (input) -- (cam);
\draw [->] (cam) -- (transm);
\draw [->] (transm) -- (trait);
\draw [->] (trait) -- (output);
\end{tikzpicture}
\caption{Décomposition de la mesure}
\label{fig:decomp_mesure}
\end{figure}
Comme le traitement ne se fait pas directement sur le drone, il existe des retards aléatoires dûs au temps de transit sur le réseau, ainsi qu'au temps de calcul sur le poste de contrôle. Ces retards limitent la fréquence des mesures à environ 20Hz\cite{freq_ech}.
\ No newline at end of file
\chapter{Problèmes connus}
\label{chap:chap_probleme}
Lors de notre projet, nous avons rencontré quelques difficultés liés à des problèmes rencontrés avec le matériel :
\begin{itemize}
\item les batteries sont peu performantes, elles ont une autonomie très faible (de l'ordre de la dizaine de minutes maximum lorsque le drone est en vol) ce qui implique d'avoir à redémarrer le drone de façon répétée;
\item sur les quatre drones présents dans la Smart Room, trois voient flou;
\item il arrive que l'image de la caméra se fige, il faut alors redémarrer le drone.
\end{itemize}
\ No newline at end of file
This diff is collapsed.
\chapter{Script \mintinline{bash}|test_filter.jl|}
\label{chap:test_filter}
Ce script teste différents filtres de \bsc{Savitsky-Golay} à l'aide du langage Julia\cite{julia}. Outre le fait qu'il illustre la souplesse et la simplicité d'utilisation du langage, il permet de donner un exemple de calcul des coefficients du filtre.
\inputminted[frame=lines,linenos,breaklines=true]{julia}{scripts/test_filter.jl}
\chapter{Utilisation du livrable}
\section{Installation du module}
Pour l'installation du module, se référer à l'annexe \ref{chap:installation_projet}.
\section{Utilisation}
\subsection{Lancement}
Le lancement du projet est décrit dans l'annexe \ref{chap:installation_projet}. Pour rappel :
\begin{enumerate}
\item Connectez-vous au réseau WiFi du drone;
\item Ouvrez un terminal et lancez :
\begin{minted}{bash}
roscore
\end{minted}
\item Dans un nouveau terminal:
\begin{minted}{bash}
source ~/drone-rigide/devel/setup.bash
roslaunch detect_targets simple_loop.launch
\end{minted}
\end{enumerate}
Cinq fenêtres s'ouvrent : un terminal, deux fenêtres de visualisation, un graphe des nœuds et une fenêtre de configuration.
\subsection{Contrôle manuel}
Dans la fenêtre de terminal (figure \ref{fig:terminal}) qui s'est ouverte, il est possible de contrôler manuellement le drone. Au bout de quelques secondes après le décollage, si aucun ordre n'est donné le contrôle automatique prend la main.
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/utilisation/fenetre_control.png}
\caption{Terminal de contrôle manuel}
\label{fig:terminal}
\end{figure}
\subsection{Fenêtre de visualisation}
Ces fenêtres (figure \ref{fig:visualisation}) permet de donner un aperçu de la sortie de la caméra, afin notamment de vérifier que le drone est bien en mesure de visualiser la cible.
La fenêtre en haut à droite permet de régler les seuils de couleur. Il y a également deux options "Binary" qui permet d'afficher l'image binaire (en haut à gauche) et "Targets" qui permet d'afficher la position des cibles trouvée. Il faut bien penser à décocher ces deux options lorsque le drone est en vol, car leur génération provoque beaucoup de calculs et induit donc un retard, source d'instabilités.
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/utilisation/targets.png}
\caption{Visualisation de la sortie de la caméra}
\label{fig:visualisation}
\end{figure}
\subsection{Fenêtre de paramétrage}
La dernière fenêtre qui s'ouvre (figure \ref{fig:parametrage}) est la fenêtre de paramétrage. Elle permet de paramétrer tous les nœuds qui utilisent \verb|dynamic_reconfigure|. Ainsi, pour donner une consigne de distance sur l'axe $x$, il suffit de changer le paramètre \verb|value| de \verb|controller_linear_x/external_loop/input|.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/utilisation/capture_rqt.png}
\caption{Fenêtre de paramétrage}
\label{fig:parametrage}
\end{figure}
\ No newline at end of file
\documentclass[]{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage[french]{babel}
\usepackage{geometry} % Required for adjusting page dimensions
\geometry{
top=2cm, % Top margin
bottom=2cm, % Bottom margin
left=2cm, % Left margin
right=2cm, % Right margin
includehead, % Include space for a header
includefoot, % Include space for a footer
%showframe, % Uncomment to show how the type block is set on the page
}
\usetikzlibrary{shapes,arrows}
\tikzstyle{block} = [draw, fill=blue!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{sum} = [draw, fill=blue!20, circle, node distance=1cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]
% Title Page
\title{Projet double :\\ Asservissement "rigide" de drone}
\author{Joanne \bsc{Steiner}, Hugo \bsc{Levy-{}-Falk}}
\date{2019}
\begin{document}
\maketitle
\begin{abstract}
\end{abstract}
\tableofcontents
\chapter{Introduction}
Le campus de Metz de CentraleSupélec dispose de drones appelés les quadricoptères Bebop 2 (Parrot). Ces derniers sont capables de réaliser des mouvements brusques ce qui rend leur pilotage complexe. Il faut donc les manipuler avec précautions, ce qui revient à sous-exploiter leurs capacités.\\
Jusqu'à présent, le drone était asservi à l'aide d'une cible présente dans son champ visuel. Le drone suivait la cible (bleu) et se positionnait en face de cette dernière. Toutefois, le drone se déplaçait lentement et se montrait prudent. De plus, une fois face à la cible, le drone n'était pas stable. Il oscillait verticalement face à la cible. Ce résultat avait été obtenu suite à un projet d'élèves.\\
L'objectif de ce projet est donc de rendre l'asservissement du drone plus "rigide" et donc d'améliorer et de mieux exploiter l'utilisation de ce dernier.
\chapter{Déroulement du projet}
Le projet comporte les étapes suivantes :
\begin{itemize}
\item Etape 1 : Prise en main de ROS et du drone présent à la smartroom;
\item Etape 2 : Réduction du bruit causé par le calcul de la position du drone par rapport à l'image
\item Etape 3 : Choix du correcteur simple boucle
\item Etape 4 : Choix du correcteur double boucle
\item Etape 5 : Ecriture d'un guide de fonctionnement
\end{itemize}
\chapter{Modélisation du problème}
Le drone diffuse un flux optique, qui permet de calculer sa position vis-à-vis d'une cible. On peut donc dans un premier temps modéliser l'asservissement de cette manière :
\begin{figure}[h!]
\centering
\begin{tikzpicture}[auto, node distance=2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input, node distance=3cm] (sum) {};
\node [block, right of=sum] (controller) {Correcteur};
\node [block, right of=controller,
node distance=3cm] (system) {Drone};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u$} (system);
\node [output, right of=system, node distance=5cm] (output) {};
\node [block, below of=u] (measurements) {Mesure};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {position attendue} (sum);
\draw [->] (sum) -- node {$\epsilon$} (controller);
\draw [->] (system) -- node [name=y] {position réelle du drone}(output);
\draw [->] (y) |- (measurements);
\draw [->] (measurements) -| node[pos=0.99] {$-$}
node [near end] {mesure de la position} (sum);
\end{tikzpicture}
\caption{Modélisation simple de l'asservissement}
\end{figure}
La mesure peut se décomposer en trois éléments :
\begin{figure}[h!]
\centering
\begin{tikzpicture}[auto, node distance=3cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [block, right of=input] (cam) {Caméra};
\node [block, right of=cam] (transm) {Transmission};
\node [block, right of=transm] (trait) {Traitement};
\node [output, right of=system] (output) {};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (input) -- (cam);
\draw [->] (cam) -- (transm);
\draw [->] (transm) -- (trait);
\draw [->] (trait) -- (output);
\end{tikzpicture}
\caption{Décomposition de la mesure}
\end{figure}
Comme le traitement ne se fait pas directement sur le drone, il existe des retards aléatoires dûs au temps de transit sur le réseau, ainsi qu'au temps de calcul sur le poste de contrôle. Ces retards limitent la fréquence des mesures à environ 5Hz.
\chapter{Réalisation du projet}
\section{Prise en main de ROS et du drone présent à la smartroom}
Pour la prise en main de ROS, nous avons suivi les étapes du tutoriel de M. Frezza-Buet. Cela nous a permis de comprendre comment fonctionne ROS et de pouvoir l'utiliser de manière basique et simple.\\
\section{Réduction du bruit causé par le calcul de la position du drone par rapport à l'image}
Nous avons constaté qu'une forte incertitude existait lors du calcul de la position du drone par rapport au panneau. En effet, celle-ci, même si le drone était immobile, bougeait beaucoup et faisait des "sauts". Il s'agissait d'un bruit de type de Poisson, difficile, voire impossible, à traiter en automatique pour obtenir un asservissement satisfaisant. En effet, le drone, avec ce bruit, aurait été asservi à ce dernier, rendant impossible l'obtention d'une position fixe. Notre drone aurait fait de grands écarts par rapport à la position attendue.\\
Afin de régler ce problème, l'idée proposée a été de modifier l'algorithme en place. Ce dernier calcul la position des trois carrés bleus dans l'image renvoyée par le drone par les position H, R et L. Cette détermination se faisait par gngt, qui faisait beaucoup de bruit. Nous avons donc utilisé un nouveau script Python qui profite de la labellisation afin de déterminer la position des panneaux.\\
Dans cette partie, nous ne nous intéresserons qu'au script donné dans le fichier
\textbf{src$\backslash$detect\_targets$\backslash$script$\backslash$find\_targets.py}. Il permet, à partir d'un seuil RGB défini, de trouver les parties "bleues" de l'image. Une fois ces positions trouvées, on ne garde que les trois plus grandes parties et on en calcule le centre de masse. Les résultats obtenus sont plutôt satisfaisants.
\section{Premier asservissement sommaire}
Le premier asservissement qui a été réalisé n'utilisait qu'une seule boucle et asservissait la position du drone.\\
Pour ce premier asservissement sommaire, nous avons estimé la courbe de la réponse fréquentielle de notre drone afin d'en déduire le type de correcteur à utiliser.\\
Nous savons que selon l'axe z, le drone répond seulement en vitesse. On peut approximer sa réponse fréquence par une pente nulle en basse fréquence, puis une pente [-1] en haute fréquence. Afin d'asservir le drone, nous aurons donc besoin d'un correcteur de type proportionnel-intégrale
\[C(p)=K_p + \frac{K_i}{p}\]
Concernant les axes x et y, nous savons que le drone ne peut être correctement asservi en vitesse. En effet, le réglage de la vitesse et de l'accélération du drone se fait selon un angle d'inclinaison : le drone accélère en permanence s'il conserve le même angle ce qui ne permet pas le maintien d'une vitesse constante. La réponse fréquentielle selon ses axes est donc représentée par une pente de [-1] dans les basses fréquence et une pente de [-2] dans les hautes fréquences. Afin de corriger ces axes, nous allons donc utiliser une correction de type Proportionnelle-Dérivée :
\[C(p)=K_p+K_d p\]
\begin{figure}[h!]
\centering
\begin{tikzpicture}[auto, node distance=2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input, node distance=3cm] (sum) {};
\node [block, right of=sum] (controller) {$C_p(p)$};
\node [sum, right of=controller, node distance=3cm] (sum_speed) {};
\node [block, right of=sum_speed] (controller_speed) {$C_v(p)$};
\node [block, right of=controller_speed,
node distance=3cm] (system) {Drone};
\node [block, right of=system,
node distance=3cm] (integrate) {$\frac{1}{p}$};
\node [block, below of=controller_speed] (measurements_speed) {Mesure};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[pos=0.99] {$+$}
node [near end] {$u$} (sum_speed);
\node [output, right of=system, node distance=5cm] (output) {};
\node [block, below of=measurements_speed] (measurements) {Mesure};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {position attendue +} (sum);
\draw [->] (sum) -- node {$\epsilon_p$} (controller);
\draw [->] (sum_speed) -- node {$\epsilon_v$} (controller_speed);
\draw [->] (controller_speed) -- node [name=x] {} (system);
\draw [->] (system) -- node [name=v] {} (integrate);
\draw [->] (measurements_speed) -| node[pos=0.99] {$-$}
node [near end] {mesure de la vitesse} (sum_speed);
\draw [->] (integrate) -- node [name=y] {position }(output);
\draw [->] (v) |- (measurements_speed);
\draw [->] (y) |- (measurements);
\draw [->] (measurements) -| node[pos=0.99] {$-$}
node [near end] {mesure de la position} (sum);
\end{tikzpicture}
\caption{Modélisation simple de l'asservissement}
\end{figure}
\section{Deuxième asservissement utilisant une double-boucle d'asservissement}
\section{Installation du module et utilisation de l'interface graphique}
Modules pour régler les seuils de couleur (on pourrait songer à utiliser des cibles rouges, à condition de modifier les seuils) et le correcteur : la valeur de la saturation en vitesse et en accélération peuvent se régler ainsi que les différentes valeurs du PID (il est toutefois déconseillé de modifier les valeurs, celles-ci ayant été adaptés au problème).
\end{document}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
\documentclass[]{report}
\usepackage[utf8]{inputenc}
\usepackage{fontenc}
\usepackage{tikz}
\usepackage{nameref}
\usepackage[french]{babel}
\usepackage{minted}
\usepackage{amsmath,amsmath,amsfonts,amssymb}
\usepackage{graphicx}
\usepackage{verbatim}
\usepackage{stmaryrd}
\usepackage{placeins}
\usepackage{mdframed}
\usepackage{url}
\usepackage{pdflscape}
\usepackage{geometry} % Required for adjusting page dimensions
\geometry{
top=2cm, % Top margin
bottom=2cm, % Bottom margin
left=2cm, % Left margin
right=2cm, % Right margin
includehead, % Include space for a header
includefoot, % Include space for a footer
%showframe, % Uncomment to show how the type block is set on the page
}
\newcommand*\intervalleEntier[2]{\intervalle{\llbracket}{#1}{#2}{\rrbracket}}
\newcommand*\intervalle[4]{\left#1 #2 \, ; #3 \right#4}
\newcommand*\floor[1]{\left \lfloor{#1}\right \rfloor}
\surroundwithmdframed{minted}
\usetikzlibrary{shapes,arrows}
\tikzstyle{block} = [draw, fill=blue!20, rectangle, minimum height=3em, minimum width=6em]
\tikzstyle{sum} = [draw, fill=blue!20, circle, node distance=1cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]
\begin{document}
\begin{titlepage}
\begin{center}
\includegraphics[width=0.6\textwidth]{LogoCS.png}\\[1cm]
{\large Projet double de deuxième année}\\[0.5cm]
% Title
\rule{\linewidth}{0.5mm} \\[0.4cm]
{ \huge \bfseries Asservissement "rigide" de drone \\[0.4cm] }
\rule{\linewidth}{0.5mm} \\[1.5cm]
% Author and supervisor
\noindent
\begin{minipage}{0.4\textwidth}
\begin{flushleft} \large
\emph{Auteurs :}\\
M. Hugo \textsc{Levy--Falk}\\
M\up{lle} Joanne \textsc{Steiner}\\
\end{flushleft}
\end{minipage}%
\begin{minipage}{0.4\textwidth}
\begin{flushright} \large
\emph{Encadrants :} \\
M Jean-Louis \textsc{Gutzwiller}\\
M. Hervé \textsc{Frezza-Buet}
\end{flushright}
\end{minipage}
\vfill
% Bottom of the page
{\large Version du \today}
\end{center}
\end{titlepage}
\newpage\null\thispagestyle{empty}\newpage
\begin{abstract}
Dans ce rapport, nous détaillons la mise en place d'un asservissement en position d'un drone BeBop en utilisant le flux optique qu'il fournit. Pour cela nous utilisons diverses corrections (PI, PD, PID) et le framework RobotOS.
\end{abstract}