Aller au contenu


Photo
- - - - -

Nouveau robot 2WD, avec PID


5 réponses à ce sujet

#1 Tsou'

Tsou'

    Nouveau membre

  • Membres
  • 31 messages
  • Gender:Female

Posté 02 juin 2015 - 11:21

Bonjour/soir,

 

Je reviens faire un tour de ce coté-ci pour un nouveau projet, j'ai mené à terme l'ancien projet (http://www.robot-maker.com/forum/topic/9212-robot-2wd/?view=findpost&p=59985) de manière un peu laborieuse, je n'avais à l'époque pas encore mon imprimante 3D alors la fixation des moteurs, HC-SR04 et de la batterie a donné quelque chose d'assez bancal, le robot est trop lourd en son centre ce qui oriente les roues vers l'intérieur du robot et crée une contrainte au niveau de l'axe moteur, ça roule, mais pas très droit.

 

Vous pouvez voir ici deux photos de l'ancienne réalisation :

http://www.noelshack.com/2015-22-1432514568-p5220200.jpg

http://www.noelshack.com/2015-22-1432514570-p5220202.jpg

 

Je souhaite donc repartir de zéro, avec les nouvelles compétences acquises, et l'imprimante 3D qui pour la partie fixation/mécanique des différentes pièces me sera très utile!

 

Pour ce robot-ci je compte partir sur de l'arduino, la raspberry pi m'ayant quelque peu déçue.

Je me suis un peu inspirée du robot SUPRA de transistance et de ce site-ci pour le PID (http://www.ferdinandpiette.com/blog/2012/04/asservissement-en-vitesse-dun-moteur-avec-arduino/). Je souhaite faire un robot qui soit mieux concu que l'ancien, qui roule droit cette foit-ci, dont le programme serait lui aussi mieux conçu à la base.

J'ai fait une petite liste des diverses choses qui me seront nécessaire, seules celles n'étant pas dans les dépenses supplémentaires sont à prendre en compte. :)

 

1432517104-robot-new.jpg

 

J'ai déjà pu faire une petite ébauche de mon programme, incluant un PID

#include <SimpleTimer.h>
#include <math.h>

const int rightMotorA = 1;
const int rightMotorB = 2;

const int leftMotorA = 3;
const int leftMotorB = 4;

const int rightMotorPWM = 5;
const int leftMotorPWM = 6;

SimpleTimer timer;
unsigned int ticks = 0;

int speedMotor = 2; // à modifier

int freqPID = 50; // fréquence d'exécution du PID

float errorCorrection = 0;
float sumError = 0;
float previousError = 0;

float kp = 0;
float ki = 0;
float kd = 0;

void setup()
{
  Serial.begin(115200);
  
  pinMode(rightMotorA, OUTPUT);
  pinMode(rightMotorB, OUTPUT);
  pinMode(leftMotorA, OUTPUT);
  pinMode(leftMotorB, OUTPUT);
  
  digitalWrite(rightMotorA, LOW);
  digitalWrite(rightMotorB, LOW);
  digitalWrite(leftMotorA, LOW);
  digitalWrite(leftMotorB, LOW);
  
  analogWrite(rightMotorPWM, 0);
  analogWrite(leftMotorPWM, 0);
  
  timer.setInterval(1000/freqPID, PID); // on relance la fonction PID toutes les X ms (ici 1000/50 = 20ms)
  
  delay(2000);

  attachInterrupt(0, count, CHANGE); // à chaque changement d'état on lance count(), qui incrémente le nbre de ticks
}

void loop()
{
  /*Serial.println("Vitesse moteur?");
  int speedMotor = Serial.read();
  timer.setInterval(1000/freqPID, PID(speedMotor)); // on relance la fonction PID toutes les X ms (ici 1000/50 = 20ms)
  Serial.println("Point de destination en X?");
  int posX = Serial.read();
  Serial.println("Point de destination en Y?");
  int posY = Serial.read();
  double directionXY = direction(posX, posY);*/

  timer.run();
  delay(2000);
}

void PID() // fonction s'exécutant toutes les 20ms et remettant ticks à 0, voir time.setInterval
// rajouter argument int speedMotor, pour choisir la vitesse du moteur au démarrage du robot
{
  int freqEncoder = freqPID * ticks; // nombre de ticks par 20 ms ramené au nbre de ticks par seconde
  float speedEncoder = freqEncoder/32/75; /* nbre de ticks par seconde divisé par le nbre de ticks par tour d'axe 
  moteur = nbre de tour d'axe moteur par seconde, divisé par le nombre de tour d'axe moteur par tour de roue = nbre de tours de roue*/
  float error = speedMotor - speedEncoder; // l'erreur est la différence entre la vitesse voulue et la vitesse réelle
  sumError += error;
  float deltaError = error - previousError;
  previousError = error;
  
  errorCorrection = kp * error; // kp est un coeff. de proportionnalité nous permettant d'approcher l'erreur la plus juste
  // errorCorrection = kp * error + ki * sumError;
  // errorCorrection = kp * error + ki * sumError + kd * deltaError;
  
  if (errorCorrection < 0) errorCorrection = 0; // normalisation
  else if (errorCorrection > 255) errorCorrection = 255; // normalisation
  analogWrite(rightMotorPWM, 0 + errorCorrection);
  analogWrite(leftMotorPWM, 0 + errorCorrection);

  ticks = 0; // on remet le nombre de ticks à zéro
}

void count()
{
  ticks++;
}

double direction(int posX, int posY)
{  
  return ((atan2(posX, posY)/0.017453293)-90); /*on considère le robot orienté en direction 0Y 
  et notre plan XY comme centré au milieu de celui-ci, d'axe X à sa droite et d'axe Y à l'avant*/
}

J'aurais tout de même quelques questions,

 

les moteurs que j'ai choisi sont ceux-ci http://www.gotronic.fr/art-motoreducteur-75-1-encodeur-rs003-21384.htm

et mes roues http://www.gotronic.fr/art-roue-qfix-50x21mm-percage-4mm-11836.htm

j'ai comme diverses informations :

Résolution de l'encodeur 16 impulsions/tour (soit 75*16 = 1200 impulsions/tour)
Vitesse à vide : 133tours/min
Tours d'arbre par minute : 9975 (= 133*75)

 

et j'ai pu calculer ceci :

Un tour de roue : rayon = 25mm (=0.025m), périmètre = 2pi*0.025 = 0.15708m = 15.708cm
Distance parcourue : 133*0.15708 = 20.8916m = 2089.16cm
Soit une vitesse de 0.348m/s ou 1.2535km/h

 

Est-ce que mes calculs sont bons? Si oui, la vitesse ne risque pas d'être trop basse? (le robot circulera en intérieur sur un sol plat, voir du carrelage)

Mes encodeurs vont être assez proches (1~2 centimètres), ils sont à effet Hall, je ne risque pas d'avoir des interférences entre les deux?

Niveau capteurs je ne sais pas encore trop ce qu'il est préférable de prendre, pour le moment j'ai des HC-SR04, mais je vois peu de réalisation un peu évoluée qui utilise ce genre de capteurs, ce sont généralement plutôt des Sharp, ou des ultrasons personnalisés, qu'est-ce qu'il vaut mieux?

Je vais faire mon robot en plusieurs étages, ils seront circulaires, mais je ne sais pas encore trop comment il est préférable de les organiser ces étages, roues + contrôle moteurs sur l'étage du bas, batterie Lipo + capteurs + arduino sur le deuxième étage?

Et dernièrement, dans mon programme je ne sais pas comment utiliser les Serial.read/write et passer un argument (int speedMotor) dans ma fonction PID, quand je les mets dans mes fonctions void loop et void setup le compilateur hurle, malheureusement je ne vois pas où je pourrais les mettre autrement? Dans la fonction PID?

 

Edit : après réflexion, il va me faire faire deux PIDs, un pour chaque moteur, je n'y avais pas fait attention

je vais devoir aussi réfléchir à comment gérer la marche arrière du robot, ce PID-ci ne gérerait que la marche avant

Le code a été modifié, il y avait une erreur au niveau du previousError, il allait boucler sur 0 tel que le programme était écrit

 

Merci beaucoup, surtout si vous m'avez lue jusqu'ici ^_^

Bonne journée/soirée!



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 165 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 04 juin 2015 - 12:32

Oula beaucoup de questions en un coup ...

 

 

 

Est-ce que mes calculs sont bons? Si oui, la vitesse ne risque pas d'être trop basse? (le robot circulera en intérieur sur un sol plat, voir du carrelage)

 

 

 

 

Ta méthode de calcul est bonne je n'ai pas refait les calculs mais ils semblent correct .
 Tu ne feras pas un robot de course avec cette vitesse là : c'est une vitesse un petit peu lente à mon gout mais correcte. ( Je préfère pouvoir monter aux alentours des 1m/s minimum en tant que vitesse max. ) par contre au vu du couple de tes moteurs tu peux sans problème prendre une roue avec un diamètre 2 fois plus grand pour aller deux fois plus vite ...

 

 

 

 

Mes encodeurs vont être assez proches (1~2 centimètres), ils sont à effet Hall, je ne risque pas d'avoir des interférences entre les deux?

 

 

 

Normalement non. Le champs magnétique se réduisent fortement avec la distance ... perso j'ai jamais eu ce problème mais si jamais il arrivait quand même tu pourrais ajouter un pièce intermédiaire qui viendrait " casser les intérférences " 

 

 

Niveau capteurs je ne sais pas encore trop ce qu'il est préférable de prendre, pour le moment j'ai des HC-SR04, mais je vois peu de réalisation un peu évoluée qui utilise ce genre de capteurs, ce sont généralement plutôt des Sharp, ou des ultrasons personnalisés, qu'est-ce qu'il vaut mieux?

 

 

 

 

Les HC -SR04 sont parfait pour commencer surtout si tu en as déjà. et vu leur pris tu peux facilement en acquérir plusieurs ou plus ... et faire " Une ceinture de capteur" ça marche bien ;) très bien : testé et approuvé sur deux robots ( une ceinture de 7 et une ceinture de 8 capteurs )

 

 

