IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

comment envoyer une commande au ARDrone 2.0 sous Android ?


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut comment envoyer une commande au ARDrone 2.0 sous Android ?
    Bonjour,

    J'essaie de programmer une application Android permettant de contrôler l'ARDrone 2.0 de Parrot et je n'arrive pas à envoyer une commande. Vendredi, j'avais réussi à faire décoler l'engin mais depuis hier le code ne marche plus pourtant il me semble que je ne l'avais pas modifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
     
    public class CmdDecollage extends Thread {
     
       String commande="";
       byte[] cmdToByte;
       InetAddress IpDrone;
       DatagramSocket clientSocket;
       boolean etat;
       DatagramPacket sendPacketWithCmd;
       private byte[] ip = {(byte)192, (byte)168, (byte)1, (byte)1 };
       boolean isRunning = true;
       private final static long TIME_SLEEP= 20;
     
       //---- Traitement ----//
       public void run() {
     
          //---- Convertit l'adresse byte en IP ----//
          try {
    	IpDrone = InetAddress.getByAddress(ip);
          } catch (UnknownHostException e1) {
    	e1.printStackTrace();
    	etat = false;
          }
     
           //---- Cree le Socket ----//
           try {
                 clientSocket = new DatagramSocket();
           } catch (SocketException e) {
    	e.printStackTrace();
    	etat = false;
           }
     
           while(isRunning){
    	runControl();
    	try {
    	         Thread.sleep(TIME_SLEEP);
    	} catch (InterruptedException e) {
    	          e.printStackTrace();
    	}
           }
       }
     
       public void runControl(){
    	//---- Commande à envoyer au Drone ----//
    	commande =  "AT*REF=1,290717696<LF>AT*REF=2,290717952<LF>AT*REF=3,290717696<LF>";
     
    	//---- Convertit la commande en Byte ----//
    	cmdToByte = commande.getBytes();
     
    	//---- Envoie la packet avec la commande au Drone ----//
    	try {
    	        sendPacketWithCmd = new DatagramPacket(cmdToByte, cmdToByte.length, IpDrone, 5556);					
    	         clientSocket.send(sendPacketWithCmd);
    	} catch (IOException e) {
    		e.printStackTrace();
    		etat = false;
    	}
    	etat = true;
    	isRunning=false;
        }
     
        public boolean retourneetat(){
    		return etat;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.app.Activity;
     
    public class HomeActivity extends Activity {
     
    	Button boutonDecollage;
    	CmdDecollage cmdD;
    	static TextView tV;
     
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_home);
     
    		tV = (TextView) findViewById(R.id.text);
     
    		//---- Bouton pour decoller ----//
    		boutonDecollage = (Button) findViewById(R.id.button1);
     
    		//--- Ecouteur du Bouton de Decollage ----//
    		boutonDecollage.setOnClickListener(new View.OnClickListener() {
    			public void onClick(View v) {
    				cmdD = new CmdDecollage();
    				cmdD.start();
    				tV.setText("DONC c'est : "+cmdD.retourneetat());
    			}
    		});	
    	}
     
    	public static TextView gettV() {
    		return tV;
    	}
     
    	public static void settV(TextView tV) {
    		HomeActivity.tV = tV;
    	}
     
    }
    Merci.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Il y a de bonnes chances pour que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmdD.start();
    tV.setText("DONC c'est : "+cmdD.retourneetat());
    Marque toujours "faux".... puisque rien ne dit que le thread a tourné, retournetat() (devrait être "getEtat()" non ?) ne donnera que la valeur par défaut.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut reponse
    Merci nicroman

    tV.setText("DONC c'est : "+cmdD.retourneetat());
    cette ligne ne correspond qu'à un residu de test que j'ai réalisé.
    Je sais donc que cette ligne n'est pas bonne c'est un oubli de ma part
    Je pense donc que le probleme ne vient pas d'ici.
    une autre idée ?

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    La gestion des exceptions dans le "run()" n'est pas bonne...

    1. Il manque le log de celles-ci
    2. Elles sont catchées, mais le programme continue (donc certainement une autre exception sera levée)

    Utiliser plutôt un code comme (j'ai aussi rajouté quelques commentaires):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    public class CmdDecollage extends Thread {
     
       String commande="";  // pourquoi conserver la commande ? et ne pas utiliser une constante (static final)
       byte[] cmdToByte; // pareil ici, ne regarde qu'une seule fonction !
       InetAddress IpDrone; // idem !  (attention aussi le nom de la variable devrait etre ipDrone et non IpDrone)
       DatagramSocket clientSocket; 
       boolean etat;
       DatagramPacket sendPacketWithCmd;
       private byte[] ip = {(byte)192, (byte)168, (byte)1, (byte)1 }; 
       boolean isRunning = true; 
       private final static long TIME_SLEEP= 20;
     
       //---- Traitement ----//
       public void run() {
     
          // un seul block try pour tout ce qui est nécessaire
          try {
             //---- Convertit l'adresse byte en IP ----//
    	IpDrone = InetAddress.getByAddress(ip);
     
           //---- Cree le Socket ----//
           clientSocket = new DatagramSocket();
     
           while(isRunning){  // le while ne sert à rien, runControl() met toujours isRunning à "false"
       	  runControl();
              Thread.sleep(TIME_SLEEP);
           }
          } catch (Exception ex) {
             Log.e("CmdDecollage","Erreur ouverture socket !",ex);
          }
       }
     
       public void runControl(){
    	//---- Commande à envoyer au Drone ----//
    	commande =  "AT*REF=1,290717696<LF>AT*REF=2,290717952<LF>AT*REF=3,290717696<LF>";
     
    	//---- Convertit la commande en Byte ----//
    	cmdToByte = commande.getBytes(); // sur que c'est en UTF-16 que l'ARDrone doit recevoir les commandes ?
     
    	//---- Envoie la packet avec la commande au Drone ----//
    	try {
    	        sendPacketWithCmd = new DatagramPacket(cmdToByte, cmdToByte.length, IpDrone, 5556);					
    	         clientSocket.send(sendPacketWithCmd);
    	} catch (IOException e) {
    		Log.e("CmdDecollage","Erreur envoi de commande !",e);
    		etat = false; // ne sert a rien... etat=true juste après !
    	}
    	etat = true; // à bouger dans le try non ?
    	isRunning=false; 
        }
     
        public boolean retourneetat(){
    		return etat;
        }
    }
    Bon... ensuite, Thread.sleep().... je me répète toujours là dessus, mais un grand homme de la programmation m'a un jour dit: si on appelle "sleep" sur un thread, c'est qu'on a: ou bien un thread de trop, ou raté un système de synchronisation.

    Mais bon en l'occurence, là le Thread.sleep() ne sert à rien puisque la fonction runControl va de toute manière mettre "isRunning" à false...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Désole de n'avoir pas répondu durant cette semaine (pont de mai oblige :-)).

    J'ai suivi ton conseil et tous ce porte à merveille.
    Le réelle problème était en fait la commande envoyé au drone qui n’était pas correct (le numéro de séquence des commandes devaient être réinitialisées).

    Merci de votre aide, cela m'a bien aidé et me permet d'avancer .

    Bien à vous, signer le francky !

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 15
    Points
    15
    Par défaut Demande de nouvelles
    Bonjour,

    j'ai vu votre post, moi aussi j'aimerai commencer a en creer un app pour ar drone, donc voila ,j'aimerai savoir ou vous en êtes ?

    Cdt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/10/2012, 16h23
  2. Comment envoyer une commande UNIX par Delphi avec Indy ?
    Par Vulcanos dans le forum Web & réseau
    Réponses: 2
    Dernier message: 25/09/2007, 22h16
  3. Comment envoyer une commande en HTTP ?
    Par Promeneur dans le forum Web & réseau
    Réponses: 5
    Dernier message: 08/06/2005, 17h45
  4. Réponses: 4
    Dernier message: 03/12/2004, 11h18
  5. Comment envoyer une commande à une console ?
    Par seb_asm dans le forum Assembleur
    Réponses: 3
    Dernier message: 27/03/2004, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo