Aller au contenu


Photo
- - - - -

Programme intelligent


64 réponses à ce sujet

#41 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 06:15

Hello !



Selon moi, le mieux, c'est de développer un vrai programme avec une vrai architecture dans un langage un peu plus haut niveau (le C++ suffit) et de faire tourner tout ça avec un Linux embarqué !
Dès que tu veux commencer à faire des choses compliqués ou importantes, Arduino devient vraiment vite limité...

Exemple de carte avec linux embarqué (mais ce n'est pas la seule !)
http://beagleboard.org/


++
Black Templar


Salut !

Super sympa la BeagleBone ^^ le prix n'est pas exessif pour ce que c'est !
C'est sur que niveau puissance c'est pas la meme chose. Mais je ne maitrise pas le langage C.. (je vais quand meme devoir apprendre pour programmer la cmucam de toute façon.)


miq75, d'aprés ton lien c'est la fonction "void" qui introduit le tread ? Si c'est ça alors c'est ce que je fais déja. Il faut juste que j'évite d'utiliser "delay()" pour éviter le ralentissement de la lecture des treads:
par exemple si je veux faire clignoter 2 leds à des fréquances différentes, si j'utilise "delay()" le programme va faire clignoter les leds l'une aprés l'autre et non simultanément.

Modifié par ashira, 20 juin 2012 - 07:03 .


#42 miq75

miq75

    Nouveau membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 20 juin 2012 - 07:14

miq75, d'aprés ton lien c'est la fonction "void" qui introduit le tread ? Si c'est ça alors c'est ce que je fais déja. Il faut juste que j'évite d'utiliser "delay()" pour éviter le ralentissement de la lecture des treads:
par exemple si je veux faire clignoter 2 leds à des fréquances différentes, si j'utilise "delay()" le programme va faire clignoter les leds l'une aprés l'autre et non simultanément.

Non, c'est "pthread_create" qui introduit le thread (qui sépare l'execution en deux branches, c'est à dire la ligne suivante de code d'un coté, et le contenu de la fonction passé en argument de l'autre coté). Le "void* ma_fonction(void* data);" est la fonction qui décrit ce que fera le thread, et son nom, c'est "ma_fonction". "void*", c'est le type de retour de la fonction du thread (en gros un pointeur sur un type indéfini).

En gros, tu écrit une fonction de la forme
void* couche_numero_x(void* data);
qui va contenir une boucle infinie : le traitement de ta couche.
et tu fais un appel à
pthread_create(&thread, NULL, couche_numero_x, (void*)&valeur);
par thread (= couches) que tu veut gérer.


De toute façon, si tu veut mettre un semblant "d'intelligence", c'est à dire des algos te permettant l'apprentissage, tu aura besoin de passer par c ou c++, alors autant l'apprendre tout de suite. ;)

#43 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 07:22

Non, c'est "pthread_create" qui introduit le thread (qui sépare l'execution en deux branches, c'est à dire la ligne suivante de code d'un coté, et le contenu de la fonction passé en argument de l'autre coté). Le "void* ma_fonction(void* data);" est la fonction qui décrit ce que fera le thread, et son nom, c'est "ma_fonction". "void*", c'est le type de retour de la fonction du thread (en gros un pointeur sur un type indéfini).

En gros, tu écrit une fonction de la forme
void* couche_numero_x(void* data);
qui va contenir une boucle infinie : le traitement de ta couche.
et tu fais un appel à
pthread_create(&thread, NULL, couche_numero_x, (void*)&valeur);
par thread (= couches) que tu veut gérer.


De toute façon, si tu veut mettre un semblant "d'intelligence", c'est à dire des algos te permettant l'apprentissage, tu aura besoin de passer par c ou c++, alors autant l'apprendre tout de suite. ;)


D'accord. ;) j'espère qu'en ajoutant des treads, mon arduino ne ralentisse pas trop ^^
Selon toi quels éléments manqueraient au langage arduino pour etre aussi efficace que le c++ ?

#44 SRWieZ

SRWieZ

    Membre

  • Membres
  • PipPip
  • 231 messages
  • Gender:Male
  • Location:Evreux, Haute-Normandie, France

Posté 20 juin 2012 - 07:46

Les threads sont impossible sur Arduino.
L'arduino n'est vraiment pas fais pour faire des trucs aussi compliqué que propose miq75.
Par contre, vu que tu as 3 "cpu" qui tournes sur ton robot (Arduino mini, mega, et cmucam), tu peut peut être organisé le truc pour qu'il fasses plusieurs choses différentes en parallèle.

#45 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 07:55

Les threads sont impossible sur Arduino.
L'arduino n'est vraiment pas fais pour faire des trucs aussi compliqué que propose miq75.
Par contre, vu que tu as 3 "cpu" qui tournes sur ton robot (Arduino mini, mega, et cmucam), tu peut peut être organisé le truc pour qu'il fasses plusieurs choses différentes en parallèle.


Dommage..
C'est ce que j'avais prévu à l'origine, mais si j'ai besoin de communiquer une valeur de variable ou autre je ne pourrai pas. A moins de faire passer l'info par des fréquences en logique ?
Et pour l'instant ma nano est tjs H.S..
J'avais prévu 1 carte pour le mouvement et une autre pour l'analyse, de sorte qu'il puisse analyser l'environement pendans qu'il effectue une séquence de mouvement.
Parce que du coup, il devient aveugle pendant qu'il effectue un pas, par exemple ?

#46 SRWieZ

SRWieZ

    Membre

  • Membres
  • PipPip
  • 231 messages
  • Gender:Male
  • Location:Evreux, Haute-Normandie, France

Posté 20 juin 2012 - 08:09

Ouais. Il me semble que la cmucam a d'assez bonnes performances pour l'analyse vu qu'elle fais de l'analyse d'image. Elle serais bien en complément de ta carte d'analyse. Il suffit que tu fasse parler tes différentes cartes par une communication série ou I2C (respectivement les librairies Serial et Wire).

Ouvre un nouveau topic avec quelques images, le problème rencontré etc pour voir qu'est-ce qu'a ta nano.

#47 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 08:16

Ouais. Il me semble que la cmucam a d'assez bonnes performances pour l'analyse vu qu'elle fais de l'analyse d'image. Elle serais bien en complément de ta carte d'analyse. Il suffit que tu fasse parler tes différentes cartes par une communication série ou I2C (respectivement les librairies Serial et Wire).

Ouvre un nouveau topic avec quelques images, le problème rencontré etc pour voir qu'est-ce qu'a ta nano.

Ca pourrait etre pas mal, j'ai pas encore fait le tour des possibilités de la cmucam.
Le topic a déjà été ouvert, je suis pas le seul à qui ca arrive : topic

#48 SRWieZ

SRWieZ

    Membre

  • Membres
  • PipPip
  • 231 messages
  • Gender:Male
  • Location:Evreux, Haute-Normandie, France

Posté 20 juin 2012 - 08:24

Si tu as essayé tous ce qu'il y a dans le lien de Black templar qui explique très bien que ce bug peut venir de n'importe quoi alors je te conseil de faire comme tu as dit : http://arduino.cc/en/Tutorial/ArduinoISP

#49 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 08:35

Si tu as essayé tous ce qu'il y a dans le lien de Black templar qui explique très bien que ce bug peut venir de n'importe quoi alors je te conseil de faire comme tu as dit : http://arduino.cc/en/Tutorial/ArduinoISP


C'est ce que je vais faire, pas le choix apparement.

#50 miq75

miq75

    Nouveau membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 20 juin 2012 - 09:59

Selon toi quels éléments manqueraient au langage arduino pour etre aussi efficace que le c++ ?


Dans un langage de programmation, tu a 2 composantes : la syntaxe, c'est la structure qui décrit la programmation (les if/then/else, les boucles, comment définir une variable, etc...) et les bibliothèques, qui sont des collections de fonctions qui représentent l'ensemble de tout ce qui a été écrit génériquement pour faciliter la tache du programmeur avec des outils de haut niveau.

D'après ce que j'ai aperçu du langage arduino, c'est une surcouche de contrôle spécifique aux composants qui s'appuie donc sur la composante syntaxique du c. En gros : le langage arduino, c'est du c minimaliste + une bibliothèque pour les composants arduino. Et c'est tout. Tu n'auras pas les bibliothèques de threads, par exemple.

Le langage c++, c'est au contraire l'accès à tout ce qu'on peut faire en informatique, y compris le plus complexe. Mais pour cela il faudra les bibliothèques correspondantes à tes besoins, donc du c/c++ embarqué sur un linux.

Ce qu'il manque à arduino, c'est donc toutes les bibliothèques standard du c/c++.

#51 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 10:10

Mais ces bibliothèques, on peut les faire soit meme je crois non ? Pas moyen de retranscrir pour arduino ?

#52 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 20 juin 2012 - 10:23

D'après ce que j'ai aperçu du langage arduino, c'est une surcouche de contrôle spécifique aux composants qui s'appuie donc sur la composante syntaxique du c.

Nop, Le langage arduino, c'est bien du C++ ! Mais du C++ bridé !!!
Ils ont par exemple retiré tout ce qui est allocation de mémoire avec new et delete ... (ce qui est débile...)
Par contre, tu peux faire de la POO (je n'ai pas testé les héritages ni les polymorphismes par contre)

Mais ces bibliothèques, on peut les faire soit meme je crois non ? Pas moyen de retranscrir pour arduino ?

Nop !
D'une part, Arduino n'est pas assez puissante pour implémenter toutes les bibliothèques standard du C++.
En plus, l'Atmega, c'est de la programmation séquentielle. Si tu veux faire du multi-threading, tu dois coder une couche qui autorise ce multi-threading (implémentation d'une pile d'appel, fonctions de d'interruption du programme, de mise en mémoire de l'état du processus, etc.). Et là aussi, arduino ,n'est pas vraiment fait pour ça ni assez puissante.

Le mieux, c'est d'utiliser un vrai système conçu de base pour le multi-theading (linux embarqué ?? :P)

Sinon, je suis d'accord avec miq75 ! Si tu veux faire ce genre d'IA, tu devrais maitriser au moins le C sur le bout des doigts, sinon, le C++ et les concepts de programmation orientés objets (POO) !
ça te donnerait en plus une ouverture d'esprit et une façon de pensée indispensable si tu veux faire de l'IA.

++
Black Templar

(P.S. : Sinon, perso, je suis à fond branché programmation orienté agents, ce qui permet d'éviter les problèmes d'inter blocages du au threads, ça permet de faciliter la conception d'un système complexe et de prévenir plus facilement les pannes du aux fautes imprévus)

Mon site internet : http://ferdinandpiette.com/


#53 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 20 juin 2012 - 10:31

Oulalala... J'ai l'impression que vous mélangez tout la !

Alors concernant le C/C++ :
Arduino EST DU C++, vous avez donc acces à toutes les librairies STANDARD C++. Et j'ai bien dis STANDARD, or la libpthread, n'est pas un standard C++ c'est un standard POSIX qui a été implémenté entre autre pour le C++. Or le standard POSIX nécessite un OS qui supporte ce standard.
Comme vous le savez tous, une arduino n'a pas d'OS, donc pas de POSIX, donc pas de libpthread.
Par contre vous aurez accés aux trucs standard de C++ (pratiquement tout il me semble) et la libC.

Concernant maintenant les threads :
Ce que l'on appelle thread ce sont des parties de code indépendantes, qui peuvent se "préempter" les unes les autres (souvent avec des priorités).
Il n'est pas obligé d'utiliser la libpthread pour creer des threads.
Sur un microcontroleur comme arduino, il existe des timers que l'on peut utiliser, ou des interruptions externes. Certaines fonctions sont alors appellées à ce moment la uniquement et on peut appeller ça un thread (car ne faisant pas parti d'une boucle et s'executant sur une interruption).

Perso dans l'arduino j'ai un "thread" principale qui tourne dans la loop() qui fait des trucs, et j'ai un autre thread qui se lance toutes les X millisecondes (sur un reveil de timer) et qui s'execute en mettant en pause la loop.

On a donc 2 parties de codes totalement differentes qui s'executent totalement indépendament. Ce sont donc des threads.


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#54 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 20 juin 2012 - 11:02

Dur de vous suivre^^

Perso dans l'arduino j'ai un "thread" principale qui tourne dans la loop() qui fait des trucs, et j'ai un autre thread qui se lance toutes les X millisecondes (sur un reveil de timer) et qui s'execute en mettant en pause la loop.

C'est justement le problèle, la loop se met en pause.

.....
void led1()
{
led1 alumée;
delay(500);
led1 éteinte;
delay(500);
}

void led2()
{
led2 alumée;
delay(200);
led2 éteinte;
delay(200);
}
....
void loop()
{
led1();
led2();
}

j'ai écrit le prog vite fait, mais en gors voila ce qu'il faudrait, que ce qu'il y a dans la loop s'execute en meme temps, ca a dire que les 2 leds clignotent en meme temps a des fréquences différentes.
or la, il execute d'abord led1(), puis led2().

#55 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 21 juin 2012 - 06:08

j'ai écrit le prog vite fait, mais en gors voila ce qu'il faudrait, que ce qu'il y a dans la loop s'execute en meme temps, ca a dire que les 2 leds clignotent en meme temps a des fréquences différentes.
or la, il execute d'abord led1(), puis led2().


Pour ça, il ne fait pas utiliser de delay, mais des interruptions !

Une interruption toutes les 200ms et l'autre, tous les 500ms.
Tes fonctions liés aux interruptions n'auront qu'a changer l'état de la led.

Mon site internet : http://ferdinandpiette.com/


#56 miq75

miq75

    Nouveau membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 21 juin 2012 - 06:53

Oulalala... J'ai l'impression que vous mélangez tout la !

Alors concernant le C/C++ :
Arduino EST DU C++, vous avez donc acces à toutes les librairies STANDARD C++. Et j'ai bien dis STANDARD, or la libpthread, n'est pas un standard C++ c'est un standard POSIX qui a été implémenté entre autre pour le C++. Or le standard POSIX nécessite un OS qui supporte ce standard.
Comme vous le savez tous, une arduino n'a pas d'OS, donc pas de POSIX, donc pas de libpthread.
Par contre vous aurez accés aux trucs standard de C++ (pratiquement tout il me semble) et la libC.

Merci pour ces éclaircissements, comme je l'ai dit, je n'ai jamais utilisé arduino. Y'a vraiment la STL c++ dessus ?

Concernant maintenant les threads :
Ce que l'on appelle thread ce sont des parties de code indépendantes, qui peuvent se "préempter" les unes les autres (souvent avec des priorités).
Il n'est pas obligé d'utiliser la libpthread pour creer des threads.

C'est tout à fait ça. D'ailleurs il existe d'autres librairies de threads à ce qu'il me semble.

Sur un microcontroleur comme arduino, il existe des timers que l'on peut utiliser, ou des interruptions externes. Certaines fonctions sont alors appellées à ce moment la uniquement et on peut appeller ça un thread (car ne faisant pas parti d'une boucle et s'executant sur une interruption).

Perso dans l'arduino j'ai un "thread" principale qui tourne dans la loop() qui fait des trucs, et j'ai un autre thread qui se lance toutes les X millisecondes (sur un reveil de timer) et qui s'execute en mettant en pause la loop.

On a donc 2 parties de codes totalement differentes qui s'executent totalement indépendament. Ce sont donc des threads.

2 threads, c'est encore gérable "à la main", mais quand on commence à en avoir plus, ça devient vite un vrai casse-tête de gérer entre autres les interblocages.

Mais ces bibliothèques, on peut les faire soit meme je crois non ? Pas moyen de retranscrir pour arduino ?

Autant réinventer la roue, et il n'est pas certain que l'embarqué d'arduino ait des capacités suffisantes pour en réinventer toutes les formes disponibles ailleurs.

#57 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris
  • Interests:Robotics

Posté 21 juin 2012 - 12:59

2 threads, c'est encore gérable "à la main", mais quand on commence à en avoir plus, ça devient vite un vrai casse-tête de gérer entre autres les interblocages.


Oui mais bon, quand on utilise une arduino, je suppose que ce n'est pas pour faire un programme a 100 threads :P


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.


#58 miq75

miq75

    Nouveau membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 21 juin 2012 - 02:10

ben... après, ça dépends ce qu'il entends par "intelligence", hein :Þ

#59 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 21 juin 2012 - 04:31

Pour ça, il ne fait pas utiliser de delay, mais des interruptions !


Ha, je vais pouvoir régler quelques problèmes avec ca^^

Oui mais bon, quand on utilise une arduino, je suppose que ce n'est pas pour faire un programme a 100 threads miq75


C'est sur.. mais je pense utiliser 4 threads. Aprés il n'y a pas que ça qui compte, faut que je structure le programme efficacement..

ben... après, ça dépends ce qu'il entends par "intelligence", hein :Þ


Je pense pas que l'intélligence (adaptation) nécessite beaucoup de threads, nous par exemple, principalement a chaque instant :
-On voit, on entend, etc on utilise les sens, donc les capteurs
-On les traites pour en faire des données symboliques, on les stock en mémoire
-On raisonne : comparer des valeurs symboliques etc
-On est (ou non) en mouvement

Avec un programme de ce type ça devrait deja faire qqch de pas mal. On peut tjs améliorer c'est sur^^

#60 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 22 juin 2012 - 08:01

Bonsoir,

J'ai cherché à compremdre le fonctionnement d'une interuption avec l'exemple dans arduino (blinkwithoutdelay) mais je comprends pas pourquoi les opérations mathématiques sont nécessaires:
/* Blink without Delay
 
 Turns on and off a light emitting diode(LED) connected to a digital  
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.
 
 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.
 
 
 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 
 This example code is in the public domain.

 
 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to 
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

Qelqu'un sait ? Y'a pas d'autres moyens de les écrires ?

Et aussi, comment fait on pour modifier les librairies ? En fait je voudrai pouvoir modérer la vitesse des servo en sacadant rapidement leur course( je leur dit d'aller à l'angle 150 avec plusieurs petits acoups).
Merci ^^

Modifié par ashira, 22 juin 2012 - 08:05 .




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users