Je vais faire mon robot en plusieurs étages, ils seront circulaires, mais je ne sais pas encore trop comment il est préférable de les organiser ces étages, roues + contrôle moteurs sur l'étage du bas, batterie Lipo + capteurs + arduino sur le deuxième étage?

 

 

 

 

Quelques conseils : 

  • mettre le plus lourd le plus bas possible ( en général les batterie ) 
  • essayer de réduire le nombre de file qui passe d'un étage à l'autre 
  • Disposer les capteurs US pas trop près du sol ... ( et mettre la arduino au même étage que le maximum de capteurs )

Voilà, bonne journée !


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Tsou'

Tsou'

    Nouveau membre

  • Membres
  • 31 messages
  • Gender:Female

Posté 04 juin 2015 - 03:47

Oula beaucoup de questions en un coup ...

 

 

Ta méthode de calcul est bonne je n'ai pas refait les calculs mais ils semblent correct .
 Tu ne feras pas un robot de course avec cette vitesse là : c'est une vitesse un petit peu lente à mon gout mais correcte. ( Je préfère pouvoir monter aux alentours des 1m/s minimum en tant que vitesse max. ) par contre au vu du couple de tes moteurs tu peux sans problème prendre une roue avec un diamètre 2 fois plus grand pour aller deux fois plus vite ...

 

 
 

 

Normalement non. Le champs magnétique se réduisent fortement avec la distance ... perso j'ai jamais eu ce problème mais si jamais il arrivait quand même tu pourrais ajouter un pièce intermédiaire qui viendrait " casser les intérférences " 

 
 

 

Les HC -SR04 sont parfait pour commencer surtout si tu en as déjà. et vu leur pris tu peux facilement en acquérir plusieurs ou plus ... et faire " Une ceinture de capteur" ça marche bien ;) très bien : testé et approuvé sur deux robots ( une ceinture de 7 et une ceinture de 8 capteurs )

 

 

 

Quelques conseils : 

  • mettre le plus lourd le plus bas possible ( en général les batterie ) 
  • essayer de réduire le nombre de file qui passe d'un étage à l'autre 
  • Disposer les capteurs US pas trop près du sol ... ( et mettre la arduino au même étage que le maximum de capteurs )

Voilà, bonne journée !

 

Oui effectivement, j'aime bien réfléchir à mon projet, essayer de voir ce qui ne pourrait pas aller et ensuite venir poser mes questions, ça en fait beaucoup d'un coup mais c'est plus simple ^_^

 

Effectivement je n'avais pas vu qu'avec ce diamètre de roue je n'obtiendrais jamais une vitesse correcte, sur le site Pololu j'ai pu voir que le moteur montait à 160RPM à 7,2V, ce qui n'est quand même pas suffisant, donc j'ai cherché et j'ai deux solutions :

Soit je prends des roues de 80mm, je monte donc à une vitesse de 0.67m/s, on est encore un peu loins des 1m/s mais je n'ai pas vraiment idée de ce que ça représente. (http://www.gotronic.fr/art-paire-de-roues-noires-pololu-80-x-10-mm-22282.htm et http://www.gotronic.fr/art-paire-de-moyeux-alu-1997-21780.htm). J'en aurais pour 17,70€ soit 4€ de moins que celles prévues initialement, et avec des moyeux universels.

L'autre choix serait de prendre les roues prévues pour les moteurs, qui sont tout-terrain, de 120mm de diamètre http://www.gotronic.fr/art-roue-tout-terrain-120-mm-dg3cr-12401.htm, on monte alors à 3km/h soit 0.8333m/s. Celles-ci sont à 13€, soit 8€ de moins que celles prévues initialement. Avec le désavantage d'avoir un robot d'intérieur avec de grosses roues tout-terrain.

Je me tâte donc encore, je me dis que les premières seront plus adaptées à l'intérieur.

 

Je n'y avais pas pensé, mais un simple bout d'alu entre les deux couperait toute interférence, à voir si ce sera le cas.

 

Tu fais comment pour gérer la dynamique de ton robot avec une ceinture de 8 HC-SR04?

Quelque chose comme :

Avancer tant que distance > 15 cm

Si distance < 15 cm : ralentir
   évaluer le capteur ayant un obstacle le plus éloigné et se diriger vers cette direction

Si distance < 10 cm : stoper

?

Il serait peut-être préférable de mettre les HC-SR04 non pas comme à leur habitude horizontalement mais verticalement? Histoire d'éviter qu'un pied de table ou un objet peu large soit non détecté? (Puis il y aurait un gain de place...)

Après, je pensais mettre des servos mais dans ce cas-ci j'ai l'impression que ça va m'être inutile, tu en as sur tes bestioles toi?

 

En tous cas un grand merci pour tes réponses, je pense que je vais pouvoir passer ma commande d'ici peu. :D



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 165 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 04 juin 2015 - 10:52

 

Oui effectivement, j'aime bien réfléchir à mon projet, essayer de voir ce qui ne pourrait pas aller et ensuite venir poser mes questions, ça en fait beaucoup d'un coup mais c'est plus simple ^_^

 

Effectivement je n'avais pas vu qu'avec ce diamètre de roue je n'obtiendrais jamais une vitesse correcte, sur le site Pololu j'ai pu voir que le moteur montait à 160RPM à 7,2V, ce qui n'est quand même pas suffisant, donc j'ai cherché et j'ai deux solutions :

Soit je prends des roues de 80mm, je monte donc à une vitesse de 0.67m/s, on est encore un peu loins des 1m/s mais je n'ai pas vraiment idée de ce que ça représente. (http://www.gotronic.fr/art-paire-de-roues-noires-pololu-80-x-10-mm-22282.htm et http://www.gotronic.fr/art-paire-de-moyeux-alu-1997-21780.htm). J'en aurais pour 17,70€ soit 4€ de moins que celles prévues initialement, et avec des moyeux universels.

L'autre choix serait de prendre les roues prévues pour les moteurs, qui sont tout-terrain, de 120mm de diamètre http://www.gotronic.fr/art-roue-tout-terrain-120-mm-dg3cr-12401.htm, on monte alors à 3km/h soit 0.8333m/s. Celles-ci sont à 13€, soit 8€ de moins que celles prévues initialement. Avec le désavantage d'avoir un robot d'intérieur avec de grosses roues tout-terrain.

Je me tâte donc encore, je me dis que les premières seront plus adaptées à l'intérieur.

 

Je n'y avais pas pensé, mais un simple bout d'alu entre les deux couperait toute interférence, à voir si ce sera le cas.

 

Tu fais comment pour gérer la dynamique de ton robot avec une ceinture de 8 HC-SR04?

Quelque chose comme :

Avancer tant que distance > 15 cm

Si distance < 15 cm : ralentir
   évaluer le capteur ayant un obstacle le plus éloigné et se diriger vers cette direction

Si distance < 10 cm : stoper

?

Il serait peut-être préférable de mettre les HC-SR04 non pas comme à leur habitude horizontalement mais verticalement? Histoire d'éviter qu'un pied de table ou un objet peu large soit non détecté? (Puis il y aurait un gain de place...)

Après, je pensais mettre des servos mais dans ce cas-ci j'ai l'impression que ça va m'être inutile, tu en as sur tes bestioles toi?

 

En tous cas un grand merci pour tes réponses, je pense que je vais pouvoir passer ma commande d'ici peu. :D

 

 

