Beamer et rapport

This commit is contained in:
Hugo LEVY-FALK 2019-06-07 15:29:39 +02:00
parent 704168f2ca
commit 8d61c3d2c0
48 changed files with 17316 additions and 185 deletions

BIN
doc/beamer.pdf Normal file

Binary file not shown.

BIN
doc/compte_rendu/LogoCS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

View file

@ -0,0 +1,50 @@
@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}"
}

View file

@ -0,0 +1,14 @@
\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}

View file

@ -0,0 +1,20 @@
\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.

View file

@ -0,0 +1,37 @@
\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}

View file

@ -0,0 +1,3 @@
\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}

View file

@ -0,0 +1,92 @@
\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}

View file

@ -0,0 +1,7 @@
\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.

View file

@ -0,0 +1,115 @@
\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}.

View file

@ -0,0 +1,9 @@
\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}

View file

@ -0,0 +1,474 @@
\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. \bsc{Frezza-Buet}. Cela nous a permis de comprendre comment fonctionne ROS et de pouvoir l'utiliser de manière basique et simple.
Pour installer et utiliser ROS, ainsi que notre projet, on pourra se référer à l'annexe \ref{chap:installation_projet}.
\section{Réduction du bruit}
\subsection{Problème et solution liés au 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, y aurait été asservi, 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 calcule 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. Nous avons donc développé un nouveau script Python qui utilise la labellisation \cite{scipy} afin de déterminer la position des panneaux.
Dans cette partie, nous ne nous intéresserons qu'au fichier
\verb|find_targets.py|. Il permet, à partir d'un seuil RGB défini, de trouver les parties "bleues" de l'image\footnote{On pourrait cependant chercher d'autres couleurs en changeant les valeurs des seuils.}. 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.
\subsection{Détails des fonctions exposées par \mintinline{bash}|find_targets.py|}
Le module contient deux fonctions.
\subsubsection{\mintinline{python}|find_targets|}
Cette fonction prend en argument l'image dont on souhaite extraire la cible, des valeurs de seuil bleu, rouge et vert minimales et maximales, un booléen \verb|return_slices| qui indique s'il faut, ou non, retourner les slices localisant les limites de la cible et un booléen \verb|return_binary| qui indique s'il faut, ou non, retourne l'image binaire. Ce dernier sera utile pour régler des seuils lorsque, pas exemple, la couleur des cibles est modifiée.
La fonction retourne les coordonnées des centres de masse des trois carrés de la cible sous la forme d'un tuple \verb|(H,L,R)| avec \verb|H| le point le plus haut, \verb|L| le point le plus à gauche et \verb|R| le point le plus à droite ainsi que les slices correspondant aux zones bleues le cas échéant\footnote{Cela permet de dessiner les rectangles, ce qui est utile lorsqu'on souhaite procéder à des vérifications}.
La première étape de l'algorithme consiste à détecter tous les points répondant aux conditions de seuil définis dans les arguments de la fonction. Lorsqu'un pixel de l'image remplit les conditions, un 1 est placé sur ce pixel, sinon on y place un 0. On construit ainsi une matrice de 0 et de 1 correspondant aux points satisfaisant les critères de seuil.
On définit ensuite une structure de labellisation. Pour cela, on utilise la matrice suivante :
$$
\begin{bmatrix}
0 & 1 & 0 \\
1 & 1 & 1 \\
0 & 1 & 0
\end{bmatrix}
$$
Cette matrice permet de demander à l'algorithme de labellisation de considérer que deux pixels A et B sont dans la même surface si et seulement si le pixel B se trouve à gauche, à droite, au-dessus ou en-dessous du pixel B. L'algorithme numérote ensuite ces surfaces de manière unique. Nous récupérons ainsi l'image labellisée ainsi que le nombre de zones détectées.
Dans le cas où moins de trois zones sont trouvées, on considère que la détection s'est mal déroulée et une erreur est levée.
On récupère ensuite les zones détectées sous la forme d'une liste de 3-uplets \verb|(a[0],a[1],i)| où \verb|a[0]| et \verb|a[1]| sont les slices des zones (elles délimitent le parallélépipède le plus petit contenant la zone) et \verb|i| est le numéro de la zone.
On trie ensuite les zones par aire et on ne garde que les trois zones ayant les aires les plus grandes. On suppose ici qu'aucune autre surface bleue importante, qui pourrait être confondue avec les cibles, ne sera présente sur notre image.
Nous déterminons ensuite les centres de masse des zones trouvées grâce à \verb|center_of_mass|.
Enfin, on trie les centre de masse selon l'axe vertical et on définit \verb|H| comme le point le plus haut. On trie les centres de masse restants selon l'axe horizontal et on définit \verb|L| par le point le plus à gauche et \verb|R| comme le point le plus à droite. On retrouve ainsi les trois centres de masse de la cible. On retourne ces derniers, avec leurs slices le cas échéant.
\subsubsection{\mintinline{python}|normalize_coordinates|}
Cette fonction prend en argument un point, la largeur et la hauteur d'une image et retourne des coordonnées \verb|(x,y)| normalisés. Cette fonction nous permet d'adapter le format des coordonnées renvoyés au code qui existait déjà. Il s'agit donc d'un changement de repère : on place l'origine au centre de l'image, on inverse l'axe y\footnote{Dans une image classique, l'axe y est orienté "vers le bas"} et on normalise les positions de manière à ce que la plus grande dimension (hauteur ou largeur) de l'image vaille 1.
En posant $w$ la largeur, $h$ la hauteur et $j = max(w, h)$, cela revient à calculer les nouvelles coordonnées $(x', y')$ par la transformation affine de l'équation \ref{eq:normalisation}.
\begin{equation}
(x',y') = (x,y)\cdot\begin{pmatrix}
\frac{1}{j} & 0 \\
0 & -\frac{1}{j}
\end{pmatrix}+ \left(-\frac{w}{2j}, \frac{h}{2j}\right) \label{eq:normalisation}
\end{equation}
\subsection{Conclusion et résultats}
Nous obtenons désormais une position bien plus stable du drone. Évidemment, le bruit n'a pas été totalement supprimé, mais il ne provoque plus de "sauts" dans la position et reste, en moyenne, autour de la position du drone. Le bruit restant est probablement causé par la qualité de l'image renvoyée par le drone et par le seuil que nous avons défini. Des résultats de l'algorithme sont donnés figure \ref{result}. Les positions des cibles seront ensuite publiées grâce au nœud \mintinline{bash}|target_publisher.py| dans un format compréhensible des nœuds de triangularisation.
Ces résultats ont été obtenu à l'aide du script \verb|test_find_targets.py| donné en annexe \ref{chap:test_find_targets}.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/realisation/target.png}
\caption{Résultat de l'algorithme}
\label{result}
\end{figure}
\FloatBarrier
\section{Premier asservissement sommaire}
Le premier asservissement qui a été réalisé n'utilisait qu'une seule boucle et asservissait la position du drone. On se référera à la modélisation mécanique réalisée précédemment.
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équentielle par une pente nulle en basse fréquence, puis une pente \verb|[-1]| en haute fréquence. Afin d'asservir le drone, nous aurons donc besoin d'un correcteur de type proportionnel-intégral
\begin{equation}
C(p)=K_p + \frac{K_i}{p}
\end{equation}
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 \verb|[-1]| dans les basses fréquence et une pente de \verb|[-2]| dans les hautes fréquences. Afin de corriger ces axes, nous allons donc utiliser une correction de type Proportionnelle-Dérivée :
\begin{equation}
C(p)=K_p+K_d p
\end{equation}
\subsection{Script \mintinline{bash}|triangle_control.py|}
Ce script reprend, en partie, le script provenant du projet initial qu'il est possible de retrouver sur le Gitlab de M. \bsc{Frezza-Buet} \cite{gitlab_frezza}. Nous l'avons adapté à notre projet et en avons repris les éléments principaux. Il utilise le fichier de configuration (Voir Annexe \ref{chap:configuration}) \verb|triangle_control.cfg| qui a également été repris, en partie, du projet initial.
La classe \verb|TriangleControl| implémente 6 méthodes :
\begin{description}
\item[\mintinline{python}|on_reconf|] Cette méthode permet, à partir du fichier de configuration, de définir les valeurs à donner aux différents paramètres des 4 PID, ainsi que les valeurs limites de l'accélération et de la vitesse du drone, l'angle de la caméra, la largeur et la longueur de la cible et la distance à laquelle on souhaite que le drone se trouve par rapport à la cible;
\item[\mintinline{python}|clear_controls|] : remet les erreurs à 0;
\item[\mintinline{python}|saturate_twist|] : limite la vitesse selon tous les axes;
\item[\mintinline{python}|on_comp|] : méthode qui n'a pas été modifié et qui permet de définir la position des trois rectangles bleus de la cible;
\item[\mintinline{python}|triangle|] : prend en paramètre les trois points de la cible et calcule la consigne de sortie à l'aide de la bibliothèque SimplePID de Python.
\end{description}
\subsection{Conclusion sur l'utilisation d'une simple boucle}
La régulation simple donne des résultats satisfaisants. Cependant quelques problèmes subsistent. Tout d'abord celui du dépassement. En effet la régulation étant linéaire, le dépassement est proportionnel à la consigne. Or si le drone se trouve à grande distance de la cible, le dépassement est tel que cette dernière finit par se trouver hors champ de la caméra, provoquant un comportement chaotique du drone. Une solution pour cela serait de saturer la vitesse du drone afin de limiter l'inertie, et donc le dépassement. D'autre part le système reste "assez lent", dans le sens où il ne donne pas vraiment le sentiment d'un asservissement rigide à la cible. Enfin, il serait intéressant de rendre notre code plus modulaire afin de pouvoir facilement changer la régulation dans un fichier \verb|.launch| de ROS. Afin de régler les deux premiers problèmes, nous choisissons d'implémenter une double régulation en vitesse pour laquelle nous développons une bibliothèque pour effectuer de l'automatique simple sous ROS
\section{Développement de la bibliothèque d'automatique sous ROS}
Nous avons développer une bibliothèque permettant de créer d'implémenter des PID sous ROS et de les régler dynamiquement par un protocole expérimental simple. Afin d'implémenter les correcteurs, nous avons créé des nœuds ROS que nous avons ensuite connectés dans des fichiers \verb|.launch|.
L'idée est de créer plusieurs classes de nœuds dans un script Python dont les paramètres seront obtenus à l'aide de fichiers \verb|.cfg|.
\subsection{Mesure de la vitesse}
Afin d'implémenter la partie dérivée de nos PID, il faut pouvoir calculer la vitesse du drone.
La mesure de vitesse doit se faire en dérivant la mesure de position. Cependant le bruit présent sur cette mesure empêche d'utiliser une dérivation naïve: en effet, on aurait alors de brusques sauts sur la valeur mesurée dus aux hautes fréquences dans le spectre du bruit. Afin d'obtenir une valeur lissée de la vitesse, on se propose d'utiliser un filtre de \bsc{SavitzkyGolay}.
\subsubsection{Principe}
Un filtre de \bsc{SavitzkyGolay} \cite{sav_gol} est un filtre à réponse impulsionnelle finie, qui correspond à une approximation locale du signal par un polynôme de degré faible. Ainsi, un filtre moyenneur est un filtre de \bsc{SavitzkyGolay} simple. Afin d'obtenir la réponse indicielle $[b_0, \dots b_n ]$ du filtre, on utilise la méthode des moindres carrés. En posant $((x_i,y_i))_{i\in\intervalleEntier{1}{n}}$ les $n$ points de la fenêtre, et en écrivant le polynôme d'approximation $a_0 + a_1 X + \dots + a_k X^k$, Cela revient donc à déterminer le jeu de coefficients $(a_0,\dots, a_k)$ qui minimise la grandeur de l'équation \ref{eq:moindrecarres_raw}.
\begin{equation}
\left \|
\begin{pmatrix}
y_1 \\
y_2 \\
\vdots \\
y_n
\end{pmatrix}
-
\begin{pmatrix}
1 & x_1 & x_1 ^2 & \cdots & x_1 ^ k \\
1 & x_2 & x_2 ^2 & \cdots & x_2 ^ k \\
\vdots & \vdots & \vdots & & \vdots \\
1 & x_n & x_n ^2 & \cdots & x_n ^ k
\end{pmatrix}
\cdot
\begin{pmatrix}
a_0 \\
a_1 \\
\vdots \\
a_k
\end{pmatrix}
\right \| ^2
\label{eq:moindrecarres_raw}
\end{equation}
En supposant de plus que la fenêtre de points $((x_i,y_i))_{i\in\intervalleEntier{1}{k}}$ que l'on souhaite lisser est centrée en 0 (on peut toujours se ramener à ce cas par changement de variable), telle que les $x_i$ soient espacés régulièrement d'un pas $h$, et $k$ impair, on peut s'affranchir des valeurs prises par $(x_i)$ en calculant les $(a'_0,\dots, a'_k)$ qui minimisent
\begin{eqnarray}
L((y_k),(a_k)) &=&
\left \|
\underbrace{
\begin{pmatrix}
y_1 \\
y_2 \\
\vdots \\
y_n
\end{pmatrix}}_{=Y}
-
\underbrace{
\begin{pmatrix}
1 & -\floor{\frac{n}{2}} & \left(-\floor{\frac{n}{2}}\right) ^2 & \cdots & \left(-\floor{\frac{n}{2}}\right) ^ k \\
1 & \left(-\floor{\frac{n-1}{2}}\right) & \left(-\floor{\frac{n-1}{2}}\right) ^2 & \cdots & \left(-\floor{\frac{n-1}{2}}\right) ^ k \\
\vdots & \vdots & \vdots & \vdots & \vdots \\
1 & -1 & \left(-1\right) ^2 & \cdots & \left(-1\right) ^ k \\
1 & 0 & 0 & \cdots & 0 \\
1 & \left(1\right) & \left(1\right) ^2 & \cdots & \left(1\right) ^ k \\
\vdots & \vdots & \vdots & \vdots & \vdots \\
1 & \left(\floor{\frac{n-1}{2}}\right) & \left(\floor{\frac{n-1}{2}}\right) ^2 & \cdots & \left(\floor{\frac{n-1}{2}}\right) ^ k \\
1 & \left(\floor{\frac{n}{2}}\right) & \left(\floor{\frac{n}{2}}\right) ^2 & \cdots & \left(\floor{\frac{n}{2}}\right) ^ k
\end{pmatrix}}_{=M}
\cdot
\underbrace{
\begin{pmatrix}
a'_0 \\
a'_1 \\
\vdots \\
a'_k
\end{pmatrix}}_{=A}
\right \| ^2 \\
&=& \left(
Y
- M \cdot A
\right)^\intercal \cdot
\left(
Y
- M \cdot A
\right)
\label{eq:moindrecarres}
\end{eqnarray}
On a donc :
\begin{eqnarray}
\frac{\partial L}{\partial (A)}(A) &=& -2 \cdot M^\intercal \cdot (Y - M \cdot A)
\end{eqnarray}
Et finalement, en cherchant le point où cette dérivée s'annule :
\begin{eqnarray}
A = \underbrace{(M^\intercal\cdot M)^{-1} \cdot M^\intercal}_{=B} \cdot Y
\end{eqnarray}
On peut ainsi obtenir facilement les valeurs "lissées" en chaque point $i$ : en effet, la valeur de la fonction en un point est donné par le coefficient $a_0$, celle de sa dérivée par $\frac{a_1}{h}$ etc. Plus formellement, pour approximer la dérivée d'ordre $d$, on peut convoluer le signal par le filtre RIF $[b_1, \dots b_n ]$, avec
\begin{equation}
\forall i \in \intervalleEntier{0}{n}, b_i = B_{d,n-i}
\end{equation}
Dans le cas de notre projet, on ne s'intéresse qu'a la vitesse (donc $d=1$). Il faut maintenant déterminer la taille du filtre ($n$) et le degré $k$ du polynôme d'approximation. En effet on souhaite minimiser $n$ car la mesure de vitesse induit un retard de $\frac{n}{2} \times h$.
\subsubsection{Protocole expérimental}
Afin de déterminer le filtre que nous utiliserons, nous choisissons d'en tester plusieurs sur le même relevé de position. Pour relever la position, on se contente de tenir le drone allumé face à la cible puis de marcher dans sa direction. On se référera à l'annexe \ref{chap:export} pour la méthode employée pour exporter les données depuis ROS vers un fichier \verb|output.txt|. On peut ensuite traiter les données avec le script Julia \verb|test_filter.jl| (annexe \ref{chap:test_filter}).
\subsubsection{Choix du filtre}
Les résultats obtenus sont donnés figures \ref{fig:savgol_quad}, \ref{fig:savgol_cub} et \ref{fig:savgol_big_quad}. On remarque que la vitesse est mieux lissée lorsqu'un filtre quadratique est utilisé. En effet, plus le degré du polynôme est élevé, plus il sera proche du signal mesuré et donc lissera moins bien.
Sans surprise, le fait d'augmenter la taille du filtre permet de mieux lisser la vitesse. Toutefois, pour éviter de causer un retard trop important dû à l'attente des points pour calculer la dérivée, il sera nécessaire de trouver un compromis entre signal lissé et retard inhérent au filtre, ceci afin d'augmenter la stabilité du système.
Après étude des courbes obtenues, nous avons choisis de commencer les expérimentations d'asservissement avec un filtre quadratique de 19 points, ce qui semble assurer un bien meilleur lissage. Cependant il faut prendre en compte le retard induit par la taille de fenêtre.
Lors de l'implémentation du filtre, il faut également s'assurer que la fréquence d'échantillonage du signal d'entrée correspond à celle pour lequel le filtre est calculé\footnote{Nos expérimentations ont montré la très mauvaise stabilité du filtre dans les cas où la fréquence d'échantillonage n'est pas constante.}.
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/realisation/mesure_vitesse_quadratique.eps}
\caption{Performance des filtres quadratiques}
\label{fig:savgol_quad}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/realisation/mesure_vitesse_cubique.eps}
\caption{Performance des filtres cubiques}
\label{fig:savgol_cub}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/realisation/mesure_vitesse_big_quadra.eps}
\caption{Performance des filtres quadratiques pour des nombres de points élevés}
\label{fig:savgol_big_quad}
\end{figure}
\FloatBarrier
\subsection{Création de fichiers de configuration}
Les fichiers de configuration vont nous permettre de régler, à l'aide d'une interface graphique, les paramètres de nos correcteurs dans la double boucle. Pour une explication plus détaillée du fonctionnement des fichiers de configuration, on se réfèrera à l'annexe \ref{chap:configuration}.
Nous avons créé les fichiers de configurations suivants :
\begin{description}
\item[\mintinline{python}|DerivativeNode.cfg|] : permet de choisir le gain de la partie dérivée du correcteur et le filtre de Savitzky-Golay adapté (ordre et taille du polynôme à utiliser);
\item[\mintinline{python}|IntegralNode.cfg|] : permet de choisir le gain de la partie intégrale du correcteur et les valeurs minimale et maximale de l'intégrale;
\item[\mintinline{python}|ProportionalNode.cfg|] : permet de choisir le gain de la partie proportionnelle du correcteur;
\item[\mintinline{python}|InputNode.cfg|] : contient la valeur d'une entrée;
\item[\mintinline{python}|SaturateNode.cfg|] : permet de choisir les valeurs de saturation (max et min);
\item[\mintinline{python}|RateNode.cfg|] : permet de forcer une fréquence d'échantillonage constante.
\end{description}
\subsection{Création des classes de nœuds dans un script Python}
L'idée du script est de créer une classe de n\oe ud \verb|ControlNode| qui se spécialise en d'autres n\oe uds utiles pour notre PID. Chacun des noeuds héritant de \verb|ControlNode| prendra alors une ou plusieures entrées afin de générer une sortie. On peut également leur appliquer un reset afin de mettre la sortie à 0.
Dans la classe \verb|ControlNode|, on définit un Publisher \verb|output_topic| qui publie sur le topic "output" ainsi qu'un Subscriber qui s'inscrit au topic "reset".
Le diagramme d'héritage de notre script est donné figure \ref{fig:diag_pid}, page \pageref{fig:diag_pid}.
\begin{landscape}
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{images/realisation/uml.png}
\caption{Diagramme UML}
\label{fig:diag_pid}
\end{figure}
\end{landscape}
Les méthodes de la classe mère sont les suivantes :
\begin{description}
\item[\mintinline{python}|on_reset(self, value)|] : la valeur de l'output est remise à 0. Certaines classes filles comme \verb|DerivativeNode| surchargent cette méthode pour remettre d'autres valeurs à 0;
\item[\mintinline{python}|on_reconf(self, config, level)|] : permet de récupérer la configuration, réalise également un appel à \mintinline{python}|on_reset|;
\item[\mintinline{python}|on_compute(self, value)|] : publie sur le topic "output" et met à jour la date du dernier calcul pour la limitation de fréquence;
\item[\mintinline{python}|check_time(self, delta_time=0.0)|] : permet de vérifier qu'on ne réalise pas de calculs trop souvent et donc de manière irrégulière\footnote{En effet, comme il est dit dans la section portant sur le filtre dérivateur, ce dernier nécessite un pas d'échantillonage constant.}. On vérifie que le temps passé depuis le dernier calcul est supérieur au \verb|refresh_time| que l'on s'est imposé.
\end{description}
On définit une classe fille \verb|InputControlNode| qui hérite de \verb|ControlNode|. Ceci a été l'occasion d'expérimenter un effet de bord intéressant de l'héritage en environnement multi-threadé. En effet, \verb|ControlNode| lance le Subscriber sur \verb|on_reset| dès l'appel à la méthode \verb|__init__| de la classe mère, mais c'est la méthode \verb|on_reset| de la classe fille qui est appelée, méthode qui n'est possiblement pas encore correctement initialisée, menant à des erreurs d'exécutions. Cette classe fille nous permet de rajouter un Subscriber qui récupère un input d'un topic "input".
Toutes les classes filles de \verb|InputControlNode| s'inscriront donc à un topic pour récupérer une entrée et publieront sur un topic "output". Les classes héritant de \verb|InputControlNode| sont :
\begin{description}
\item[\mintinline{python}|ProportionalNode|] : partie proportionnelle du correcteur, permet de définir la valeur du gain et de publier l'output sur un topic avec \verb|on_compute| après vérification du temps;
\item[\mintinline{python}|SaturateNode|] : permet d'imposer une valeur maximale et minimale à l'output. La classe \verb|IntegralNode| en hérite. Cette classe permet de définir la valeur du gain de l'intégrale et de publier l'output sur un topic (output qui sera donc saturé). Ceci permet d'éviter des instabilités dûes à l'action intégrale. L'intégration est réalisée avec la méthode des rectangles\footnote{Il serait intéressant d'étudier l'effet de méthodes d'intégration plus performantes, notamment sur la stabilité.};
\item[\mintinline{python}|DerivativeNode|] : partie dérivée du correcteur, permet de définir la valeur du gain, la façon de calculer la valeur de la dériver et de publier l'output de la correction dérivée sur un output. La valeur de la dérivée est calculée à l'aide d'un filtre de \bsc{Savitzky-Golay} dont on récupère le paramètre dans la configuration;
\item[\mintinline{python}|DifferenciateNode|] : permet de faire la différence entre une valeur d'entrée et une valeur mesurée;
\item[\mintinline{python}|InputNode|] : permet de définir un nœud publiant une sortie;
\item[\mintinline{python}|RateNode|] : permet de forcer une fréquence d'échantillonage fixe sur la sortie.
\end{description}
Enfin, \verb|SumNode| hérite de \verb|ControlNode|. Il va permettre de faire la somme des différentes parties du correcteur PID. Nous ne le faisons pas hériter de \verb|InputControlNode| car il ne prendra pas toujours une seule entrée. La classe prend donc en paramètre un nombre de topics auxquels elle s'inscrit et qui seront les entrées de la somme.
Ces classes permettront la création de nos nœuds ROS et à terme devraient permettre l'implémentation de la double boucle d'asservissement.
Le script que nous avons écrit prend en paramètre le type de nœud que l'utilisateur souhaite créer (\verb|sum|, \verb|differenciate|, \verb|input|, \verb|saturate|, \verb|derivative|, \verb|integral|, \verb|rate| ou \verb|proportional|) afin de pouvoir aisément lancer beaucoup de nœuds en les organisant dans un fichier \verb|.launch|
\subsection{Fichier \mintinline{bash}|control.launch|}
Puisque dans la suite nous aurons régulièrement à créer des régulateurs PID, nous décidons d'ajouter à notre bibliothèque un fichier \verb|launch| permettant d'en inclure un facilemetn. Ce fichier utilise 8 paramètres : \verb|input|, \verb|output|, \verb|measure|, \verb|reset|, \verb|param_P|, \verb|param_I|, \verb|param_D| et \verb|param_input|. Les quatre premiers paramètres permettent de régler les topics sur lesquels le block doit publier ou s'inscrire, tandis que les quatre derniers donnent les chemin relatif vers les fichiers de configuration des différents nœuds par rapport au répertoire \verb|params| de notre projet.
Le bloc est composé des noeuds suivants : une entrée, une différence qui entre l'entrée et la mesure, les parties proportionnelle, intégrale et dérivée du PID qui font leurs calculs et les publie sur des topics de sorties et une somme sur ces sorties et publie le résultat sur le topic \verb|output|.
On crée les nœuds de la manière suivante :
\begin{minted}{xml}
<node name="nome name" pkg="package" type="control_compute.py" args="name of the class">
<remap from="name of the argument in control_compute.py" to="new name" />
...
</node>
\end{minted}
Le remap permet de relier les noeuds entre eux. Par exemple, la sortie de la différence est remapé sur un epsilon et les entrées du PID sont remapées sur epsilon. La sortie de la somme devient donc l'entrée du PID.
Durant les phases de test, nous avons rencontré des problèmes lors du remap, notamment lors de l'utilisation du noeud de somme. Nous avons donc décidé de simplifier notre diagramme d'héritage en ne faisant pas hériter \verb|SumNode| de \verb|InputControlNode| ce qui nous permettait de définir plusieurs inputs et de régler le problème de remap. Nous ne savons toutefois pas pourquoi le problème existait au préalable.
Le fichier \verb|control.lauch| permet ainsi de générer le graphe de nœuds de la figure \ref{fig:control_block}.
\begin{figure}[!h]
\centering
\includegraphics[width=\linewidth]{images/realisation/control_launch.png}
\caption{Nœuds ROS du block control}
\label{fig:control_block}
\end{figure}
\section{Nœuds divers réalisés pour mettre en place l'asservissement}
Afin d'interfacer notre bibliothèque avec les drones BeBop, divers nœuds ont étés réalisés ou adaptés du projet existant de M. \bsc{Frezza}.
\subsection{Script \mintinline{bash}|safe_drone_teleop.py|}
Ce script a été presque entièrement repris du projet initial, à l'exception de l'ajout d'une publication sur le topic \verb|reset_pid| lors du passage en mode automatique afin de déclencher la remise à zéro des régulateurs, par exemple pour désaturer les actions intégrales. Il s'agit donc de l'interface de contrôle principale des drones.
\subsection{Script \mintinline{bash}|triangle.py|}
Ce script a pour mission de calculer la position du drone à partir de la position normalisée des cibles dans l'image. Il publie ensuite les positions au format \verb|Float64| de ROS, que les nœuds de notre bibliothèque comprennent.
\subsection{Script \mintinline{bash}{twist_controls.py}}
Ce script est destiné à lire la sortie des différents contrôleurs afin de générer un objet \verb|Twist| qui sera envoyé à \mintinline{bash}|safe_drone_teleop.py| pour être interprété comme la consigne à donner au drone.
\section{Asservissement simple boucle avec la bibliothèque}
\subsection{Méthode de \bsc{Ziegler-Nichols}}
Afin de déterminer les paramètres des correcteurs PID (axes $z$ et angle $z$), nous avons utilisé la méthode de \bsc{Ziegler-Nichols} \cite{zieg_nic_premier}. Pour réguler les boucles selon les quatre axes, nous allons générer des oscillations (qui sont faciles à voir) en augmentant progressivement le gain proportionnel. Une fois des oscillations d'amplitude et de fréquence constantes obtenues, nous allons pouvoir calculer le régulateur à utiliser en fonction de $K_u$ le gain proportionnel obtenu et $T_u$ la fréquence des oscillations.
\begin{center}
\begin{tabular}{|c|c|}
\hline
Type de contrôle & Paramètres de réglage \\
\hline
P.I.D & $K_p=0.6 K_u$ $K_i=\frac{T_u}{2}$ $K_d=\frac{T_u}{8}$ \\
\hline
P.I.D peu de dépassement & $K_p=0.33 K_u$ $K_i=\frac{T_u}{2}$ $K_d=\frac{T_u}{3}$ \\
\hline
P.I.D aucun dépassement & $K_p=0.2 K_u$ $K_i=\frac{T_u}{2}$ $K_d=\frac{T_u}{3}$ \\
\hline
\end{tabular}
\end{center}
\subsection{Méthode empirique}
Pour les deux autres axes ($x$ et $y$), nous avons utilisé une méthode empirique de réglage. Tous les autres gains étant par ailleurs nuls, on augmente progressivement le gain D\footnote{Pour rappel, cela revient à augmenter le gain P du PI équivalent du fait du comportement double intégrateur du système.}. Lorsque l'on atteint la limite du comportement oscillant du système, on augmente alors le gain D\footnote{Pour les mêmes raisons que précédemment, cela revient à augmenter le I du PI équivalent.}.
\subsection{Protocole de réglage}
Afin de faciliter le réglage du drone, il convient de régler les différents axes dans le "bon" ordre. Pour appliquer la méthode de \bsc{Ziegler-Nichols}, on pourra filmer les oscillations du drone (par exemple avec un téléphone portable) afin de mesurer la période des oscillations \textit{a posteriori}\footnote{Il existe de nombreux logiciels de relevé de position à partir d'une vidéo, par exemple avimeca.}.
Nous conseillons donc de procéder au réglage du drone dans cet ordre :
\begin{enumerate}
\item Axe $z$;
\item Lacet (angle selon $z$);
\item Axe $y$;
\item Axe $x$.
\end{enumerate}
Cependant on notera que l'asservissement des différents axes n'est pas totalement indépendant. En particulier, nous avons pu nous rendre compte que le réglage de l'axe $x$ a tendance à instabiliser le lacet. De plus, il est difficile de régler correctement l'axe $y$ si l'axe $x$ est instable, et \textit{vice-versa}. On procédera donc à un réglage par itérations successives. Enfin on notera que du fait de la mesure de l'erreur, il est nécessaire de donner des gains négatifs pour les axes $x$ et de lacet.
\subsection{Fichier \mintinline{bash}{launch}}
Nous avons créé un fichier \verb|simple_loop.launch| qui permet de lancer la simple boucle tout en chargeant les paramètres de drone que nous avons déterminé. Ce fichier fait usage du fichier \verb|control.launch| de notre bibliothèque.
\section{Asservissement double boucle avec la bibliothèque}
Afin d'améliorer les performances, on souhaite intégrer une boucle de régulation interne sur la vitesse. En outre, cette boucle devrait nous permettre d'ajouter une saturation en vitesse limitant le dépassement lorsque le drone arrive depuis une grande distance vers la cible. On modélise la nouvelle régulation avec la figure \ref{fig:double_boucle} (page \pageref{fig:double_boucle}).
\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] (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 {consigne +} (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] {} (sum);
\end{tikzpicture}
\caption{Modélisation simple de l'asservissement}
\label{fig:double_boucle}
\end{figure}
\subsection{Réglage de la double boucle}
\subsubsection{Méthode}
Afin de régler la double boucle, on utilisera la méthode de \bsc{Ziegler-Nichols}. Cette méthode permet de déterminer les paramètres du PID à implémenter de deux façons possibles.
\begin{itemize}
\item On peut générer des oscillations d'amplitudes et de fréquence constante sur la mesure à régler en augmentant doucement le gain proportionnel. Avec les valeurs du gain $K_u$ et de la période des oscillations $T_u$, on calcule les paramètres du PID de la façon suivante : $K_i=2/T_u,$ $K_p=0.6K_u$, $K_d=T_u/8$;
\item On enregistre la réponse du système non régulé à un échelon et on en déduit la valeur des paramètres par analyse de cette réponse comme donné sur la \ref{fig:ziegnic}.
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{zieg_nic.jpg}
\caption{Méthode de Ziegler-Nichols pour déterminer les paramètres d'un PID \cite{zieg_nic}}
\label{fig:ziegnic}
\end{figure}
\end{itemize}
\subsubsection{Réglage de la boucle interne}
Nous allons commencer par régler la boucle interne, soit la boucle asservissant la vitesse. Pour cela, nous allons utiliser la réponse du système non régulé à un échelon afin de trouver les paramètres du PID interne.
Pour cela, non envoie un échelon en inclinaison à notre drone (il s'agit donc d'une accélération) car nous ne pouvons pas directement lui donner une commande en vitesse, et on enregistre la réponse indicielle en boucle ouverte. Pour la calculer, nous avons utilisé un filtre de \bsc{Savitsky-Golay} quadratique de 19 points (avoir beaucoup de retard dans les calculs ne pose, ici, aucun problème, car nous ne cherchons pas à avoir une réponse rapide, mais une réponse la plus lissée possible pour déterminer au plus juste les paramètres découlant de la méthode de \bsc{Ziegler-Nichols}.
Afin de déterminer la réponse indicielle de la vitesse en boucle ouverte, nous avions besoin d'un grand espace. Nous avons donc déterminé cette réponse dans le gymnase en modifiant la couleur des cibles (jaunes) pour que le drone ne soit pas perturbé par le sol qui est bleu.
Cependant nos essais n'ont pas été très concluants pour plusieurs raisons. Tout d'abord parce que le drone a tendance à perdre la cible lorsqu'il est à grande distance, et à cause des changements de luminosité. Cependant un réglage à proximité de la cible n'est pas envisageable car le drone met quelques secondes à atteindre sa vitesse maximale : il dépasse donc la cible. La régulation en double boucle n'est donc pas fonctionnelle à l'heure de la cloture de ce rapport.
\subsection{Création du fichier launch et connection des noeuds}
Pour réaliser la double boucle, on crée un fichier \verb|launch| dédié.
On crée des noeuds afin de récupérer la position du drone
\begin{minted}{xml}
<node name="targets" pkg="detect_targets" type="target_publisher.py">
</node>
<node name="triangle" pkg="detect_targets" type="triangle_control.py" output="screen">
<remap from="component_centers" to="targets"/>
</node>
\end{minted}
On organise grâce à des groupes :
\begin{minted}{xml}
<group ns="name">
...
</group>
\end{minted}
À l'intérieur de ces groupes, on récupère les noeuds crées avec \verb|control.launch| en incluant le fichier :
\begin{minted}{xml}
<include file="$(find detect_targets)/launch/control.launch" ns="name of the loop">
\end{minted}
Et on donne les bonnes valeurs aux arguments grâce à \begin{minted}{xml}
<arg name="name of the argument in control.launch" value="value of the argument" />
\end{minted}
Pour les boucles en x et en y, on crée deux boucles, tandis que pour les boucles en z, on en crée qu'une seule (car on ne régulera pas cet axe avec une double boucle, ce dernier n'étant pas soumis aux problèmes de lenteur et de dépassement étant donné les faibles déplacements sur cet axe).
Il "suffit" ensuite de bien relier les entrées et les sorties des noeuds. Nous obtenu le résultat de nos noeuds \ref{fig:noeuds}.
\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{noeuds.png}
\caption{Nœuds ROS pour la double boucle}
\label{fig:noeuds}
\end{figure}

View file

@ -0,0 +1,6 @@
\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}

View file

@ -0,0 +1,60 @@
\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}

Binary file not shown.

View file

@ -1,164 +0,0 @@
\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}

View file

@ -0,0 +1,327 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.15.10 (http://cairographics.org)
%%CreationDate: Sat May 25 18:04:18 2019
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 7 660 155 749
%%EndComments
%%BeginProlog
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
/cairo_data_source {
CairoDataIndex CairoData length lt
{ CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
{ () } ifelse
} def
/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
/cairo_image { image cairo_flush_ascii85_file } def
/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 7 660 155 749
%%EndPageSetup
q 7 660 148 89 rectclip
1 0 0 -1 0 842 cm q
0 g
0.242796 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 1 0 0 cm
21.984 102.398 m 21.984 175.824 l S Q
21.984 104.828 m 22.953 105.801 l 21.984 102.398 l 21.012 105.801 l h
21.984 104.828 m f*
0.258982 w
q 0 1 -1 0 0 0 cm
104.828 -21.984 m 105.801 -22.953 l 102.398 -21.984 l 105.801 -21.012 l
h
104.828 -21.984 m S Q
0.293284 w
q 1 0 0 1 0 0 cm
12.207 151.117 m 150.676 151.117 l S Q
147.746 151.117 m 146.57 152.293 l 150.676 151.117 l 146.57 149.945 l h
147.746 151.117 m f*
0.312836 w
q -1 0 0 -1 0 0 cm
-147.746 -151.117 m -146.57 -152.293 l -150.676 -151.117 l -146.57 -149.945
l h
-147.746 -151.117 m S Q
42.59 101.055 m 42.59 112.262 l 44.125 112.262 l 44.125 111.816 l 43.039
111.816 l 43.039 101.5 l 44.125 101.5 l 44.125 101.055 l h
42.59 101.055 m f*
51.758 106.883 m 51.828 106.883 l 51.863 106.879 l 51.918 106.879 l 51.934
106.875 l 51.949 106.875 l 52.027 106.855 l 52.039 106.848 l 52.055 106.844
l 52.09 106.82 l 52.098 106.809 l 52.109 106.801 l 52.117 106.789 l 52.125
106.773 l 52.129 106.77 l 52.137 106.754 l 52.137 106.746 l 52.141 106.738
l 52.141 106.73 l 52.145 106.723 l 52.145 106.715 l 52.148 106.707 l 52.148
106.695 l 52.152 106.688 l 52.152 106.656 l 52.152 106.434 51.949 106.434
51.758 106.434 c 45.695 106.434 l 45.504 106.434 45.305 106.434 45.305
106.656 c 45.305 106.883 45.504 106.883 45.695 106.883 c h
51.758 106.883 m f*
56.387 102.285 m 56.387 102.148 l 56.383 102.141 l 56.383 102.109 l 56.371
102.074 l 56.371 102.062 l 56.363 102.055 l 56.355 102.039 l 56.34 102.023
l 56.324 102.016 l 56.312 102.008 l 56.309 102.008 l 56.301 102.004 l 56.289
102.004 l 56.285 102 l 56.266 102 l 56.258 101.996 l 56.242 101.996 l 56.234
101.992 l 56.129 101.992 l 55.434 102.711 54.449 102.711 54.09 102.711
c 54.09 103.059 l 54.316 103.059 54.977 103.059 55.559 102.766 c 55.559
108.574 l 55.559 108.977 55.527 109.109 54.516 109.109 c 54.156 109.109
l 54.156 109.461 l 54.551 109.422 55.527 109.422 55.973 109.422 c 56.422
109.422 57.395 109.422 57.789 109.461 c 57.789 109.109 l 57.43 109.109
l 56.422 109.109 56.387 108.988 56.387 108.574 c h
56.387 102.285 m f*
58.953 112.262 m 60.488 112.262 l 60.488 101.055 l 58.953 101.055 l 58.953
101.5 l 60.039 101.5 l 60.039 111.816 l 58.953 111.816 l h
58.953 112.262 m f*
126.938 138.262 m 125.324 138.387 l 125.324 138.734 l 126.109 138.734 126.199
138.809 126.199 139.363 c 126.199 145.191 l 126.199 145.691 126.078 145.691
125.324 145.691 c 125.324 146.043 l 125.695 146.031 126.289 146.004 126.57
146.004 c 126.852 146.004 127.398 146.031 127.812 146.043 c 127.812 145.691
l 127.062 145.691 126.938 145.691 126.938 145.191 c h
126.938 138.262 m f*
133.344 143.645 m 133.328 143.379 l 133.312 143.246 l 133.289 143.117 l
133.262 142.992 l 133.23 142.871 l 133.188 142.746 l 133.145 142.629 l
133.094 142.516 l 133.039 142.402 l 132.98 142.293 l 132.914 142.184 l 132.844
142.082 l 132.695 141.887 l 132.609 141.797 l 132.527 141.707 l 132.434
141.625 l 132.34 141.547 l 132.246 141.473 l 132.145 141.406 l 132.039
141.34 l 131.93 141.281 l 131.824 141.23 l 131.711 141.184 l 131.598 141.141
l 131.48 141.105 l 131.359 141.074 l 131.238 141.051 l 131.113 141.035
l 130.988 141.023 l 130.863 141.023 l 130.852 141.266 l 131.344 141.266
131.824 141.516 132.117 141.996 c 132.41 142.477 132.41 143.129 132.41 143.555
c 132.41 143.957 132.41 144.562 132.164 145.055 c 131.918 145.559 131.426
145.883 130.863 145.883 c 130.383 145.883 129.887 145.648 129.586 145.137
c 129.305 144.641 129.305 143.957 129.305 143.555 c 129.305 143.117 129.305
142.512 129.574 142.016 c 129.879 141.504 130.402 141.266 130.852 141.266
c 130.863 141.023 l 129.465 141.023 128.375 142.242 128.375 143.645 c 128.375
145.09 129.539 146.164 130.852 146.164 c 132.207 146.164 133.344 145.066
133.344 143.645 c h
133.344 143.645 m f*
134.863 144.551 m 134.867 144.547 l 134.867 144.469 l 134.871 144.453 l
134.871 144.441 l 134.875 144.426 l 134.875 144.41 l 134.883 144.391 l
134.883 144.371 l 134.887 144.355 l 134.891 144.336 l 134.898 144.316 l
134.902 144.297 l 134.934 144.219 l 134.945 144.195 l 134.957 144.176 l
134.965 144.152 l 134.977 144.133 l 134.992 144.109 l 135.004 144.09 l 135.02
144.066 l 135.035 144.047 l 135.055 144.023 l 135.492 144.336 135.949 144.371
136.164 144.371 c 136.164 144.117 l 135.188 144.117 135.188 142.992 135.188
142.734 c 135.188 142.43 135.199 142.074 135.367 141.797 c 135.461 141.66
135.715 141.348 136.164 141.348 c 137.137 141.348 137.137 142.465 137.137
142.723 c 137.137 143.023 137.129 143.383 136.961 143.664 c 136.871 143.797
136.613 144.117 136.164 144.117 c 136.164 144.371 l 137.207 144.371 137.98
143.598 137.98 142.734 c 137.98 142.316 137.801 141.902 137.523 141.648
c 137.922 141.266 138.328 141.211 138.531 141.211 c 138.555 141.211 138.609
141.211 138.645 141.223 c 138.516 141.266 138.465 141.391 138.465 141.523
c 138.465 141.715 138.609 141.848 138.789 141.848 c 138.898 141.848 139.109
141.77 139.109 141.516 c 139.109 141.324 138.977 140.965 138.543 140.965
c 138.316 140.965 137.824 141.035 137.355 141.488 c 136.883 141.121 136.41
141.09 136.164 141.09 c 135.121 141.09 134.348 141.859 134.348 142.723
c 134.348 143.215 134.594 143.645 134.875 143.879 c 134.73 144.047 134.527
144.418 134.527 144.809 c 134.527 145.156 134.676 145.582 135.023 145.805
c 134.348 145.996 133.988 146.477 133.988 146.93 c 133.988 147.734 135.098
148.352 136.469 148.352 c 136.48 148.098 l 135.348 148.098 134.574 147.523
134.574 146.93 c 134.574 146.41 135 145.996 135.492 145.965 c 136.156 145.965
l 137.117 145.965 138.375 145.965 138.375 146.93 c 138.375 147.535 137.578
148.098 136.48 148.098 c 136.469 148.352 l 137.789 148.352 138.957 147.777
138.957 146.906 c 138.957 146.512 138.797 145.941 138.23 145.629 c 137.637
145.316 136.984 145.316 136.297 145.316 c 136.016 145.316 135.535 145.316
135.461 145.305 c 135.098 145.258 134.863 144.91 134.863 144.551 c h
134.863 144.551 m f*
143.16 148.73 m 143.16 148.703 l 143.156 148.699 l 143.156 148.695 l 143.148
148.688 l 143.145 148.68 l 143.145 148.676 l 143.141 148.668 l 143.133
148.66 l 143.129 148.652 l 143.121 148.648 l 143.117 148.637 l 143.082 148.602
l 143.078 148.594 l 143.07 148.59 l 143.066 148.582 l 143.047 148.562 l
143.043 148.555 l 143.035 148.547 l 143.027 148.543 l 143.023 148.535 l
143.012 148.527 l 143.008 148.52 l 142.996 148.512 l 142.992 148.504 l
142.98 148.496 l 142.973 148.484 l 141.574 147.074 141.215 144.953 141.215
143.242 c 141.215 141.289 141.641 139.336 143.016 137.941 c 143.16 137.801
143.16 137.781 143.16 137.746 c 143.16 137.668 143.121 137.637 143.055
137.637 c 142.941 137.637 141.934 138.395 141.27 139.816 c 140.699 141.055
140.566 142.297 140.566 143.242 c 140.566 144.117 140.688 145.469 141.305
146.738 c 141.973 148.117 142.941 148.844 143.055 148.844 c 143.121 148.844
143.16 148.812 143.16 148.73 c h
143.16 148.73 m f*
150.582 141.871 m 150.578 141.824 l 150.578 141.781 l 150.574 141.734 l
150.574 141.691 l 150.566 141.652 l 150.562 141.613 l 150.555 141.574 l
150.547 141.539 l 150.535 141.5 l 150.527 141.465 l 150.504 141.402 l 150.492
141.375 l 150.477 141.344 l 150.465 141.316 l 150.449 141.289 l 150.434
141.266 l 150.418 141.246 l 150.402 141.223 l 150.383 141.203 l 150.367
141.184 l 150.328 141.152 l 150.309 141.141 l 150.285 141.129 l 150.266
141.117 l 150.246 141.109 l 150.223 141.102 l 150.203 141.098 l 150.156
141.09 l 150.133 141.09 l 149.84 141.09 149.539 141.355 149.539 141.617
c 149.539 141.723 149.594 141.848 149.707 141.949 c 149.898 142.117 150.102
142.422 150.102 142.891 c 150.102 143.344 149.883 143.98 149.539 144.496
c 149.203 144.977 148.789 145.355 148.258 145.355 c 147.621 145.355 147.273
144.953 147.176 144.352 c 147.297 144.059 147.555 143.344 147.555 143.023
c 147.555 142.891 147.496 142.781 147.352 142.781 c 147.262 142.781 147.141
142.805 147.051 142.969 c 146.93 143.191 146.789 143.922 146.789 144.328
c 146.422 144.855 145.977 145.355 145.27 145.355 c 144.527 145.355 144.289
144.695 144.289 144.07 c 144.289 142.668 145.438 141.488 145.438 141.348
c 145.438 141.223 145.348 141.129 145.223 141.129 c 145.074 141.129 144.996
141.277 144.934 141.379 c 144.359 142.211 143.934 143.543 143.934 144.562
c 143.934 145.336 144.195 146.164 145.109 146.164 c 145.902 146.164 146.434
145.605 146.836 144.988 c 146.938 145.637 147.375 146.164 148.07 146.164
c 148.945 146.164 149.484 145.484 149.883 144.641 c 150.156 144.09 150.582
142.566 150.582 141.871 c h
150.582 141.871 m f*
154.406 143.242 m 154.406 142.98 l 154.402 142.891 l 154.395 142.699 l
154.379 142.504 l 154.359 142.297 l 154.336 142.082 l 154.305 141.863 l
154.27 141.637 l 154.223 141.406 l 154.172 141.176 l 154.113 140.938 l 154.043
140.699 l 153.965 140.461 l 153.879 140.219 l 153.832 140.098 l 153.777
139.98 l 153.727 139.859 l 153.668 139.742 l 153 138.363 152.035 137.637
151.922 137.637 c 151.855 137.637 151.809 137.68 151.809 137.746 c 151.809
137.781 151.809 137.801 152.02 138.004 c 153.121 139.113 153.762 140.895
153.762 143.242 c 153.762 145.156 153.348 147.129 151.953 148.543 c 151.809
148.676 151.809 148.699 151.809 148.73 c 151.809 148.797 151.855 148.844
151.922 148.844 c 152.035 148.844 153.039 148.082 153.703 146.66 c 154.273
145.426 154.406 144.184 154.406 143.242 c h
154.406 143.242 m f*
15.551 93.676 m 15.551 93.664 l 15.547 93.66 l 15.547 93.641 l 15.543 93.637
l 15.543 93.633 l 15.539 93.625 l 15.539 93.621 l 15.531 93.613 l 15.531
93.609 l 15.523 93.602 l 15.52 93.594 l 15.512 93.586 l 15.504 93.586 l
15.5 93.578 l 15.492 93.578 l 15.484 93.57 l 15.477 93.57 l 15.473 93.566
l 15.469 93.566 l 15.465 93.562 l 15.426 93.562 l 15.395 93.562 15.383
93.57 15.258 93.695 c 14.477 94.559 l 14.375 94.402 13.859 93.562 12.613
93.562 c 10.113 93.562 7.59 96.039 7.59 98.637 c 7.59 100.418 8.836 101.707
10.652 101.707 c 11.145 101.707 11.652 101.609 12.051 101.445 c 12.613
101.219 12.824 100.98 13.031 100.758 c 13.133 101.039 13.418 101.453 13.531
101.453 c 13.59 101.453 13.613 101.418 13.613 101.406 c 13.633 101.387
13.746 100.961 13.801 100.727 c 14.012 99.863 l 14.059 99.672 14.113 99.48
14.16 99.289 c 14.285 98.785 14.293 98.762 14.934 98.75 c 14.988 98.75
15.113 98.738 15.113 98.527 c 15.113 98.445 15.059 98.406 14.969 98.406
c 14.707 98.406 14.051 98.438 13.793 98.438 c 13.445 98.438 12.57 98.406
12.219 98.406 c 12.121 98.406 11.988 98.406 11.988 98.625 c 11.988 98.75
12.078 98.75 12.324 98.75 c 12.332 98.75 12.66 98.75 12.918 98.773 c 13.207
98.805 13.266 98.84 13.266 98.988 c 13.266 99.086 13.145 99.594 13.031
100.004 c 12.719 101.238 11.258 101.363 10.863 101.363 c 9.789 101.363 8.613
100.727 8.613 99.008 c 8.613 98.664 8.723 96.812 9.902 95.352 c 10.504
94.59 11.594 93.906 12.703 93.906 c 13.848 93.906 14.508 94.77 14.508 96.07
c 14.508 96.52 14.477 96.531 14.477 96.645 c 14.477 96.758 14.598 96.758
14.645 96.758 c 14.789 96.758 14.789 96.73 14.844 96.531 c h
15.551 93.676 m f*
20.309 97.93 m 20.312 97.93 l 20.312 97.918 l 20.316 97.918 l 20.316 97.906
l 20.32 97.902 l 20.32 97.898 l 20.324 97.895 l 20.324 97.883 l 20.328
97.879 l 20.328 97.863 l 20.332 97.855 l 20.332 97.84 l 20.336 97.836 l
20.336 97.832 l 20.34 97.828 l 20.34 97.809 l 20.34 97.766 20.309 97.695
20.219 97.695 c 20.059 97.695 19.41 97.758 19.215 97.777 c 19.148 97.781
19.039 97.789 19.039 97.957 c 19.039 98.062 19.148 98.062 19.246 98.062
c 19.621 98.062 19.621 98.121 19.621 98.184 c 19.621 98.238 19.605 98.285
19.59 98.355 c 19.141 100.145 l 18.977 99.887 18.711 99.684 18.332 99.684
c 18.332 99.898 l 18.883 99.898 19.035 100.492 19.035 100.582 c 19.035
100.613 19.016 100.668 19.008 100.691 c 18.641 102.156 l 18.586 102.379
18.414 102.531 18.242 102.684 c 18.172 102.742 17.855 102.996 17.516 102.996
c 17.23 102.996 16.949 102.793 16.949 102.238 c 16.949 101.82 17.172 100.957
17.355 100.645 c 17.715 100.016 18.117 99.898 18.332 99.898 c 18.332 99.684
l 17.332 99.684 16.312 100.785 16.312 101.914 c 16.312 102.676 16.82 103.215
17.496 103.215 c 17.918 103.215 18.297 102.973 18.609 102.664 c 18.758
103.137 19.215 103.215 19.414 103.215 c 19.695 103.215 19.895 103.043 20.035
102.801 c 20.207 102.496 20.309 102.047 20.309 102.016 c 20.309 101.914
20.207 101.914 20.184 101.914 c 20.074 101.914 20.066 101.945 20.016 102.156
c 19.918 102.531 19.766 102.996 19.441 102.996 c 19.238 102.996 19.184
102.824 19.184 102.613 c 19.184 102.461 19.199 102.395 19.219 102.289 c
h
20.309 97.93 m f*
21.996 102.527 m 21.988 102.551 l 21.984 102.574 l 21.977 102.594 l 21.969
102.617 l 21.961 102.637 l 21.957 102.656 l 21.949 102.676 l 21.926 102.723
l 21.914 102.734 l 21.906 102.75 l 21.895 102.758 l 21.879 102.77 l 21.867
102.781 l 21.852 102.793 l 21.793 102.816 l 21.77 102.824 l 21.746 102.828
l 21.73 102.832 l 21.719 102.832 l 21.688 102.84 l 21.672 102.84 l 21.656
102.844 l 21.621 102.844 l 21.602 102.848 l 21.586 102.848 l 21.566 102.852
l 21.504 102.852 l 21.48 102.855 l 21.305 102.855 l 21.172 102.855 21.07
102.855 21.07 103.02 c 21.07 103.137 21.16 103.137 21.305 103.137 c 24.336
103.137 l 25.656 103.137 26.668 102.238 26.668 101.461 c 26.668 100.902
26.156 100.426 25.324 100.34 c 26.273 100.168 27.066 99.57 27.066 98.895
c 27.066 98.301 26.461 97.781 25.445 97.781 c 25.316 98.062 l 26.117 98.062
26.297 98.594 26.297 98.887 c 26.297 99.523 25.586 100.246 24.531 100.246
c 23.25 100.246 l 23.195 100.465 l 24.855 100.465 l 25.594 100.465 25.875
100.949 25.875 101.406 c 25.875 102.18 25.082 102.855 24.137 102.855 c
22.871 102.855 l 22.629 102.855 22.621 102.844 22.621 102.777 c 22.621 102.77
22.621 102.73 22.652 102.613 c 23.195 100.465 l 23.25 100.246 l 23.73 98.332
l 23.789 98.09 23.801 98.062 24.125 98.062 c 25.316 98.062 l 25.445 97.781
l 22.59 97.781 l 22.441 97.781 22.34 97.781 22.34 97.957 c 22.34 98.062
22.434 98.062 22.59 98.062 c 22.598 98.062 22.75 98.062 22.887 98.082 c
23.055 98.094 23.066 98.113 23.066 98.191 c 23.066 98.207 23.066 98.242
23.035 98.363 c h
21.996 102.527 m f*
77.801 144.574 m 76.715 144.574 l 76.715 134.258 l 77.801 134.258 l 77.801
133.812 l 76.266 133.812 l 76.266 145.02 l 77.801 145.02 l h
77.801 144.574 m f*
85.434 139.641 m 85.559 139.641 l 85.574 139.637 l 85.594 139.637 l 85.609
139.633 l 85.625 139.633 l 85.656 139.625 l 85.676 139.621 l 85.688 139.617
l 85.703 139.613 l 85.715 139.609 l 85.73 139.602 l 85.766 139.578 l 85.773
139.566 l 85.785 139.559 l 85.793 139.547 l 85.797 139.539 l 85.801 139.535
l 85.812 139.512 l 85.812 139.508 l 85.816 139.496 l 85.816 139.492 l 85.82
139.48 l 85.824 139.473 l 85.824 139.453 l 85.828 139.445 l 85.828 139.418
l 85.828 139.191 85.625 139.191 85.434 139.191 c 79.371 139.191 l 79.18
139.191 78.98 139.191 78.98 139.418 c 78.98 139.641 79.18 139.641 79.371
139.641 c h
85.434 139.641 m f*
88.191 141.355 m 89.379 140.199 l 91.129 138.652 91.805 138.047 91.805
136.93 c 91.805 135.648 90.797 134.75 89.426 134.75 c 88.156 134.75 87.328
135.785 87.328 136.781 c 87.328 137.41 87.891 137.41 87.922 137.41 c 88.113
137.41 88.504 137.273 88.504 136.816 c 88.504 136.523 88.305 136.23 87.91
136.23 c 87.824 136.23 87.797 136.23 87.766 136.242 c 88.023 135.512 88.629
135.098 89.277 135.098 c 90.297 135.098 90.785 136.012 90.785 136.93 c
90.785 137.824 90.223 138.711 89.605 139.406 c 87.453 141.805 l 87.328 141.926
87.328 141.949 87.328 142.219 c 91.484 142.219 l 91.805 140.266 l 91.523
140.266 l 91.465 140.605 91.387 141.098 91.273 141.266 c 91.195 141.355
90.457 141.355 90.211 141.355 c h
88.191 141.355 m f*
92.629 133.812 m 92.629 134.258 l 93.715 134.258 l 93.715 144.574 l 92.629
144.574 l 92.629 145.02 l 94.164 145.02 l 94.164 133.812 l h
92.629 133.812 m f*
0.968627 0 0 rg
0.75 w
q 1 0 0 1 0 0 cm
26.461 105.086 m 61.844 125.512 l 85.375 166.273 l 89.348 181.094 l S Q
Q Q
showpage
%%Trailer
end
%%EOF

View file

@ -0,0 +1,311 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.15.10 (http://cairographics.org)
%%CreationDate: Sat May 25 18:05:01 2019
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 7 753 155 836
%%EndComments
%%BeginProlog
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
/cairo_data_source {
CairoDataIndex CairoData length lt
{ CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
{ () } ifelse
} def
/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
/cairo_image { image cairo_flush_ascii85_file } def
/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 7 753 155 836
%%EndPageSetup
q 7 753 148 83 rectclip
1 0 0 -1 0 842 cm q
0 g
0.242796 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 1 0 0 cm
21.984 15.086 m 21.984 88.512 l S Q
21.984 17.516 m 22.953 18.488 l 21.984 15.086 l 21.012 18.488 l h
21.984 17.516 m f*
0.258982 w
q 0 1 -1 0 0 0 cm
17.516 -21.984 m 18.488 -22.953 l 15.086 -21.984 l 18.488 -21.012 l h
17.516 -21.984 m S Q
0.293284 w
q 1 0 0 1 0 0 cm
12.207 63.805 m 150.676 63.805 l S Q
147.746 63.805 m 146.57 64.98 l 150.676 63.805 l 146.57 62.633 l h
147.746 63.805 m f*
0.312836 w
q -1 0 0 -1 0 0 cm
-147.746 -63.805 m -146.57 -64.98 l -150.676 -63.805 l -146.57 -62.633
l h
-147.746 -63.805 m S Q
0.980392 0 0 rg
0.810651 w
q 1 0 0 1 0 0 cm
10.578 25.688 m 52.285 25.688 l 112.02 60.176 l 118.051 88.594 l S Q
0 g
35.332 24.238 m 35.332 13.926 l 36.418 13.926 l 36.418 13.477 l 34.883
13.477 l 34.883 24.684 l 36.418 24.684 l 36.418 24.238 l h
35.332 24.238 m f*
41.824 18.297 m 41.82 18.129 l 41.82 17.961 l 41.816 17.793 l 41.801 17.457
l 41.785 17.289 l 41.746 16.961 l 41.719 16.797 l 41.688 16.633 l 41.652
16.469 l 41.609 16.309 l 41.559 16.145 l 41.508 15.988 l 41.445 15.832
l 41.41 15.75 l 41.375 15.676 l 40.859 14.594 39.938 14.414 39.469 14.414
c 38.797 14.414 37.977 14.707 37.516 15.75 c 37.156 16.527 37.102 17.402
37.102 18.297 c 37.102 19.137 37.148 20.145 37.605 20.996 c 38.09 21.902
38.91 22.129 39.457 22.129 c 39.457 21.883 l 39.023 21.883 38.355 21.602
38.156 20.527 c 38.031 19.855 38.031 18.824 38.031 18.16 c 38.031 17.445
38.031 16.707 38.125 16.102 c 38.336 14.766 39.176 14.664 39.457 14.664
c 39.824 14.664 40.566 14.863 40.781 15.977 c 40.891 16.602 40.891 17.457
40.891 18.16 c 40.891 19.004 40.891 19.762 40.77 20.48 c 40.602 21.547
39.961 21.883 39.457 21.883 c 39.457 22.129 l 40.062 22.129 40.914 21.895
41.406 20.828 c 41.766 20.055 41.824 19.184 41.824 18.297 c h
41.824 18.297 m f*
42.527 13.926 m 43.613 13.926 l 43.613 24.238 l 42.527 24.238 l 42.527
24.684 l 44.066 24.684 l 44.066 13.477 l 42.527 13.477 l h
42.527 13.926 m f*
85.82 41.34 m 84.734 41.34 l 84.734 31.027 l 85.82 31.027 l 85.82 30.578
l 84.281 30.578 l 84.281 41.785 l 85.82 41.785 l h
85.82 41.34 m f*
93.453 36.41 m 93.523 36.41 l 93.559 36.406 l 93.578 36.406 l 93.594 36.402
l 93.625 36.402 l 93.645 36.398 l 93.66 36.398 l 93.676 36.395 l 93.691
36.387 l 93.723 36.379 l 93.734 36.375 l 93.75 36.367 l 93.758 36.359 l
93.793 36.336 l 93.801 36.324 l 93.816 36.309 l 93.816 36.301 l 93.824
36.293 l 93.828 36.285 l 93.828 36.281 l 93.832 36.273 l 93.832 36.266 l
93.84 36.25 l 93.84 36.238 l 93.844 36.23 l 93.844 36.184 l 93.844 35.957
93.641 35.957 93.453 35.957 c 87.387 35.957 l 87.199 35.957 87 35.957 87
36.184 c 87 36.41 87.199 36.41 87.387 36.41 c h
93.453 36.41 m f*
98.082 31.809 m 98.082 31.797 l 98.078 31.785 l 98.078 31.652 l 98.074
31.637 l 98.074 31.621 l 98.07 31.613 l 98.059 31.578 l 98.055 31.57 l 98.027
31.543 l 98.02 31.539 l 98.008 31.535 l 98.004 31.531 l 97.992 31.531 l
97.984 31.527 l 97.973 31.527 l 97.965 31.523 l 97.934 31.523 l 97.926
31.52 l 97.879 31.52 l 97.867 31.516 l 97.824 31.516 l 97.129 32.234 96.141
32.234 95.785 32.234 c 95.785 32.582 l 96.008 32.582 96.672 32.582 97.25
32.289 c 97.25 38.098 l 97.25 38.504 97.219 38.637 96.211 38.637 c 95.852
38.637 l 95.852 38.984 l 96.246 38.949 97.219 38.949 97.664 38.949 c 98.117
38.949 99.09 38.949 99.484 38.984 c 99.484 38.637 l 99.125 38.637 l 98.117
38.637 98.082 38.516 98.082 38.098 c h
98.082 31.809 m f*
100.648 30.578 m 100.648 31.027 l 101.734 31.027 l 101.734 41.34 l 100.648
41.34 l 100.648 41.785 l 102.184 41.785 l 102.184 30.578 l h
100.648 30.578 m f*
126.938 50.949 m 125.324 51.074 l 125.324 51.422 l 126.109 51.422 126.199
51.496 126.199 52.051 c 126.199 57.879 l 126.199 58.379 126.078 58.379
125.324 58.379 c 125.324 58.73 l 125.695 58.719 126.289 58.691 126.57 58.691
c 126.852 58.691 127.398 58.719 127.812 58.73 c 127.812 58.379 l 127.062
58.379 126.938 58.379 126.938 57.879 c h
126.938 50.949 m f*
133.344 56.332 m 133.328 56.066 l 133.312 55.934 l 133.289 55.805 l 133.262
55.68 l 133.23 55.559 l 133.188 55.434 l 133.145 55.316 l 133.094 55.203
l 133.039 55.09 l 132.98 54.98 l 132.914 54.871 l 132.844 54.77 l 132.695
54.574 l 132.609 54.484 l 132.527 54.395 l 132.434 54.312 l 132.34 54.234
l 132.246 54.16 l 132.145 54.094 l 132.039 54.027 l 131.93 53.969 l 131.824
53.918 l 131.711 53.871 l 131.598 53.828 l 131.48 53.793 l 131.359 53.762
l 131.238 53.738 l 131.113 53.723 l 130.988 53.711 l 130.863 53.711 l 130.852
53.953 l 131.344 53.953 131.824 54.203 132.117 54.684 c 132.41 55.164 132.41
55.816 132.41 56.242 c 132.41 56.645 132.41 57.25 132.164 57.742 c 131.918
58.246 131.426 58.57 130.863 58.57 c 130.383 58.57 129.887 58.336 129.586
57.824 c 129.305 57.328 129.305 56.645 129.305 56.242 c 129.305 55.805
129.305 55.199 129.574 54.703 c 129.879 54.191 130.402 53.953 130.852 53.953
c 130.863 53.711 l 129.465 53.711 128.375 54.93 128.375 56.332 c 128.375
57.777 129.539 58.852 130.852 58.852 c 132.207 58.852 133.344 57.754 133.344
56.332 c h
133.344 56.332 m f*
134.863 57.238 m 134.867 57.234 l 134.867 57.156 l 134.871 57.141 l 134.871
57.129 l 134.875 57.113 l 134.875 57.098 l 134.883 57.078 l 134.883 57.059
l 134.887 57.043 l 134.891 57.023 l 134.898 57.004 l 134.902 56.984 l 134.934
56.906 l 134.945 56.883 l 134.957 56.863 l 134.965 56.84 l 134.977 56.82
l 134.992 56.797 l 135.004 56.777 l 135.02 56.754 l 135.035 56.734 l 135.055
56.711 l 135.492 57.023 135.949 57.059 136.164 57.059 c 136.164 56.805
l 135.188 56.805 135.188 55.68 135.188 55.422 c 135.188 55.117 135.199 54.762
135.367 54.484 c 135.461 54.348 135.715 54.035 136.164 54.035 c 137.137
54.035 137.137 55.152 137.137 55.41 c 137.137 55.711 137.129 56.07 136.961
56.352 c 136.871 56.484 136.613 56.805 136.164 56.805 c 136.164 57.059
l 137.207 57.059 137.98 56.285 137.98 55.422 c 137.98 55.004 137.801 54.59
137.523 54.336 c 137.922 53.953 138.328 53.898 138.531 53.898 c 138.555
53.898 138.609 53.898 138.645 53.91 c 138.516 53.953 138.465 54.078 138.465
54.211 c 138.465 54.402 138.609 54.535 138.789 54.535 c 138.898 54.535
139.109 54.457 139.109 54.203 c 139.109 54.012 138.977 53.652 138.543 53.652
c 138.316 53.652 137.824 53.723 137.355 54.176 c 136.883 53.809 136.41
53.777 136.164 53.777 c 135.121 53.777 134.348 54.547 134.348 55.41 c 134.348
55.902 134.594 56.332 134.875 56.566 c 134.73 56.734 134.527 57.105 134.527
57.496 c 134.527 57.844 134.676 58.27 135.023 58.492 c 134.348 58.684 133.988
59.164 133.988 59.617 c 133.988 60.422 135.098 61.039 136.469 61.039 c
136.48 60.785 l 135.348 60.785 134.574 60.211 134.574 59.617 c 134.574 59.098
135 58.684 135.492 58.652 c 136.156 58.652 l 137.117 58.652 138.375 58.652
138.375 59.617 c 138.375 60.223 137.578 60.785 136.48 60.785 c 136.469
61.039 l 137.789 61.039 138.957 60.465 138.957 59.594 c 138.957 59.199 138.797
58.629 138.23 58.316 c 137.637 58.004 136.984 58.004 136.297 58.004 c 136.016
58.004 135.535 58.004 135.461 57.992 c 135.098 57.945 134.863 57.598 134.863
57.238 c h
134.863 57.238 m f*
143.16 61.418 m 143.16 61.391 l 143.156 61.387 l 143.156 61.383 l 143.152
61.379 l 143.148 61.371 l 143.145 61.367 l 143.145 61.363 l 143.141 61.355
l 143.133 61.348 l 143.129 61.34 l 143.121 61.336 l 143.117 61.324 l 143.082
61.289 l 143.078 61.281 l 143.07 61.277 l 143.066 61.27 l 143.047 61.25
l 143.043 61.242 l 143.035 61.234 l 143.027 61.23 l 143.023 61.223 l 143.012
61.215 l 143.008 61.207 l 142.996 61.199 l 142.992 61.191 l 142.98 61.184
l 142.973 61.172 l 141.574 59.762 141.215 57.641 141.215 55.93 c 141.215
53.977 141.641 52.023 143.016 50.629 c 143.16 50.488 143.16 50.469 143.16
50.434 c 143.16 50.355 143.121 50.324 143.055 50.324 c 142.941 50.324 141.934
51.082 141.27 52.504 c 140.699 53.742 140.566 54.984 140.566 55.93 c 140.566
56.805 140.688 58.156 141.305 59.426 c 141.973 60.805 142.941 61.531 143.055
61.531 c 143.121 61.531 143.16 61.5 143.16 61.418 c h
143.16 61.418 m f*
150.582 54.559 m 150.578 54.512 l 150.578 54.469 l 150.574 54.422 l 150.574
54.379 l 150.566 54.34 l 150.562 54.301 l 150.555 54.262 l 150.547 54.227
l 150.535 54.188 l 150.527 54.152 l 150.492 54.059 l 150.477 54.031 l 150.465
54.004 l 150.449 53.977 l 150.434 53.953 l 150.418 53.934 l 150.402 53.91
l 150.383 53.891 l 150.367 53.871 l 150.328 53.84 l 150.309 53.828 l 150.285
53.816 l 150.266 53.805 l 150.246 53.797 l 150.223 53.789 l 150.203 53.785
l 150.18 53.777 l 150.133 53.777 l 149.84 53.777 149.539 54.043 149.539
54.305 c 149.539 54.41 149.594 54.535 149.707 54.637 c 149.898 54.805 150.102
55.109 150.102 55.578 c 150.102 56.027 149.883 56.668 149.539 57.184 c
149.203 57.664 148.789 58.043 148.258 58.043 c 147.621 58.043 147.273 57.641
147.176 57.039 c 147.297 56.746 147.555 56.027 147.555 55.711 c 147.555
55.578 147.496 55.465 147.352 55.465 c 147.262 55.465 147.141 55.492 147.051
55.656 c 146.93 55.879 146.789 56.609 146.789 57.016 c 146.422 57.543 145.977
58.043 145.27 58.043 c 144.527 58.043 144.289 57.383 144.289 56.758 c 144.289
55.355 145.438 54.176 145.438 54.035 c 145.438 53.91 145.348 53.816 145.223
53.816 c 145.074 53.816 144.996 53.965 144.934 54.066 c 144.359 54.898
143.934 56.23 143.934 57.25 c 143.934 58.023 144.195 58.852 145.109 58.852
c 145.902 58.852 146.434 58.293 146.836 57.676 c 146.938 58.324 147.375
58.852 148.07 58.852 c 148.945 58.852 149.484 58.172 149.883 57.328 c 150.156
56.777 150.582 55.254 150.582 54.559 c h
150.582 54.559 m f*
154.406 55.93 m 154.406 55.668 l 154.402 55.578 l 154.395 55.387 l 154.379
55.191 l 154.359 54.984 l 154.336 54.77 l 154.305 54.551 l 154.27 54.324
l 154.223 54.094 l 154.172 53.863 l 154.113 53.625 l 154.043 53.387 l 153.965
53.148 l 153.879 52.906 l 153.832 52.785 l 153.777 52.668 l 153.727 52.547
l 153.668 52.43 l 153 51.051 152.035 50.324 151.922 50.324 c 151.855 50.324
151.809 50.367 151.809 50.434 c 151.809 50.469 151.809 50.488 152.02 50.691
c 153.121 51.801 153.762 53.582 153.762 55.93 c 153.762 57.844 153.348
59.816 151.953 61.23 c 151.809 61.363 151.809 61.387 151.809 61.418 c 151.809
61.484 151.855 61.531 151.922 61.531 c 152.035 61.531 153.039 60.77 153.703
59.348 c 154.273 58.113 154.406 56.871 154.406 55.93 c h
154.406 55.93 m f*
15.551 6.363 m 15.551 6.352 l 15.547 6.348 l 15.547 6.328 l 15.543 6.324
l 15.543 6.32 l 15.539 6.312 l 15.539 6.309 l 15.531 6.301 l 15.531 6.297
l 15.523 6.289 l 15.52 6.281 l 15.512 6.273 l 15.504 6.273 l 15.5 6.266
l 15.492 6.266 l 15.484 6.258 l 15.477 6.258 l 15.473 6.254 l 15.469 6.254
l 15.465 6.25 l 15.426 6.25 l 15.395 6.25 15.383 6.258 15.258 6.383 c 14.477
7.246 l 14.375 7.09 13.859 6.25 12.613 6.25 c 10.113 6.25 7.59 8.727 7.59
11.324 c 7.59 13.105 8.836 14.395 10.652 14.395 c 11.145 14.395 11.652
14.297 12.051 14.133 c 12.613 13.906 12.824 13.668 13.031 13.445 c 13.133
13.727 13.418 14.141 13.531 14.141 c 13.59 14.141 13.613 14.105 13.613
14.094 c 13.633 14.074 13.746 13.648 13.801 13.414 c 14.012 12.551 l 14.059
12.359 14.113 12.168 14.16 11.977 c 14.285 11.473 14.293 11.449 14.934
11.438 c 14.988 11.438 15.113 11.426 15.113 11.215 c 15.113 11.133 15.059
11.094 14.969 11.094 c 14.707 11.094 14.051 11.125 13.793 11.125 c 13.445
11.125 12.57 11.094 12.219 11.094 c 12.121 11.094 11.988 11.094 11.988
11.312 c 11.988 11.438 12.078 11.438 12.324 11.438 c 12.332 11.438 12.66
11.438 12.918 11.461 c 13.207 11.492 13.266 11.527 13.266 11.676 c 13.266
11.773 13.145 12.281 13.031 12.691 c 12.719 13.926 11.258 14.051 10.863
14.051 c 9.789 14.051 8.613 13.414 8.613 11.695 c 8.613 11.352 8.723 9.5
9.902 8.039 c 10.504 7.277 11.594 6.594 12.703 6.594 c 13.848 6.594 14.508
7.457 14.508 8.758 c 14.508 9.207 14.477 9.219 14.477 9.332 c 14.477 9.445
14.598 9.445 14.645 9.445 c 14.789 9.445 14.789 9.418 14.844 9.219 c h
15.551 6.363 m f*
20.309 10.617 m 20.312 10.617 l 20.312 10.605 l 20.316 10.605 l 20.316
10.594 l 20.32 10.59 l 20.32 10.586 l 20.324 10.582 l 20.324 10.57 l 20.328
10.566 l 20.328 10.551 l 20.332 10.543 l 20.332 10.527 l 20.336 10.523
l 20.336 10.52 l 20.34 10.516 l 20.34 10.496 l 20.34 10.453 20.309 10.383
20.219 10.383 c 20.059 10.383 19.41 10.445 19.215 10.465 c 19.148 10.469
19.039 10.477 19.039 10.645 c 19.039 10.75 19.148 10.75 19.246 10.75 c
19.621 10.75 19.621 10.809 19.621 10.871 c 19.621 10.926 19.605 10.973 19.59
11.043 c 19.141 12.832 l 18.977 12.574 18.711 12.367 18.332 12.367 c 18.332
12.586 l 18.883 12.586 19.035 13.18 19.035 13.27 c 19.035 13.301 19.016
13.355 19.008 13.379 c 18.641 14.844 l 18.586 15.066 18.414 15.219 18.242
15.371 c 18.172 15.43 17.855 15.684 17.516 15.684 c 17.23 15.684 16.949
15.48 16.949 14.926 c 16.949 14.508 17.172 13.645 17.355 13.332 c 17.715
12.703 18.117 12.586 18.332 12.586 c 18.332 12.367 l 17.332 12.367 16.312
13.473 16.312 14.602 c 16.312 15.363 16.82 15.902 17.496 15.902 c 17.918
15.902 18.297 15.66 18.609 15.352 c 18.758 15.824 19.215 15.902 19.414
15.902 c 19.695 15.902 19.895 15.73 20.035 15.488 c 20.207 15.18 20.309
14.734 20.309 14.703 c 20.309 14.602 20.207 14.602 20.184 14.602 c 20.074
14.602 20.066 14.633 20.016 14.844 c 19.918 15.219 19.766 15.684 19.441
15.684 c 19.238 15.684 19.184 15.512 19.184 15.301 c 19.184 15.148 19.199
15.082 19.219 14.977 c h
20.309 10.617 m f*
21.996 15.215 m 21.988 15.238 l 21.984 15.262 l 21.977 15.281 l 21.969
15.305 l 21.961 15.324 l 21.957 15.344 l 21.949 15.363 l 21.926 15.41 l
21.914 15.422 l 21.906 15.438 l 21.895 15.445 l 21.879 15.457 l 21.867 15.469
l 21.852 15.48 l 21.793 15.504 l 21.77 15.512 l 21.746 15.516 l 21.73 15.52
l 21.719 15.52 l 21.688 15.527 l 21.672 15.527 l 21.656 15.531 l 21.621
15.531 l 21.602 15.535 l 21.586 15.535 l 21.566 15.539 l 21.504 15.539
l 21.48 15.543 l 21.305 15.543 l 21.172 15.543 21.07 15.543 21.07 15.707
c 21.07 15.824 21.16 15.824 21.305 15.824 c 24.336 15.824 l 25.656 15.824
26.668 14.926 26.668 14.148 c 26.668 13.59 26.156 13.113 25.324 13.027
c 26.273 12.855 27.066 12.258 27.066 11.582 c 27.066 10.988 26.461 10.469
25.445 10.469 c 25.316 10.75 l 26.117 10.75 26.297 11.281 26.297 11.574
c 26.297 12.211 25.586 12.93 24.531 12.93 c 23.25 12.93 l 23.195 13.152
l 24.855 13.152 l 25.594 13.152 25.875 13.637 25.875 14.094 c 25.875 14.867
25.082 15.543 24.137 15.543 c 22.871 15.543 l 22.629 15.543 22.621 15.531
22.621 15.461 c 22.621 15.457 22.621 15.418 22.652 15.301 c 23.195 13.152
l 23.25 12.93 l 23.73 11.02 l 23.789 10.777 23.801 10.75 24.125 10.75 c
25.316 10.75 l 25.445 10.469 l 22.59 10.469 l 22.441 10.469 22.34 10.469
22.34 10.645 c 22.34 10.75 22.434 10.75 22.59 10.75 c 22.598 10.75 22.75
10.75 22.887 10.77 c 23.055 10.781 23.066 10.801 23.066 10.879 c 23.066
10.895 23.066 10.93 23.035 11.051 c h
21.996 15.215 m f*
Q Q
showpage
%%Trailer
end
%%EOF

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View file

@ -0,0 +1,401 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.15.10 (http://cairographics.org)
%%CreationDate: Sat May 25 17:38:49 2019
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 2 692 156 770
%%EndComments
%%BeginProlog
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
/cairo_data_source {
CairoDataIndex CairoData length lt
{ CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
{ () } ifelse
} def
/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
/cairo_image { image cairo_flush_ascii85_file } def
/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 2 692 156 770
%%EndPageSetup
q 2 692 154 78 rectclip
1 0 0 -1 0 842 cm q
0 g
34.609 137.27 m 34.902 138.371 27.953 141.191 19.086 143.57 c 10.219 145.945
2.789 146.977 2.496 145.875 c 2.199 144.773 9.148 141.953 18.016 139.578
c 26.883 137.199 34.312 136.168 34.609 137.27 c h
34.609 137.27 m f
66.105 128.832 m 66.398 129.934 59.449 132.754 50.582 135.129 c 41.715
137.504 34.285 138.539 33.992 137.438 c 33.695 136.332 40.645 133.512 49.512
131.137 c 58.379 128.762 65.809 127.73 66.105 128.832 c h
66.105 128.832 m f
33.289 137.574 m 35.285 137.039 l 36.707 142.348 l 34.711 142.883 l h
33.289 137.574 m f
0 0 1 rg
31.105 141.941 m 39.359 139.73 l 39.988 139.562 40.629 139.934 40.797 140.562
c 42.281 146.094 l 42.449 146.723 42.078 147.363 41.449 147.531 c 33.195
149.742 l 32.566 149.914 31.926 149.543 31.758 148.914 c 30.273 143.379
l 30.105 142.754 30.477 142.109 31.105 141.941 c h
31.105 141.941 m f
0 g
123.508 113.449 m 123.805 114.551 116.855 117.371 107.988 119.746 c 99.121
122.125 91.691 123.156 91.395 122.055 c 91.102 120.953 98.051 118.133 106.918
115.758 c 115.785 113.379 123.215 112.348 123.508 113.449 c h
123.508 113.449 m f
155.004 105.012 m 155.301 106.113 148.352 108.934 139.484 111.309 c 130.617
113.684 123.188 114.719 122.891 113.613 c 122.598 112.512 129.547 109.691
138.414 107.316 c 147.281 104.941 154.711 103.906 155.004 105.012 c h
155.004 105.012 m f
122.191 113.754 m 124.188 113.219 l 125.609 118.527 l 123.613 119.062 l
h
122.191 113.754 m f
0 0 1 rg
120.008 118.121 m 128.262 115.91 l 128.891 115.742 129.531 116.113 129.699
116.738 c 131.184 122.273 l 131.352 122.902 130.98 123.543 130.352 123.711
c 122.098 125.922 l 121.469 126.09 120.828 125.723 120.66 125.094 c 119.176
119.559 l 119.008 118.93 119.379 118.289 120.008 118.121 c h
120.008 118.121 m f
0 0 0.2 rg
40.961 143.348 m 120.43 122.055 l 120.98 121.906 121.547 122.23 121.691
122.785 c 121.84 123.336 121.516 123.902 120.961 124.051 c 41.496 145.344
l 40.941 145.488 40.379 145.164 40.23 144.613 c 40.082 144.059 40.41 143.496
40.961 143.348 c h
40.961 143.348 m f
0 0 0.996078 rg
61.988 135.281 m 98.184 125.582 l 98.738 125.434 99.301 125.762 99.449
126.312 c 100.812 131.395 l 100.961 131.945 100.633 132.512 100.082 132.66
c 63.887 142.355 l 63.332 142.504 62.77 142.18 62.621 141.625 c 61.258
136.547 l 61.109 135.992 61.438 135.43 61.988 135.281 c h
61.988 135.281 m f
0 g
0.745406 w
0 J
0 j
[] 0.0 d
4 M q 1 0 0 1 0 0 cm
67.793 80.699 m 72.121 79.625 76.559 79.078 81.016 79.078 c S Q
69.406 81.227 m 66.816 80.945 l 68.973 79.484 l 68.719 80.094 68.898 80.797
69.406 81.227 c h
69.406 81.227 m f*
0.135636 w
1 j
q 1 -0.248565 0.248565 1 0 0 cm
46.352 92.748 m 43.979 91.877 l 46.352 91.006 l 45.97 91.52 45.975 92.225
46.352 92.748 c h
46.352 92.748 m S Q
0.248469 w
0 j
[ 0.496937 0.248469 0.124234 0.248469] 0 d
q 1 0 0 1 0 0 cm
64.707 73.031 m 81.043 133.992 l 81.043 73.043 l S Q
0 0.713726 0 rg
0.745406 w
[] 0.0 d
q 1 0 0 1 0 0 cm
68.688 87.883 m 81.043 133.992 l 128.711 133.992 l S Q
67.953 92.117 m 68.422 86.934 l 71.426 91.188 l 70.199 90.707 68.797 91.086
67.953 92.117 c h
67.953 92.117 m f*
0.270003 w
1 j
q 0.267949 1 -1 0.267949 0 0 cm
102.935 -40.372 m 98.216 -42.105 l 102.936 -43.844 l 102.181 -42.82 102.184
-41.417 102.935 -40.372 c h
102.935 -40.372 m S Q
124.812 132.191 m 129.699 133.988 l 124.812 135.785 l 125.594 134.723 125.59
133.27 124.812 132.191 c h
124.812 132.191 m f*
0.279527 w
q -1 0 0 -1 0 0 cm
-124.812 -132.191 m -129.699 -133.988 l -124.812 -135.785 l -125.594 -134.723
-125.59 -133.27 -124.812 -132.191 c h
-124.812 -132.191 m S Q
1 0 0 rg
0.745406 w
q 1 0 0 1 0 0 cm
81.043 112.613 m 81.043 133.992 l 59.645 133.992 l S Q
79.238 116.516 m 81.035 111.629 l 82.832 116.516 l 81.77 115.734 80.32
115.738 79.238 116.516 c h
79.238 116.516 m f*
0.279527 w
q 0 1 -1 0 0 0 cm
116.516 -79.238 m 111.629 -81.035 l 116.516 -82.832 l 115.734 -81.77 115.738
-80.32 116.516 -79.238 c h
116.516 -79.238 m S Q
63.547 135.797 m 58.66 134 l 63.547 132.203 l 62.766 133.266 62.77 134.715
63.547 135.797 c h
63.547 135.797 m f*
q 1 0 0 1 0 0 cm
63.547 135.797 m 58.66 134 l 63.547 132.203 l 62.766 133.266 62.77 134.715
63.547 135.797 c h
63.547 135.797 m S Q
0 g
71.539 126.785 m 71.527 126.793 l 71.52 126.805 l 71.508 126.816 l 71.496
126.824 l 71.457 126.863 l 71.426 126.887 l 71.414 126.902 l 71.324 126.992
l 71.312 127.008 l 71.285 127.035 l 71.238 127.098 l 71.223 127.129 l 71.215
127.141 l 71.199 127.172 l 71.195 127.184 l 71.191 127.199 l 71.191 127.223
l 71.191 127.297 71.266 127.375 71.34 127.375 c 71.406 127.375 71.445 127.32
71.48 127.273 c 71.57 127.164 71.742 126.957 72.066 126.793 c 72.117 126.762
72.195 126.727 72.195 126.637 c 72.195 126.562 72.145 126.523 72.09 126.488
c 71.926 126.375 71.844 126.242 71.785 126.066 c 71.77 126 71.742 125.898
71.637 125.898 c 71.531 125.898 71.488 126 71.488 126.059 c 71.488 126.094
71.547 126.332 71.664 126.488 c 69.164 126.488 l 69.039 126.488 68.902
126.488 68.902 126.637 c 68.902 126.785 69.039 126.785 69.164 126.785 c
h
71.539 126.785 m f*
70.238 130.789 m 70.246 130.816 l 70.258 130.844 l 70.266 130.871 l 70.277
130.898 l 70.289 130.922 l 70.305 130.945 l 70.316 130.969 l 70.332 130.996
l 70.348 131.016 l 70.363 131.039 l 70.383 131.059 l 70.398 131.078 l 70.438
131.117 l 70.461 131.133 l 70.48 131.152 l 70.504 131.168 l 70.523 131.184
l 70.551 131.195 l 70.574 131.211 l 70.598 131.223 l 70.621 131.23 l 70.648
131.242 l 70.676 131.25 l 70.699 131.258 l 70.727 131.266 l 70.758 131.273
l 70.84 131.285 l 70.902 131.285 l 71.16 131.285 71.332 131.117 71.449
130.879 c 71.578 130.609 71.672 130.156 71.672 130.145 c 71.672 130.07 71.605
130.07 71.582 130.07 c 71.508 130.07 71.5 130.098 71.48 130.203 c 71.375
130.617 71.234 131.121 70.922 131.121 c 70.766 131.121 70.695 131.027 70.695
130.781 c 70.695 130.617 70.781 130.27 70.84 130.012 c 71.051 129.207 l
71.07 129.094 71.145 128.812 71.176 128.699 c 71.211 128.531 71.285 128.25
71.285 128.203 c 71.285 128.07 71.184 128.004 71.07 128.004 c 71.035 128.004
70.84 128.012 70.781 128.262 c 70.641 128.805 70.312 130.105 70.227 130.5
c 70.215 130.527 69.922 131.121 69.379 131.121 c 68.992 131.121 68.918
130.789 68.918 130.512 c 68.918 130.098 69.125 129.512 69.32 129 c 69.41
128.773 69.445 128.672 69.445 128.531 c 69.445 128.199 69.207 127.922 68.836
127.922 c 68.129 127.922 67.855 129 67.855 129.066 c 67.855 129.141 67.93
129.141 67.945 129.141 c 68.02 129.141 68.027 129.125 68.062 129.004 c
68.246 128.359 68.531 128.086 68.812 128.086 c 68.879 128.086 69 128.094
69 128.332 c 69 128.508 68.918 128.723 68.871 128.836 c 68.598 129.57 68.441
130.031 68.441 130.395 c 68.441 131.102 68.953 131.285 69.355 131.285 c
69.844 131.285 70.113 130.953 70.238 130.789 c h
70.238 130.789 m f*
87.094 111.102 m 87.082 111.109 l 87.074 111.121 l 87.059 111.133 l 87.047
111.141 l 87.035 111.152 l 87.023 111.168 l 87.008 111.18 l 86.996 111.191
l 86.98 111.203 l 86.938 111.246 l 86.91 111.277 l 86.879 111.309 l 86.867
111.324 l 86.852 111.336 l 86.793 111.414 l 86.785 111.43 l 86.777 111.441
l 86.766 111.457 l 86.762 111.473 l 86.754 111.488 l 86.75 111.5 l 86.746
111.516 l 86.746 111.539 l 86.746 111.613 86.82 111.688 86.895 111.688
c 86.961 111.688 86.996 111.637 87.035 111.59 c 87.121 111.48 87.293 111.273
87.621 111.109 c 87.672 111.078 87.746 111.039 87.746 110.953 c 87.746
110.879 87.695 110.84 87.645 110.805 c 87.48 110.691 87.398 110.559 87.336
110.383 c 87.324 110.316 87.293 110.215 87.191 110.215 c 87.086 110.215
87.043 110.316 87.043 110.371 c 87.043 110.41 87.102 110.648 87.219 110.805
c 84.715 110.805 l 84.59 110.805 84.457 110.805 84.457 110.953 c 84.457
111.102 84.59 111.102 84.715 111.102 c h
87.094 111.102 m f*
84.219 114.902 m 84.289 114.824 l 84.328 114.789 l 84.359 114.754 l 84.426
114.688 l 84.457 114.652 l 84.656 114.453 l 84.711 114.406 l 84.812 114.312
l 84.906 114.227 l 85.004 114.145 l 85.051 114.102 l 85.102 114.059 l 85.102
114.051 85.562 113.656 85.828 113.391 c 86.535 112.695 86.699 112.34 86.699
112.312 c 86.699 112.238 86.633 112.238 86.617 112.238 c 86.566 112.238
86.543 112.254 86.504 112.32 c 86.285 112.676 86.129 112.797 85.949 112.797
c 85.77 112.797 85.68 112.684 85.566 112.559 c 85.43 112.387 85.301 112.238
85.059 112.238 c 84.5 112.238 84.16 112.93 84.16 113.086 c 84.16 113.121
84.18 113.164 84.246 113.164 c 84.316 113.164 84.328 113.129 84.344 113.086
c 84.484 112.742 84.918 112.734 84.977 112.734 c 85.133 112.734 85.273
112.789 85.441 112.848 c 85.742 112.957 85.824 112.957 86.016 112.957 c
85.75 113.277 85.125 113.812 84.984 113.93 c 84.316 114.555 l 83.809 115.051
83.551 115.477 83.551 115.527 c 83.551 115.602 83.625 115.602 83.637 115.602
c 83.699 115.602 83.711 115.586 83.758 115.508 c 83.93 115.246 84.148 115.047
84.387 115.047 c 84.559 115.047 84.637 115.113 84.816 115.328 c 84.945
115.484 85.078 115.602 85.293 115.602 c 86.031 115.602 86.461 114.66 86.461
114.461 c 86.461 114.422 86.43 114.383 86.371 114.383 c 86.305 114.383
86.293 114.43 86.266 114.48 c 86.098 114.965 85.621 115.102 85.375 115.102
c 85.227 115.102 85.094 115.059 84.938 115.008 c 84.684 114.914 84.574
114.883 84.418 114.883 c 84.402 114.883 84.285 114.883 84.219 114.902 c
h
84.219 114.902 m f*
74.309 74.617 m 74.309 74.57 l 74.305 74.52 l 74.305 74.465 l 74.301 74.41
l 74.297 74.352 l 74.289 74.293 l 74.285 74.234 l 74.273 74.172 l 74.266
74.109 l 74.254 74.047 l 74.238 73.984 l 74.227 73.918 l 74.188 73.793
l 74.168 73.734 l 74.145 73.672 l 74.121 73.613 l 74.094 73.555 l 74.031
73.445 l 73.996 73.395 l 73.957 73.348 l 73.918 73.305 l 73.875 73.262
l 73.828 73.227 l 73.805 73.207 l 73.777 73.191 l 73.754 73.18 l 73.727
73.164 l 73.672 73.141 l 73.641 73.129 l 73.613 73.121 l 73.551 73.105 l
73.516 73.102 l 73.484 73.098 l 73.449 73.094 l 73.414 73.094 l 73.41 73.258
l 73.773 73.258 73.816 73.734 73.816 74.156 c 73.816 74.52 73.758 74.898
73.578 75.637 c 72.027 75.637 l 72.152 75.156 72.301 74.566 72.598 74.035
c 72.801 73.676 73.074 73.258 73.41 73.258 c 73.414 73.094 l 72.383 73.094
71.238 75.188 71.238 76.887 c 71.238 77.586 71.453 78.414 72.133 78.414
c 72.133 78.25 l 71.883 78.25 71.727 78.031 71.727 77.344 c 71.727 77.031
71.773 76.598 71.965 75.875 c 73.512 75.875 l 73.434 76.215 73.277 76.844
72.992 77.379 c 72.734 77.887 72.449 78.25 72.133 78.25 c 72.133 78.414
l 73.176 78.414 74.309 76.281 74.309 74.617 c h
74.309 74.617 m f*
64.941 93.07 m 64.91 93.102 l 64.898 93.109 l 64.887 93.121 l 64.871 93.133
l 64.859 93.148 l 64.844 93.16 l 64.715 93.289 l 64.703 93.305 l 64.688
93.32 l 64.652 93.367 l 64.645 93.383 l 64.633 93.398 l 64.625 93.41 l
64.609 93.441 l 64.605 93.453 l 64.602 93.469 l 64.598 93.48 l 64.594 93.496
l 64.594 93.508 l 64.594 93.582 64.668 93.656 64.742 93.656 c 64.809 93.656
64.848 93.605 64.883 93.559 c 64.973 93.445 65.141 93.238 65.473 93.078
c 65.523 93.047 65.598 93.008 65.598 92.922 c 65.598 92.848 65.547 92.809
65.492 92.773 c 65.328 92.66 65.25 92.527 65.188 92.352 c 65.172 92.281
65.141 92.184 65.043 92.184 c 64.934 92.184 64.891 92.281 64.891 92.34
c 64.891 92.379 64.949 92.617 65.066 92.773 c 62.566 92.773 l 62.441 92.773
62.305 92.773 62.305 92.922 c 62.305 93.07 62.441 93.07 62.566 93.07 c
h
64.941 93.07 m f*
62.094 96.953 m 62.816 96.953 l 63.375 96.953 63.434 97.074 63.434 97.289
c 63.434 97.34 63.434 97.43 63.383 97.652 c 63.367 97.688 63.359 97.719
63.359 97.734 c 63.359 97.793 63.402 97.824 63.449 97.824 c 63.523 97.824
63.523 97.801 63.559 97.668 c 63.969 96.055 l 63.988 95.973 63.988 95.957
63.988 95.938 c 63.988 95.922 63.977 95.855 63.902 95.855 c 63.824 95.855
63.82 95.891 63.789 96.012 c 63.633 96.59 63.465 96.723 62.832 96.723 c
62.156 96.723 l 62.633 94.836 l 62.695 94.574 62.707 94.547 63.031 94.547
c 64.012 94.547 l 64.926 94.547 65.098 94.793 65.098 95.363 c 65.098 95.535
65.098 95.562 65.074 95.766 c 65.059 95.863 65.059 95.875 65.059 95.898
c 65.059 95.938 65.082 95.988 65.148 95.988 c 65.23 95.988 65.238 95.941
65.254 95.801 c 65.402 94.52 l 65.426 94.316 65.387 94.316 65.199 94.316
c 61.562 94.316 l 61.414 94.316 61.34 94.316 61.34 94.469 c 61.34 94.547
61.406 94.547 61.547 94.547 c 61.82 94.547 62.027 94.547 62.027 94.68 c
62.027 94.711 62.027 94.727 61.992 94.859 c 61.012 98.789 l 60.938 99.078
60.922 99.137 60.336 99.137 c 60.211 99.137 60.129 99.137 60.129 99.281
c 60.129 99.367 60.215 99.367 60.238 99.367 c 60.453 99.367 61.004 99.344
61.219 99.344 c 61.465 99.344 62.082 99.367 62.328 99.367 c 62.395 99.367
62.484 99.367 62.484 99.227 c 62.484 99.168 62.438 99.152 62.438 99.145
c 62.414 99.137 62.402 99.137 62.23 99.137 c 62.066 99.137 62.027 99.137
61.844 99.121 c 61.629 99.098 61.605 99.07 61.605 98.973 c 61.605 98.961
61.605 98.914 61.633 98.805 c h
62.094 96.953 m f*
66.875 100.055 m 66.875 100.066 l 66.871 100.074 l 66.867 100.086 l 66.867
100.098 l 66.859 100.121 l 66.855 100.141 l 66.848 100.168 l 66.844 100.191
l 66.836 100.215 l 66.836 100.227 l 66.824 100.262 l 66.824 100.27 l 66.816
100.293 l 66.816 100.301 l 66.812 100.309 l 66.812 100.324 l 66.809 100.332
l 66.809 100.34 l 66.805 100.344 l 66.805 100.363 l 66.805 100.477 66.898
100.527 66.98 100.527 c 67.074 100.527 67.156 100.461 67.184 100.414 c
67.211 100.367 67.25 100.199 67.277 100.094 c 67.301 99.992 67.359 99.754
67.391 99.625 c 67.422 99.508 67.453 99.395 67.48 99.277 c 67.535 99.051
67.535 99.043 67.641 98.883 c 67.805 98.625 68.066 98.332 68.469 98.332
c 68.762 98.332 68.777 98.57 68.777 98.695 c 68.777 99.008 68.555 99.582
68.469 99.801 c 68.414 99.945 68.391 99.992 68.391 100.082 c 68.391 100.355
68.621 100.527 68.887 100.527 c 69.406 100.527 69.633 99.812 69.633 99.734
c 69.633 99.664 69.566 99.664 69.551 99.664 c 69.48 99.664 69.473 99.695
69.453 99.754 c 69.336 100.168 69.109 100.383 68.902 100.383 c 68.793 100.383
68.773 100.312 68.773 100.199 c 68.773 100.082 68.797 100.016 68.891 99.781
c 68.953 99.621 69.168 99.07 69.168 98.777 c 69.168 98.695 69.168 98.477
68.977 98.328 c 68.887 98.258 68.734 98.188 68.492 98.188 c 68.027 98.188
67.738 98.492 67.574 98.711 c 67.531 98.27 67.16 98.188 66.898 98.188 c
66.465 98.188 66.176 98.449 66.02 98.656 c 65.98 98.301 65.676 98.188 65.465
98.188 c 65.238 98.188 65.121 98.348 65.055 98.465 c 64.938 98.656 64.867
98.957 64.867 98.98 c 64.867 99.047 64.938 99.047 64.953 99.047 c 65.027
99.047 65.031 99.031 65.07 98.891 c 65.145 98.586 65.246 98.332 65.449
98.332 c 65.582 98.332 65.621 98.445 65.621 98.586 c 65.621 98.684 65.57
98.875 65.535 99.016 c 65.5 99.156 65.449 99.371 65.422 99.484 c 65.254
100.148 l 65.234 100.215 65.203 100.344 65.203 100.363 c 65.203 100.477
65.297 100.527 65.383 100.527 c 65.477 100.527 65.555 100.461 65.582 100.414
c 65.609 100.367 65.652 100.199 65.676 100.094 c 65.703 99.992 65.758 99.754
65.789 99.625 c 65.82 99.508 65.855 99.395 65.879 99.277 c 65.934 99.062
65.949 99.023 66.098 98.809 c 66.242 98.602 66.488 98.332 66.875 98.332
c 67.176 98.332 67.184 98.598 67.184 98.695 c 67.184 98.824 67.168 98.891
67.094 99.184 c h
66.875 100.055 m f*
126.176 138.809 m 126.164 138.816 l 126.156 138.828 l 126.145 138.836 l
126.129 138.848 l 126.094 138.883 l 126.078 138.895 l 126.062 138.91 l
126.047 138.922 l 126.02 138.953 l 125.961 139.012 l 125.949 139.027 l 125.934
139.043 l 125.922 139.059 l 125.91 139.07 l 125.898 139.09 l 125.887 139.102
l 125.875 139.117 l 125.859 139.148 l 125.848 139.164 l 125.844 139.18
l 125.836 139.191 l 125.832 139.203 l 125.828 139.219 l 125.828 139.246
l 125.828 139.32 125.902 139.395 125.977 139.395 c 126.043 139.395 126.078
139.34 126.117 139.297 c 126.207 139.184 126.375 138.977 126.703 138.812
c 126.754 138.781 126.828 138.746 126.828 138.656 c 126.828 138.582 126.777
138.547 126.727 138.508 c 126.562 138.398 126.48 138.266 126.418 138.086
c 126.406 138.02 126.375 137.922 126.273 137.922 c 126.168 137.922 126.125
138.02 126.125 138.078 c 126.125 138.113 126.184 138.352 126.301 138.508
c 123.801 138.508 l 123.672 138.508 123.539 138.508 123.539 138.656 c 123.539
138.809 123.672 138.809 123.801 138.809 c h
126.176 138.809 m f*
123.328 142.691 m 124.047 142.691 l 124.605 142.691 124.664 142.809 124.664
143.023 c 124.664 143.078 124.664 143.164 124.613 143.387 c 124.598 143.426
124.59 143.457 124.59 143.473 c 124.59 143.531 124.637 143.559 124.68 143.559
c 124.754 143.559 124.754 143.539 124.793 143.402 c 125.203 141.793 l 125.223
141.711 125.223 141.695 125.223 141.672 c 125.223 141.66 125.207 141.59
125.133 141.59 c 125.059 141.59 125.055 141.629 125.023 141.75 c 124.867
142.324 124.695 142.461 124.062 142.461 c 123.391 142.461 l 123.863 140.574
l 123.93 140.312 123.938 140.285 124.266 140.285 c 125.246 140.285 l 126.16
140.285 126.328 140.527 126.328 141.102 c 126.328 141.273 126.328 141.301
126.309 141.504 c 126.293 141.598 126.293 141.613 126.293 141.637 c 126.293
141.672 126.312 141.723 126.383 141.723 c 126.465 141.723 126.469 141.68
126.484 141.539 c 126.633 140.254 l 126.656 140.055 126.621 140.055 126.434
140.055 c 122.797 140.055 l 122.648 140.055 122.57 140.055 122.57 140.203
c 122.57 140.285 122.641 140.285 122.781 140.285 c 123.055 140.285 123.262
140.285 123.262 140.418 c 123.262 140.449 123.262 140.461 123.223 140.598
c 122.246 144.523 l 122.172 144.816 122.156 144.871 121.566 144.871 c 121.441
144.871 121.359 144.871 121.359 145.016 c 121.359 145.105 121.449 145.105
121.473 145.105 c 121.688 145.105 122.238 145.082 122.453 145.082 c 122.699
145.082 123.316 145.105 123.559 145.105 c 123.625 145.105 123.715 145.105
123.715 144.961 c 123.715 144.902 123.672 144.891 123.672 144.879 c 123.648
144.871 123.633 144.871 123.465 144.871 c 123.297 144.871 123.262 144.871
123.078 144.859 c 122.859 144.836 122.84 144.805 122.84 144.711 c 122.84
144.695 122.84 144.648 122.867 144.539 c h
123.328 142.691 m f*
127.969 144.16 m 128.477 144.16 l 128.582 144.16 128.648 144.16 128.648
144.047 c 128.648 143.973 128.582 143.973 128.488 143.973 c 128.004 143.973
l 128.125 143.316 128.164 143.074 128.207 142.926 c 128.234 142.809 128.348
142.699 128.473 142.699 c 128.477 142.699 128.617 142.699 128.719 142.762
c 128.504 142.832 128.488 143.02 128.488 143.051 c 128.488 143.164 128.578
143.242 128.695 143.242 c 128.836 143.242 128.992 143.121 128.992 142.926
c 128.992 142.688 128.738 142.555 128.473 142.555 c 128.246 142.555 127.992
142.688 127.848 142.945 c 127.746 143.137 127.703 143.371 127.594 143.973
c 127.184 143.973 l 127.082 143.973 127.012 143.973 127.012 144.09 c 127.012
144.16 127.082 144.16 127.172 144.16 c 127.559 144.16 l 127.555 144.191
127.227 146.062 127.102 146.617 c 127.074 146.73 126.988 147.125 126.738
147.125 c 126.734 147.125 126.609 147.125 126.508 147.066 c 126.723 146.996
126.738 146.809 126.738 146.781 c 126.738 146.664 126.648 146.586 126.531
146.586 c 126.391 146.586 126.234 146.707 126.234 146.906 c 126.234 147.137
126.48 147.273 126.738 147.273 c 127.07 147.273 127.301 146.93 127.363
146.816 c 127.547 146.465 127.668 145.828 127.68 145.766 c h
127.969 144.16 m f*
Q Q
showpage
%%Trailer
end
%%EOF

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 KiB

107
doc/compte_rendu/main.tex Normal file
View file

@ -0,0 +1,107 @@
\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}
\tableofcontents
%\listoffigures
\input{chap_introduction.tex}
\input{chap_modelisation.tex}
\input{chap_realisation.tex}
\input{chap_utilisation.tex}
\input{chap_conclusion.tex}
\appendix
\input{chap_probleme.tex}
\input{chap_installation.tex}
\input{chap_export.tex}
\input{chap_testfilter.tex}
\input{chap_generation.tex}
\input{chap_configuration.tex}
\bibliographystyle{plain}
\bibliography{biblio}
\end{document}

BIN
doc/compte_rendu/noeuds.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View file

@ -0,0 +1,360 @@
\documentclass[aspectratio=169]{beamer} \usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{minted}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{appendixnumberbeamer}
\definecolor{boxcolor}{HTML}{23373B}
\usetikzlibrary{shapes,arrows}
\tikzstyle{block} = [draw, fill=boxcolor!30, rectangle, minimum height=3em, minimum width=6em]
\tikzstyle{sum} = [draw, fill=boxcolor!30, circle, node distance=1cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]
\usepackage{amsmath,amsmath,amsfonts,amssymb}
\usetheme{metropolis}
\setbeamertemplate{footline}[frame number]
\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}
\title{\includegraphics[width=8cm]{LogoCS.png}\\Asservissement rigide de drones}
\author{Hugo \bsc{Levy--Falk} et Joanne \bsc{Steiner}}\institute{CentraleSupélec}
\date{Soutenance de projet}
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\section{Introduction}
\begin{frame}{Objectifs du projet}
Asservissement plus "rigide" d'un drone
\begin{itemize}
\item<2-> Stabilité
\item<3-> Rapidité
\end{itemize}
\end{frame}
\begin{frame}{Livrables}
\begin{itemize}
\item Une bibliothèque d'automatique;
\item Un exemple d'asservissement en simple boucle.
\end{itemize}
\end{frame}
\section{Utilisation de la bibliothèque}
\begin{frame}{Pourquoi ?}
\begin{itemize}
\item Faire de l'automatique avec ROS;
\item Utilisable dans des cas plus généraux que l'asservissement d'un drone.
\end{itemize}
\end{frame}
\begin{frame}{Fonctionnement}
\begin{itemize}
\item Script Python permettant de créer des n\oe uds;
\item Fichiers de configuration pour gérer les paramètres dynamiquement;
\item Fichiers launch pour relier les n\oe uds entre eux.
\end{itemize}
\begin{center}
\includegraphics[width=0.3\linewidth]{images/presentation/brique.jpg}
\end{center}
\end{frame}
\begin{frame}{Différents n\oe uds}
\begin{itemize}
\item On a les n\oe uds suivants :
\begin{itemize}
\item \mintinline{python}|ProportionalNode|;
\item \mintinline{python}|SaturateNode|;
\item \mintinline{python}|DerivativeNode|;
\item \mintinline{python}|DifferenciateNode|;
\item \mintinline{python}|SumNode|;
\item \mintinline{python}|InputNode|;
\item \mintinline{python}|RateNode|.
\end{itemize}
\item Calcul de la vitesse du n\oe ud \mintinline{python}|DerivativeNode| grâce à un filtre de \bsc{Savitzky-Golay}.
\end{itemize}
\end{frame}
\begin{frame}{Performances de \bsc{Savitzky-Golay}}
\begin{figure}
\centering
\includegraphics[height=0.7\textheight]{images/realisation/mesure_vitesse_big_quadra.eps}
\caption{Filtre de \bsc{Savitsky-Golay}}
\end{figure}
\end{frame}
\begin{frame}[fragile]{Utilisation du script}
\begin{minted}{bash}
python control_compute.py derivative
python control_compute.py proportional
python control_compute.py sum 3
...
\end{minted}
\end{frame}
\begin{frame}{Utilisation du script}
\includegraphics[width=\linewidth]{images/realisation/control_launch.png}
\end{frame}
\section{Interface avec le drone}
\begin{frame}{Rappels}
\begin{itemize}
\item Objectif : Asservir le drone;
\item Livrable : Une bibliothèque pour faire de l'automatique.
\end{itemize}
\end{frame}
\begin{frame}{Détection des cibles}
\begin{itemize}
\item Idée du script : Détecter les zones d'une couleur choisie;
\item Possibilité de modifier dynamiquement la couleur.
\end{itemize}
\end{frame}
\begin{frame}{Détection du bleu}
\begin{figure}
\centering
\includegraphics[height=0.7\textheight]{images/utilisation/targets.png}
\caption{Cibles bleues}
\end{figure}
\end{frame}
\begin{frame}{Détection du jaune}
\begin{figure}
\centering
\includegraphics[height=0.7\textheight]{images/utilisation/targets_yellow.png}
\caption{Cibles jaunes}
\end{figure}
\end{frame}
\begin{frame}{Interface avec le contrôleur}
\centering
\includegraphics[width=\linewidth]{images/presentation/schema_mesure.png}
\end{frame}
\begin{frame}{Simple boucle : Principe}
\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)$};
\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.
\node [output, right of=system, node distance=5cm] (output) {};
\node [block, below of=system] (measure) {Mesure};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node[pos=0.99] {$+$} (sum);
\draw [->] (sum) -- node {$\epsilon$} (controller);
\draw [->] (controller) -- (system);
\draw [->] (system) -- node [name=y] {position }(output);
\draw [->] (y) |- (measure);
\draw [->] (measure) -| node[pos=0.99] {$-$}
node [near end] {mesure de la position} (sum);
\end{tikzpicture}
\end{frame}
\begin{frame}{Axes du drone}
\includegraphics[height=\textheight]{images/modelisation/drone_axes.png}
\end{frame}
\begin{frame}{Diagramme de bode selon l'axe z et l'angle z}
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\linewidth]{images/modelisation/bode_z.eps}
\caption{Diagramme de Bode simplifié}
$C(p)=K_p+K_i/p + K_d p$
\end{figure}
\end{frame}
\begin{frame}{Diagramme de Bode selon les axes x et y}
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\linewidth]{images/modelisation/bode_u.eps}
\caption{Diagramme de Bode simplifié}
$C(p)=K_p+K_d p$
\end{figure}
\end{frame}
\begin{frame}{Réglage de la simple boucle}
\begin{itemize}
\item Axe z et angle z : Méthode de \bsc{Ziegler-Nichols} en oscillations entretenues, puis ajustements;
\item Axe x et y : Méthode empirique car \bsc{Ziegler-Nichols} trop instable;
\item Amélioration éventuelle avec une double boucle
\end{itemize}
\end{frame}
\section{Conclusion}
\begin{frame}{Conclusion}
\begin{itemize}
\item Bibliothèque fonctionnelle;
\item Asservissement fonctionnelle extensible à d'autres applications;
\item Extension éventuelle à une double boucle.
\end{itemize}
\includegraphics[height=0.5\textheight]{images/presentation/marvin.jpg}
\end{frame}
\appendix
\begin{frame}{Diagramme UML}
\begin{figure}
\centering
\includegraphics[width=\linewidth]{images/realisation/uml.png}
\caption{Diagramme UML}
\label{fig:uml}
\end{figure}
\end{frame}
\begin{frame}{Savitzky-Golay}
\begin{columns}[T]
\begin{column}{.48\textwidth}
$((x_i,y_i))_{i\in\intervalleEntier{1}{n}}$ les $n$ points de la fenêtre
Polynôme $a_0 + a_1 X + \dots + a_k X^k$
\begin{equation*}
\left \|
\begin{pmatrix}
y_1 \\
y_2 \\
\vdots \\
y_n
\end{pmatrix}
-
\begin{pmatrix}
1 & x_1 & x_1 ^2 & \cdots & x_1 ^ k \\
1 & x_2 & x_2 ^2 & \cdots & x_2 ^ k \\
\vdots & \vdots & \vdots & & \vdots \\
1 & x_n & x_n ^2 & \cdots & x_n ^ k
\end{pmatrix}
\cdot
\begin{pmatrix}
a_0 \\
a_1 \\
\vdots \\
a_k
\end{pmatrix}
\right \| ^2
\label{eq:moindrecarres_raw}
\end{equation*}
\end{column}
\begin{column}{.48\textwidth}
En supposant les $x_i$ centrés en 0 et espacés régulièrement d'un pas $h$, et $k$ impair,
\end{column}
\end{columns}
\end{frame}
\begin{frame}{Savitsky-Golay}
\begin{eqnarray*}
L((y_k),(a_k)) &=&
\left \|
\underbrace{
\begin{pmatrix}
y_1 \\
y_2 \\
\vdots \\
y_n
\end{pmatrix}}_{=Y}
-
\underbrace{
\begin{pmatrix}
1 & -\floor{\frac{n}{2}} & \left(-\floor{\frac{n}{2}}\right) ^2 & \cdots & \left(-\floor{\frac{n}{2}}\right) ^ k \\
1 & \left(-\floor{\frac{n-1}{2}}\right) & \left(-\floor{\frac{n-1}{2}}\right) ^2 & \cdots & \left(-\floor{\frac{n-1}{2}}\right) ^ k \\
\vdots & \vdots & \vdots & \vdots & \vdots \\
1 & -1 & \left(-1\right) ^2 & \cdots & \left(-1\right) ^ k \\
1 & 0 & 0 & \cdots & 0 \\
1 & \left(1\right) & \left(1\right) ^2 & \cdots & \left(1\right) ^ k \\
\vdots & \vdots & \vdots & \vdots & \vdots \\
1 & \left(\floor{\frac{n-1}{2}}\right) & \left(\floor{\frac{n-1}{2}}\right) ^2 & \cdots & \left(\floor{\frac{n-1}{2}}\right) ^ k \\
1 & \left(\floor{\frac{n}{2}}\right) & \left(\floor{\frac{n}{2}}\right) ^2 & \cdots & \left(\floor{\frac{n}{2}}\right) ^ k
\end{pmatrix}}_{=M}
\cdot
\underbrace{
\begin{pmatrix}
a'_0 \\
a'_1 \\
\vdots \\
a'_k
\end{pmatrix}}_{=A}
\right \| ^2 \\
\label{eq:moindrecarres}
\end{eqnarray*}
\end{frame}
\begin{frame}{Savitsky-Golay}
\begin{eqnarray}
\frac{\partial L}{\partial (A)}(A) &=& -2 \cdot M^\intercal \cdot (Y - M \cdot A)\\
A &=& \underbrace{(M^\intercal\cdot M)^{-1} \cdot M^\intercal}_{=B} \cdot Y
\end{eqnarray}
Dérivée d'ordre $d$, on convolue le signal par le filtre RIF $[b_1, \dots b_n ]$, avec
\begin{equation}
\forall i \in \intervalleEntier{0}{n}, b_i = B_{d,n-i}
\end{equation}
\end{frame}
\begin{frame}{Méthode de \bsc{Ziegler-Nichols}}
\centering
\begin{tabular}{|c|c|}
\hline
Type de contrôle & Paramètres de réglage \\
\hline
P.I.D & $K_p=0.6 K_u$ $K_i=\frac{T_u}{2}$ $K_d=\frac{T_u}{8}$ \\
\hline
P.I.D peu de dépassement & $K_p=0.33 K_u$ $K_i=\frac{T_u}{2}$ $K_d=\frac{T_u}{3}$ \\
\hline
P.I.D aucun dépassement & $K_p=0.2 K_u$ $K_i=\frac{T_u}{2}$ $K_d=\frac{T_u}{3}$ \\
\hline
\end{tabular}
\end{frame}
\begin{frame}{Double boucle}
\begin{tikzpicture}[auto, node distance=2cm,>=latex',scale=0.7, every node/.style={scale=0.7}]
% 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}
\end{frame}
\end{document}

View file

@ -0,0 +1,34 @@
#! /usr/bin/python3
import yaml
import sys
import time
import click
@click.command()
@click.option('--output', default="output.csv", help='Output file')
@click.option('--time/--no-time', 'use_time', default=False, help='Add the number of seconds')
@click.option('--field', default="data", help='YAML field to store')
def main(output, use_time, field):
with open(output, 'w') as f:
s = ""
last_line = ""
try:
for line in sys.stdin:
if line == "---\n":
v = yaml.load(s)[field]
print(v)
if use_time:
f.write(str(time.time()) + ',' + str(v) + "\n")
else:
f.write(str(v)+"\n")
s = ""
else:
s += line + '\n'
except KeyboardInterrupt:
print("Output saved to " + output)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,68 @@
using Plots
using DSP
using CSV
pyplot()
# Parameters
filename = joinpath(@__DIR__, "data", "walk.csv") # input file
h = 1/22 # sample time
orders = [
(title="quadratique", order=2, sizes=5:2:11),
(title="cubique", order=3, sizes=5:2:11),
(title="big_quadra", order=2, sizes=11:10:51)
]
function savgol(size::Int64, poly_order::Int64, deriv::Int64=0, delta::Float64=1.0, conv::Bool=false)
half_size, rem = divrem(size, 2)
if rem == 0
throw(ArgumentError("size must be odd."))
end
M = [-half_size:half_size;] .^ [0:poly_order;]';
y = zeros(poly_order+1)';
y[deriv+1] = factorial(deriv) / delta^deriv;
scal = y*inv(M'*M)*M'
if conv
scal = scal[end:-1:1]
end
scal
end
error = (CSV.read(filename, header=false) |> Matrix{Float64})[:,2]
for order in orders
plot(
0:h:(length(error)-1)*h,
error,
label="erreur mesurée",
layout=(2,1),
subplot=1,
title="Position",
xrotation=60,
xlabel="Temps (s)",
ylabel="Position (m)",
reuse=false,
size=(1000, 600)
)
plot!(
subplot=2,
title="Vitesse mesurée",
xrotation=60,
xlabel="Temps (s)",
ylabel="Vitesse (\$m.s^{-1}\$)"
)
for size in order.sizes
filter = savgol(size, order.order, 1, h, true)
speed = conv(filter, error)[size:end-size]
plot!(
size*h/2:h:size*h/2+(length(speed)-1)*h,
speed,
label=string(order.title, " ", size, " points"),
subplot=2
)
end
savefig(joinpath(@__DIR__, "results", string("mesure_vitesse_", order.title, ".eps")))
end
show()

View file

@ -0,0 +1,32 @@
import matplotlib.pyplot as pl
from matplotlib.patches import Rectangle
from find_targets import find_targets, normalize_coordinates
ax = pl.subplot(211)
img = pl.imread('image.jpeg')
H, L, R, objects = find_targets(img, return_slices=True)
for o in objects:
x, y = o
r = Rectangle((y.start, x.start), y.stop-y.start, x.stop-x.start, linewidth=1,edgecolor='r',facecolor='none')
ax.add_patch(r)
ax.imshow(img)
ax.plot([H[0], L[0], R[0]], [H[1], L[1], R[1]], 'o', color='red')
ax = pl.subplot(212)
w = len(img[0])
h = len(img)
H = normalize_coordinates(H, w, h)
L = normalize_coordinates(L, w, h)
R = normalize_coordinates(R, w, h)
ax.plot([H[0], L[0], R[0]], [H[1], L[1], R[1]], 'o', color='red')
ax.grid()
ax.set_title("Positions normalisées")
pl.show()

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 171 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
doc/rapport.pdf Normal file

Binary file not shown.

View file

@ -1,10 +1,10 @@
<launch>
<node name="Ratex_param" pkg="dynamic_reconfigure" type="dynparam" args="load /ratex $(find detect_targets)/params/rate.yaml"/>
<node name="Ratey_param" pkg="dynamic_reconfigure" type="dynparam" args="load /ratey $(find detect_targets)/params/rate.yaml"/>
<node name="Ratez_param" pkg="dynamic_reconfigure" type="dynparam" args="load /ratez $(find detect_targets)/params/rate.yaml"/>
<node name="Rateangz_param" pkg="dynamic_reconfigure" type="dynparam" args="load /rate_ang_z $(find detect_targets)/params/rate.yaml"/>
<node name="Ratex_param" pkg="dynamic_reconfigure" type="dynparam" args="load /ratex $(find detect_targets)/params/rate.yaml" />
<node name="Ratey_param" pkg="dynamic_reconfigure" type="dynparam" args="load /ratey $(find detect_targets)/params/rate.yaml" />
<node name="Ratez_param" pkg="dynamic_reconfigure" type="dynparam" args="load /ratez $(find detect_targets)/params/rate.yaml" />
<node name="Rateangz_param" pkg="dynamic_reconfigure" type="dynparam" args="load /rate_ang_z $(find detect_targets)/params/rate.yaml" />
<node name="safe_param" pkg="dynamic_reconfigure" type="dynparam" args="load /safe $(find detect_targets)/params/settings_safe.yaml"/>
<node name="targets_param" pkg="dynamic_reconfigure" type="dynparam" args="load /targets $(find detect_targets)/params/settings_targets.yaml"/>

View file

@ -8,7 +8,7 @@ import click
@click.command()
@click.option('--output', default="output.csv", help='Number of greetings.')
@click.option('--output', default="output.csv", help='Output file')
@click.option('--time/--no-time', 'use_time', default=False, help='Add the number of seconds')
@click.option('--field', default="data", help='YAML field to store')
def main(output, use_time, field):

View file

@ -1,6 +1,6 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: matplotlib version 2.2.4, http://matplotlib.org/
%%CreationDate: Tue Jun 4 14:06:46 2019
%%CreationDate: Thu Jun 6 21:14:01 2019
%%Orientation: portrait
%%BoundingBox: 90 252 522 540
%%EndComments

View file

@ -1,6 +1,7 @@
using Plots
using DSP
using CSV
using ControlSystems
pyplot()
@ -29,19 +30,12 @@ function savgol(size::Int64, poly_order::Int64, deriv::Int64=0, delta::Float64=1
scal
end
filter = savgol(19, 2, 1, h, true)
H = tf(filter, [1], h)
mag, phase, w = bode(H)
plot(w,log.(mag[:,1]), label="mag", title="plop")
savefig(joinpath(@__DIR__, "results", string("savgol_bode_", "plop", ".eps")))
plot(title="Comparaison de tailles de filtres")
for size in orders[3].sizes
filter = savgol(size, 2, 1, h, true)
H = tf(filter, [1], h)
mag, phase, w = bode(H)
plot!(w,log.(mag[:,1]), label=string(size, " points"))
end
savefig(joinpath(@__DIR__, "results", "savgol_bode.eps"))
show()
# for order in orders
# for size in order.sizes
# filter = savgol(size, order.order, 1, h, true)
# H = tf(filter, [1], 0.05)
# bode(H)
# end
# savefig(joinpath(@__DIR__, "results", string("savgol_bode_", order.title, ".eps")))
# end
# show()