Comment développer un drone autonome intelligent ?

La vision

| Paul Guermonprez | Nicolas Vailliet | Cedric Andreolli |

Jouer avec des petits drones civils, c'est amusant. Les programmer pour en faire des outils, c'est mieux. Intel s'est donc associé à des universités à travers le monde pour développer des drones civils autonomes et intelligents facilement programmables. Voici une recette pour commencer à faire votre drone le plus simplement possible. D'autres tutoriels sont disponibles sur le site du programme académique d'Intel

N'hésitez pas à commenter cet article. Commentez

- Titre : Comment développer un drone autonome intelligent ?

- Auteurs : Paul Guermonprez, Nicolas Vailliet, Cedric Andreolli

- Parution : 14 mars 2014

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2014 Intel. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Pourquoi ?

- III. Comment ?

- IV. Projet Java + Natif

- V. Interaction C++/Java et algorithme

- VI. Passages Java intéressants

- VII. Passages C++ intéressants

- VIII. Performances et futur

- IX. Conclusion de la deuxième étape

- X. Remerciements

I - Introduction

Dans le premier article, nous avons vu qu'un drone avait besoin d'une bonne capacité de calcul embarquée pour espérer être intelligent et autonome. Reste maintenant à écrire un code qui tire parti de ce potentiel : nous allons donner des yeux à notre drone !

II - Pourquoi ?

Un drone peut certes se repérer par GPS pour naviguer, mais la précision et la latence du GPS ne permettent pas de l'utiliser pour le pilotage de précision (entre bâtiments, humains ou arbres). D'autres drones peuvent être pilotés avec précision et dextérité en laboratoire, mais ils obtiennent leur position des caméras sophistiquées qui entourent la salle, pas utilisables.

En conditions réelles, il est indispensable que le drone puisse « voir », par exemple pour reconnaitre et suivre des marquages au sol ou identifier visuellement des humains. Le matériel est là puisque nous utilisons comme plateforme embarquée un téléphone mobile Android. Reste à capturer des images depuis Android et les analyser avec OpenCV.

III - Comment ?

OpenCV est une librairie open source d'analyse d'image à la base de très nombreux projets de vision par ordinateur ou réalité virtuelle. Initialement développée par Intel, elle est maintenant disponible pour de nombreuses plateformes matérielles et OS. Un même code écrit sur PC peut être déployé aussi bien sur serveur, smartphone ou petit objet intelligent. http://opencv.org

Nous allons tenter de reconnaitre un marquage simple, ici un cercle, et piloter de manière à être en face de ce cercle à une distance fixe. Imaginez que le drone ait pu naviguer par GPS jusqu'à la position globale de sa piste d'atterrissage (à 3 m près), il doit encore reconnaitre un marquage au sol pour aller se positionner au-dessus avec précision et à une hauteur déterminée. Il n'aura ensuite qu'à descendre pour se poser sur le marquage (à quelques centimètres). Pour simplifier les tests nous afficherons les commandes de vol à l'écran et vous le simulerez en déplaçant le mobile.

IV - Projet Java + Natif

OpenCV ne fait pas partie des librairies disponibles directement depuis Android et n'est pas en Java pour l'essentiel. Il s'agit d'une librairie native typiquement utilisée depuis C++, il vous faudra donc utiliser le NDK Android. La partie capture de l'image et affichage restera elle en Java et la communication entre Java et C++ se fera par JNI. Nous devons installer le NDK, créer un projet Android SDK « Circles », ajouter une composante C/C++ et changer les réglages du projet pour utiliser la librairie OpenCV :

Réglages du projet Java

Réglages du projet C/C++

Réglage de la variable NDK_ROOT du projet C/C++

Réglages du parser pour le projet C/C++

Réglages des includes pour STL, OpenCV et le NDK

À la fin, votre projet aura :

- un fichier Java principal de l'app « Src/MainActivity.java » ;

- un fichier layout xml « Res/layout/activity_main.xml » et le manifest ;

- deux Makefiles « Jni/Android.mk » et « Jni/Application.mk » ;

- un code cpp « Jni/ComputerVision_jni.cpp » et header « Jni/ComputerVision_jni.h ».

Architecture matérielle : contrairement à Java, C++ doit être compilé pour un processeur donné. Ce réglage se fait en éditant simplement la variable APP_ABI dans le fichier Application.mk. Pour notre smartphone avec processeur Intel Atom, la bonne valeur est « x86 ». Le NDK se chargera du reste.

Déploiement : puisque OpenCV est une librairie utilisée par de nombreuses apps, il est plus pratique de ne pas déployer la librairie avec son app mais de dépendre d'une app « OpenCV manager » qui va installer et lancer OpenCV pour vous.

V - Interaction C++/Java et algorithme

Ce code récupère l'image de la caméra depuis Java avec les API d'Android, fait un appel à C++ par JNI en joignant un pointeur sur l'image en mémoire, le code C++ procède au traitement d'image pour détecter les cercles et retourne vers Java qui affiche l'image augmentée de marques et commentaires.

L'idée est de détecter des cercles par OpenCV, d'en déterminer le centre et le rayon, puis d'afficher des ordres à l'opérateur du smartphone pour aboutir à un cercle parfaitement centré et de bonne dimension.

