\documentclass[a4]{beamer} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[francais]{babel} \usepackage{listings} \usepackage{color} \title{Logiciel de contrôle Khepera II} \author{Guillaume Libersat } \date{Mercredi 16 Mai} \usecolortheme{dolphin} \usefonttheme{default} \useinnertheme{rounded} \useoutertheme{shadow} \begin{document} \maketitle \begin{frame} \tableofcontents[subsectionstyle=hide] \end{frame} \section{Introduction} \begin{frame} \frametitle{Introduction} Projet individuel Master 1 \begin{itemize} \item Démarré en Février \item En parallèle des cours \end{itemize} \pause Objectifs \begin{itemize} \item Etablir un canal de communication avec le robot ; \item Donner des ordres ; \item Recevoir les informations des capteurs ; \item Créer un interpréteur de commandes. \end{itemize} \pause Contraintes \begin{itemize} \item Doit fonctionner sous GNU/Linux ; \item Doit être programmé en langage C. \end{itemize} \end{frame} \section{Présentation du Khepera II} \subsection{Description physique} \begin{frame} \frametitle{Présentation physique} \begin{center} \includegraphics[scale=0.6]{../images/schem_khep.png} \end{center} Equipement \begin{itemize} \item Deux roues indépendantes ; \item 8 capteurs de présence ; \item 8 capteurs de luminosité ; \item Possibilité de connecter des extensions. \end{itemize} \end{frame} \subsection{Présentation logicielle} \begin{frame} \frametitle{Présentation logicielle} Deux modes de fonctionnement : \begin{enumerate} \item Autonome \begin{itemize} \item Logiciel chargé en mémoire \item Utilise l'API de l'OS \item Nécessité d'uploader le code à chaque modification \item Limité aux capacités du robot \end{itemize} \pause \item Contrôle distant \begin{itemize} \item Via RS232 \item Via Bluetooth (avec tourelle) \item Plus lent \item Utilise les capacités de la machine hôte \end{itemize} \end{enumerate} \end{frame} \section{Conception} \subsection{Architecture générale} \begin{frame} \frametitle{Architecture générale} \begin{columns} \begin{column}{0.5\textwidth} \includegraphics[scale=0.5]{../images/arch_debut.png} \end{column} \begin{column}{0.5\textwidth} Buts \begin{itemize} \item Construction par étapes \item Débogage plus aisé \item Réutilisation du code \item Maintenabilité \item Modularité \end{itemize} \end{column} \end{columns} \end{frame} \section{Développement} \subsection{La bibliothèque d'accès} \begin{frame} \frametitle{La bibliothèque d'accès} Trois rôles \begin{itemize} \item Ouvrir un canal de communication ; \item Envoyer des commandes ; \item Recevoir et préparer les réponses. \end{itemize} \pause Caractéristiques \begin{itemize} \item Abstraction totale du protocole \item Deux familles de commandes \item Temps de latence minimisé \end{itemize} \end{frame} \subsubsection{Aspect technique} \begin{frame} \frametitle{Quelques points techniques} \begin{columns} \begin{column}{0.5\textwidth} \includegraphics[scale=0.35]{../images/autotools.png} \end{column} \begin{column}{0.5\textwidth} \begin{itemize} \item Utilise les autotools \item Compatible x86, powerpc \item Testé seulement sous GNU/Linux \item Intègre Doxygen (PDF, HTML, Manpages, ...) \end{itemize} \end{column} \end{columns} \end{frame} \subsubsection{Classes de commandes} \begin{frame} \frametitle{Les commandes} \emph{Deux familles} \pause Ordres \begin{itemize} \item Du type ``Avancer de 3 cm'', ``Tourner de 90°'', ... \item Pas de réponse du robot \end{itemize} \pause Requêtes \begin{itemize} \item Du type ``valeur des capteurs'', ``vitesse actuelle'', ... \item Réponse de diverses formes \end{itemize} \pause Nécessité de récupérer et préparer les réponses. \end{frame} \begin{frame} \frametitle{Structures de données} \lstinputlisting[basicstyle=\footnotesize,keywordstyle=\color{black}\bfseries\underbar,language=C,numbers=left,frame=single]{types_req.h} Macros utiles \begin{itemize} \item Codes de retour explicites : \emph{OK}, \emph{BADREP}, \emph{E\_IO}, ... \item Capteurs : \emph{KHEP\_SENS\_LEFT45}, ... \item Moteurs : \emph{KHEP\_MOT\_L}, ... \item Diodes : \emph{KHEP\_LED\_FRONTAL}, ... \item Etats : \emph{KHEP\_LED\_ON}, ... \end{itemize} \end{frame} \subsubsection{Un exemple de commande} \begin{frame} \frametitle{Exemple de commandes} \lstinputlisting[basicstyle=\footnotesize,keywordstyle=\color{black}\bfseries\underbar,language=C,numbers=left]{requete.c} \end{frame} \subsubsection{Problèmes} \begin{frame} \frametitle{Problèmes rencontrés} Résolus \begin{itemize} \item Configuration du port série \item Elimination de la bannière \item Problèmes de synchronisation \end{itemize} \pause Non résolus \begin{itemize} \item Montée en charge (tilt !) \end{itemize} \end{frame} \section{Applications} \subsection{Centre de tests} \begin{frame} \frametitle{Centre de tests} \begin{columns} \begin{column}{0.5\textwidth} \begin{center} \includegraphics[scale=0.35]{../images/khepcc.png} \end{center} \end{column} \begin{column}{0.5\textwidth} Objectif initial \begin{itemize} \item Tester la bibliothèque \end{itemize} \pause En fait... \begin{itemize} \item Pratique pour tester/calibrer/stresser le robot \end{itemize} \pause Technologies utilisées \begin{itemize} \item C \item SDL \item Cairo \end{itemize} \end{column} \end{columns} \end{frame} \subsection{Interprêteur} \begin{frame} \frametitle{Interprêteur de commandes} L'idée \begin{itemize} \item Inutile de réinventer un shell \item Minimiser la maintenance \end{itemize} \pause Python \begin{itemize} \item Utilisable en script \item Utilisable via un shell interactif \end{itemize} \pause Bindings python \begin{itemize} \item ``Glue'' entre du code C et du python \item SWIG : Génération ``automatique'' depuis le code C \end{itemize} \pause Résultat \begin{itemize} \item Bibliothèque facile à maintenir \item Même API que le C (donc documentation) \end{itemize} \end{frame} \subsubsection{Exemple python} \begin{frame} \frametitle{Un exemple en python} \lstinputlisting[basicstyle=\footnotesize,keywordstyle=\color{black}\bfseries\underbar,language=Python,numbers=left]{python.py} \end{frame} \subsection{Serveur réseau} \subsubsection{Au début} \begin{frame} \frametitle{Serveur réseau} Objectif initial \begin{itemize} \item Accès via sockets ``classiques'' \end{itemize} \pause Mais... \begin{itemize} \item Efface l'abstraction apportée par la bibliothèque \item Hasardeux à utiliser \item N'apporte aucun contrôle sur les commandes \end{itemize} \pause Après discussion, une autre solution est envisageable : XML-RPC \end{frame} \subsubsection{XML-RPC} \begin{frame} \frametitle{XML-RPC} Description \begin{itemize} \item Messages encodés en XML \item Transport par HTTP \item Standard (http://www.xmlrpc.com/spec) \item Disponible dans de nombreux langages \end{itemize} \pause \begin{center} \includegraphics[scale=0.4]{../images/xmlrpc.jpg} \end{center} \end{frame} \subsubsection{Serveur de robots} \begin{frame} \frametitle{Serveur de robots} Première version \begin{itemize} \item Réalisée en C (embarque un serveur web) \item Problème des FD (fork/die) \item Peu maintenable (introspection difficile) \end{itemize} \pause Deuxième version \begin{itemize} \item Réalisée en python (embarque un mini serveur web) \item Python n'utilise que des threads : FD ok \item Zéro maintenance (utilisation des mécanimes de langage) \end{itemize} \pause Résultat \begin{itemize} \item Toujours la même API d'un bout à l'autre \item Profite des mécanismes d'HTTP (auth) \item Extensible (SSL, Réservation, ...) \end{itemize} \end{frame} \subsubsection{Exemples d'utilisation} \begin{frame} \frametitle{Exemple d'utilisation en XML-RPC (Python)} \textbf{Python} \lstinputlisting[basicstyle=\footnotesize,keywordstyle=\color{black}\bfseries\underbar,language=Python,numbers=left]{client.py} \end{frame} \begin{frame} \frametitle{Exemple d'utilisation en XML-RPC (PHP)} \textbf{PHP} \lstinputlisting[basicstyle=\footnotesize,keywordstyle=\color{black}\bfseries\underbar,language=PHP,numbers=left]{index.php} \end{frame} \section{Conclusion} \subsection{Récapitulatif} \begin{frame} \frametitle{Récapitulatif} \begin{columns} \begin{column}{0.5\textwidth} \begin{center} \includegraphics[scale=0.5]{../images/arch_debut.png} \end{center} \end{column} \begin{column}{0.5\textwidth} \begin{itemize} \item Utilisable sur 3 niveaux \begin{enumerate} \item Bibliothèque \item Interpreteur/Script \item Réseau \end{enumerate} \item API constante \begin{itemize} \item Même utilisation à tous les niveaux \item Documentation \end{itemize} \item Utilisable avec tous les langages à travers le réseau \item \emph{Paquet Debian en cours de préparation...} \end{itemize} \end{column} \end{columns} \end{frame} \subsection{Ouvertures} \begin{frame} \frametitle{Ouvertures} Bibliothèque \begin{itemize} \item Améliorer la stabilité (série de tests, ...) \item Réécrire le logiciel interne ? \item Supporter les extensions (plugins ?) \end{itemize} \pause Bindings \begin{itemize} \item Générer vers d'autres langages (OCaml, Perl, ...) \item Rendre l'API plus naturelle pour le langage cible (Classes, ...) \end{itemize} \pause Serveur \begin{itemize} \item Mécanisme d'authentification \item Sélection d'un robot par ses capacités \end{itemize} \end{frame} \end{document}