Alors, perso j'aime bien pouvoir monter à 1m/s mais perso j'ai commencé en allant beaucoup plus doucement et avec des moteurs pas à pas ^^ 
Après, tant que tu auras pas fais différents tests tu pourras pas vraiment voir ce que ça représente etc...  En fonction de ton application  0,6 m/s peut être tout à fait correcte. 

Par contre je te déconseille les roues "extérieur" si ton robot est exclusivement fait pour de l'intérieur... tu risque d'être très déçu par le résultat. 

Des roues de 80 mm de diamètre me semble pas mal ( perso c'est ce que j'ai utilisé sur mes derniers robots : http://www.gotronic.fr/art-paire-de-roues-noires-pololu-80-x-10-mm-22282.htm  ça adhère bien sur les tables de la coupe de france de robotique ^^ par contre les moyeux associées pour aller avec les moteur sont dessiné et usiné de manière perso ;)

 

Concernant les ultrasons, tout dépend de ce que tu veux faire : perso j'ai des ceinture d'ultrasons mais les deux robots en question sont " omnidirectionnel " avec des roues moto-directrices . 

 

Tu peux en avoir que trois orienté vers l'avant et trois vers l'arrière par exemple ... 
Ensuite oui tu peux sans problème monter les ultrasons à la vertical. 

Concernant les servo moteur le robot principal de la coupe de france en utilisait pas mal ^^ 12 pour 12 pinces et 4 pour des " tourelles sur lesquels des sharp sont montés. 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#5 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 04 juin 2015 - 12:43

Salut !

Pour les capteurs ultrasons, je me souviens avoir lu qu'il vallait mieux les monter verticalement parce que leur champ récepteur étant assez large, la mesure n'est pas très précise horizontalement, et avoir une précision horizontale est plus important qu'une précision verticale. Je ne retrouve pas la source, donc c'est à prendre avec des pincettes.

Dans un cas comme dans l'autre, une manière d'intégrer les capteurs dans le calcul de la vitesse des roues est la manière des véhicules de Braitenberg : en faisant, pour chaque moteur, une somme pondérée des distances mesurées par les capteurs, on déduit la commande élégamment, sans besoin de fixer un seuil explicitement (ce qui n'est pas très robuste à des environnements et vitesses variés).
L'idée est que l'angle du capteur va déterminer comment il influence la vitesse. Exemple : un capteur orienté en face à droite mesure une grande distance. On veut que notre robot évite les directions encombrées, donc se dirige vers des espaces ouverts. Grande distance <=> direction libre, donc cette information doit contribuer à ramener le robot face à cette direction. On ajoute donc la mesure à la valeur qui détermine la vitesse de la roue gauche et on diminue légérement la valeur pour la roue droite, ce qui provoque une rotation du robot dans cette direction. En sommant l'influence des différents capteurs pondérés (par +/-1 pour commencer, en affinant les valeurs si besoin), on peut créer un comportement d'évitement d'obstacles assez fluide. Ca se généralise à d'autres capteurs, de lumière par exemple.
Et ça évite de devoir définir un seuil arbitrairement, dont la valeur ne sera plus vraiment pertinente à haute vitesse, et qui fasse passer le robot d'un comportement à l'autre brutalement.

J'avais implémenté ce principe sur mon robot, mais avec un seul capteur pour faire plusieurs mesures, ça n'était pas optimal. Avec deux capteurs (ou plus) fixé, ça doit marcher bien mieux !

R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#6 Tsou'

Tsou'

    Nouveau membre

  • Membres
  • 31 messages
  • Gender:Female

Posté 04 juin 2015 - 06:48

Alors, perso j'aime bien pouvoir monter à 1m/s mais perso j'ai commencé en allant beaucoup plus doucement et avec des moteurs pas à pas ^^ 
Après, tant que tu auras pas fais différents tests tu pourras pas vraiment voir ce que ça représente etc...  En fonction de ton application  0,6 m/s peut être tout à fait correcte. 

Par contre je te déconseille les roues "extérieur" si ton robot est exclusivement fait pour de l'intérieur... tu risque d'être très déçu par le résultat. 

Des roues de 80 mm de diamètre me semble pas mal ( perso c'est ce que j'ai utilisé sur mes derniers robots : http://www.gotronic.fr/art-paire-de-roues-noires-pololu-80-x-10-mm-22282.htm  ça adhère bien sur les tables de la coupe de france de robotique ^^ par contre les moyeux associées pour aller avec les moteur sont dessiné et usiné de manière perso ;)

 

Concernant les ultrasons, tout dépend de ce que tu veux faire : perso j'ai des ceinture d'ultrasons mais les deux robots en question sont " omnidirectionnel " avec des roues moto-directrices . 

 

Tu peux en avoir que trois orienté vers l'avant et trois vers l'arrière par exemple ... 
Ensuite oui tu peux sans problème monter les ultrasons à la vertical. 

Concernant les servo moteur le robot principal de la coupe de france en utilisait pas mal ^^ 12 pour 12 pinces et 4 pour des " tourelles sur lesquels des sharp sont montés. 

 

Ah bah merci du retour, je pars sur les roues pololu sans hésitations alors! :) Si en plus elles adhèrent bien et qu'elles ont déjà été éprouvées, c'est le mieux. Pour les moyeux je vais avoir du mal à faire ça, je n'ai rien pour les usiner, puis je me dis qu'avec ceux-là si jamais je dois changer de roues j'aurai quelque chose de tout pret.

 

Je vais quand meme me prendre quelques servos, ne fut-ce que si jamais je souhaite comme vous monter un bras sur mon petit robot, ce ne sera pas perdu.

 

Salut !

Pour les capteurs ultrasons, je me souviens avoir lu qu'il vallait mieux les monter verticalement parce que leur champ récepteur étant assez large, la mesure n'est pas très précise horizontalement, et avoir une précision horizontale est plus important qu'une précision verticale. Je ne retrouve pas la source, donc c'est à prendre avec des pincettes.

Dans un cas comme dans l'autre, une manière d'intégrer les capteurs dans le calcul de la vitesse des roues est la manière des véhicules de Braitenberg : en faisant, pour chaque moteur, une somme pondérée des distances mesurées par les capteurs, on déduit la commande élégamment, sans besoin de fixer un seuil explicitement (ce qui n'est pas très robuste à des environnements et vitesses variés).
L'idée est que l'angle du capteur va déterminer comment il influence la vitesse. Exemple : un capteur orienté en face à droite mesure une grande distance. On veut que notre robot évite les directions encombrées, donc se dirige vers des espaces ouverts. Grande distance <=> direction libre, donc cette information doit contribuer à ramener le robot face à cette direction. On ajoute donc la mesure à la valeur qui détermine la vitesse de la roue gauche et on diminue légérement la valeur pour la roue droite, ce qui provoque une rotation du robot dans cette direction. En sommant l'influence des différents capteurs pondérés (par +/-1 pour commencer, en affinant les valeurs si besoin), on peut créer un comportement d'évitement d'obstacles assez fluide. Ca se généralise à d'autres capteurs, de lumière par exemple.
Et ça évite de devoir définir un seuil arbitrairement, dont la valeur ne sera plus vraiment pertinente à haute vitesse, et qui fasse passer le robot d'un comportement à l'autre brutalement.

J'avais implémenté ce principe sur mon robot, mais avec un seul capteur pour faire plusieurs mesures, ça n'était pas optimal. Avec deux capteurs (ou plus) fixé, ça doit marcher bien mieux !

 

Suivant tes conseils j'ai fait un petit truc :

 

5 capteurs
-60° -30° 0° +30° +60°
premier capteur : cos(-60°) * distanceMesuree1 = -0.5 * distanceMesuree1
deuxième capteur : cos(-30°) * distanceMesuree2 = -0.866 * distanceMesuree2
troisième capteur : 0 * distanceMesuree3
quatrième capteur : cos(30°) * distanceMesuree4 = 0,866 * distanceMesuree4
cinquième capteur : cos(60°) * distanceMesuree5 = 0.5 * distanceMesuree5

équation globale : (-0.5 * distanceMesuree1 + -0.866 * distanceMesuree2 + 0 * distanceMesuree3 + 0,866 * distanceMesuree4 + 0.5 * distanceMesuree5)/(somme des distances)

 

J'ai fait de petits tests :

 

tests-capteurs-ultrason.jpg

 

Au départ je ne mettais pas le troisième capteur (celui frontal) à 0 mais à cos(0°) soit 1, mais je n'arrivais pas à des résultats qui me permettaient de savoir dans quelle direction me diriger, ici un résultat négatif = aller vers la droite.

C'est bien ça que tu me conseillais? :)

(Après j'ai encore un peu de temps, le temps de commander les pièces, monter le tout et d'abord mettre en place le PID, mais ainsi c'est fait)

 

Merci beaucoup à vous deux pour vos retours!





Répondre à ce sujet



  


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

0 members, 1 guests, 0 anonymous users