\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}