Éloignement : connaissant la dimension réelle du cercle et après étalonnage de la caméra du smartphone, je sais que le cercle doit faire une certaine dimension sur l'image. Si le cercle est trop gros, je dois m'en éloigner, si trop petit m'en approcher. Finalement le drone sera à une distance précise du cercle. On peut aussi imaginer une cible de fléchette, des cercles concentriques avec l'instruction de se rapprocher. Le cercle devenu grand sort du champ de vision et le plus petit prend le relais pour mener le drone à la position souhaitée.

Centrage : je souhaite que le cercle soit centré sur l'image pour simuler le positionnement du drone à la verticale du marquage.

Ce type de pilotage est très simple, voire simpliste. Un cercle d'un diamètre de 10 cm vu d'1 mètre peut sans doute être confondu avec un rondpoint vu de 500 m. Mais associé à d'autres informations comme la couleur ou la position GPS, pourquoi pas un capteur de profondeur, il peut être très pertinent et simple à mettre en place.

VI - Passages Java intéressants

…
// pour capturer des images avec la camera
import org.opencv.android.CameraBridgeViewBase;
// pour charger la dependance OpenCV natif
import org.opencv.android.OpenCVLoader;
…
public void onResume()
{
super.onResume();
// chargement d'OpenCV natif avec un callback
// partie non habituelle specifique a OpenCV
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
…
// une fois que le lien avec le manager OpenCV est fait,
// on peut charger la librairie dynamique compilee
// par le NDK a partir de notre code c++
System.loadLibrary("jni_part");
…

VII - Passages C++ intéressants

…
// typique de JNI : nom relatif a la classe Java
// pointeur vers image en RGB/gris en argument
JNIEXPORT int JNICALL Java_com_example_circles_MainActivity_process
(JNIEnv *jenv, jobject obj, jlong addrGray, jlong addrRgba)
…
// Récupérer le bitmap depuis le pointeur
Mat& mRgb = *(Mat*)addrRgba;
// blur, requis avant de faire la detection de cercles
medianBlur(mGr,mGr,5);
// detection par OpenCV - Hough transform
HoughCircles(mGr, //grayscale input image
*circles, //output vector
CV_HOUGH_GRADIENT, //detection method to use
4, //inverse ratio of the accumulator resolution to the image
mGr.rows/8, //min distance between centers of detected circles
220, //higher threshold of the two passed intern canny edge detector
200, //accumulator threshold   100
20, //min radius
mGr.cols/8 //max radius
);

VIII - Performances et futur

Installer l'OpenCV manager depuis le Play Store Android et votre app depuis Eclipse. Lancer votre app et laissez-vous guider : elle détectera les cercles dans son champ de vision et vous guidera pour aboutir à un cercle centré et d'un diamètre apparent prédéfini.

Le code de détection des cercles est pédagogiquement intéressant mais vraiment rudimentaire, restez donc dans de bonnes conditions : fond uni, bon contraste. Mais il existe des fonctions de réalité augmentée qui sont capables de détecter des patterns complexes de manière fiable et sans faux positifs. On peut donc détecter des patterns uniques et très précis, par exemple toute la signalétique rencontrée sur un aéroport.

Pour piloter le drone, il suffira de remplacer les ordres affichés par l'envoi de commandes avant/arrière/cabrage/lacet au drone qui porte la caméra. Ça tombe bien, les ordres et commandes correspondent exactement !

Sur notre smartphone datant de 2012 (à l'époque vendu 239 euros sans engagement), nous capturons et traitons une image tous les 8 centièmes de secondes soit 12.5 images par seconde. Cela prouve qu'il est possible de se diriger simplement par la vision avec un « budget temps/processeur/énergie » très raisonnable et réaliste pour un petit drone. Et ce en parfaite autonomie, sans déporter aucun calcul.

Il est possible d'aller plus loin. OpenCV est une librairie open source et largement portable mais il existe des moyens d'en accélérer l'exécution sur processeurs Intel. Intel Integrated Performance Primitives (IPP) remplace certains des appels bas niveau d'OpenCV et les accélère par des routines ultra optimisées pour les processeurs Intel. Vous pouvez ainsi garder votre code portable et votre dépendance à une librairie open source tout en bénéficiant de la performance d'IPP lors du déploiement. http://software.intel.com/en-us/intel-ipp

IX - Conclusion de la deuxième étape

Finalement, utiliser un smartphone Android Intel comme ordinateur embarqué dans un drone ou un robot est une solution qui allie performance, endurance et facilité de développement. Faire ce choix vous laissera la possibilité de migrer sur un autre OS ou une plateforme matérielle plus puissante si un smartphone ne vous suffit plus pour de gros drones/robots. C'est là toute la culture du développement sur PC qui s'applique au mobile et à la robotique.

X - Remerciements

Merci à Intel Software Academic Program et à Paul Guermonprez, Nicolas Vailliet et Cédric Andreolli - EMEA Academic Program Manager pour la rédaction de ce tutoriel.

Pour toute question, merci de contacter Paul Germonprez.