Aller au contenu


Photo
- - - - -

Mini Tank - Suiveur de ligne avec HuskyLens


18 réponses à ce sujet

#1 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 13 janvier 2022 - 12:38

Voici une nouvelle application pour mon Mini Tank. Il s'agit d'un suiveur de ligne avec un HuskyLens.

J'ai fait l'impasse sur le PID, j'ai fait à mon idée et au final avec moins de 25 lignes de code, je ne suis pas mécontent du résultat.

Qu'en pensez-vous ?

 

 



#2 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 997 messages
  • Gender:Male

Posté 13 janvier 2022 - 01:58

Sympas.

 

Par contre, j'ai l'impression que ton asservissement se fait sur un point loin devant le robot (le milieu de l'image?, sachant que la caméra pointe déjà vers l'avant). Du coup, le tank coupe énormément les virages.

 

Je penses que tu obtiendrais un meilleur résultat en pointant la caméra vers le bas (voir légèrement vers le robot), voir même en la plaçant sous le robot. Si jamais il y a moyen de récupérer l'emplacement de la ligne en bas de l'écran plutôt qu'au milieu, ça aiderait aussi (mais pas sur que ton algo de détection de ligne le permette, sinon il faudrait récupérer les pixels de la ligne du bas et toi même y chercher le "pic" de noir).



#3 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 13 janvier 2022 - 03:15

Du coup, le tank coupe énormément les virages.

Oui, c'est bien vu, Sandro.

 

On peut aussi considérer que Mini Tank optimise la trajectoire. C'est un choix.

J'ai fait le test avec la caméra plus parallèle au sol. C'était avec un ligne assez fine, tracée au feutre. La trajectoire était parfaite.

Par contre, pour la vidéo, j'ai fait la ligne au scotch noir et j'ai eu l'idée de faire un angle droit. Là, il a fallu relever le nez pour optimiser la trajectoire.

On ne peut pas tout avoir.

 

Mais il y a une phase d'apprentissage avec l'UskyLens que je n'ai pas vraiment peaufiné. Je pense que l'on doit assez facilement améliorer le suivi de ligne.

Mon idée avec le Mini Tank, c'est de faire des applications rapidement, comme la radiocommande, et ici le suivi de ligne, pour l'appliquer à mon quadrupède.

Avec mon quadrupède, je vais sans doute découvrir encore d'autres inconvénients et sans doute peu d'avantage.

En tout cas, je pense que l'optimisation de la trajectoire devrait être plus adapté. Cela bouge beaucoup, un quadrupède.

 

Mettre la caméra sous le quadrupède n'est pas un problème car l'HuskyLens a 2 leds blanches destinées à l'éclairage, spécifiquement pour l'application de suivi de ligne.

On les voit bien dans la vidéo.



#4 dakota99

dakota99

    Nouveau membre

  • Membres
  • 65 messages

Posté 23 janvier 2022 - 08:56

Salut Oracid,

Super le mini tank :)

Je me sers aussi d'une camera Huskylens pour guider le robot sur des cibles (codes barres imprimés au format A4)

On obtient des résultats assez rapides avec cette camera.



#5 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 23 janvier 2022 - 09:19

On obtient des résultats assez rapides avec cette camera.

C'est vrai, mais quelque soit la caméra, je ne comprends pas comment j'obtiens ce résultat sans PID.



#6 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é 23 janvier 2022 - 09:44

C'est vrai, mais quelque soit la caméra, je ne comprends pas comment j'obtiens ce résultat sans PID.

Faudrait que je vérifie en lisant ton code mais je suppose que tu as fait l'équivalent d'un asservissement proportionnel, (P = un PID sans le I et sans le D, coefficient mis à 0 )

Souvent les gens parlent de PID alors qu'ils font que du P =). 
Le fait que la caméra regarde un peu vers l'avant permet de ne pas avoir besoin de trop de D. ( dérivé )
L'intégrale se verrait un peu plus si tu trace une très longue ligne droit. Met le un peu en travers devant la ligne et regarde si il ne fait que osciller autour de la ligne ou si il arrive à suivre parfaitement la ligne sans osciller du tout et au bout de combien de temps :) 

Après il n'existe pas que le PID pour faire de l'asservissement =)


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 ! 

 

Les réalisations de Mike118  

 

 

 


#7 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 24 janvier 2022 - 08:51

Voici le code. Il fait 25 lignes, tout mouillé.
Le plus important ce sont les 2 lignes, comme indiqué dans la vidéo à 4'38".
 

// 12/01/2022 - MiniTank line tracking with HuskyLens
#include "HUSKYLENS.h"
#include <Servo.h>
Servo sR,sL;                        // right servo and left servo
int R, L;                           // right servo value, left servo value
HUSKYLENS huskylens; int ID1=1;     // HuskyLens objet
 
void setup() {
  Serial.begin(9600);
  pinMode(0,INPUT_PULLUP);          // start/stop button attachment
  sR.attach(3); sR.write(90);       // right servo initialization
  sL.attach(4); sL.write(90);       // left servo initialization
 
  Wire.begin();                     // I2C
  while (!huskylens.begin(Wire)) {Serial.print("\n Check I2C"); delay(100);}
  huskylens.writeAlgorithm(ALGORITHM_LINE_TRACKING); //Switch the algorithm to line tracking.
 
  Serial.print("\n\t To start, click on the Start button"); while( digitalRead(0) ); delay(400);
}
 
void loop() {
  huskylens.request(ID1);
  HUSKYLENSResult result = huskylens.read();
  int err = map(result.xTarget,0,320,-90,90);                 // getting and maping error
  if ( err < 0) { L=0-err; R=180; } else { L=0; R=180-err; }  // error makes turning left or right
  sR.write(R);  sL.write(L);                                  // right and left servos orders
}

 

Voici une version légèrement plus sophistiquée avec 2 lignes supplémentaires. (sans tenir compte du soft reset)

Je l'ai fait suite à la remarque de Sandro.

En mettant la caméra à l'horizontale, cette version "colle" très bien à la ligne dans un sens, mais loupe l'angle droit dans l'autre sens.

Ceci dit, dans un concours, les robots ne tournent le plus souvent que dans un sens, et il y a rarement des angles droits.

 

// 16/01/2022 - MiniTank line tracking with HuskyLens
#include <HUSKYLENS.h>
#include <Servo.h>
void(* resetFunc) (void) = 0;       // soft reset function
Servo sR,sL;                        // right servo and left servo
int R, L, d;                        // right servo value, left servo value
HUSKYLENS huskylens; int ID1=1;     // HuskyLens objet
 
void setup() {
  delay(400);                       // for soft reset consideration
  Serial.begin(9600);
  pinMode(0,INPUT_PULLUP);          // start/stop/reset button attachment
  sR.attach(3);sR.write(90);        // right servo initialization
  sL.attach(4);sL.write(90);        // left servo initialization
  Wire.begin();
  while (!huskylens.begin(Wire)) {Serial.print("\n Check I2C"); delay(100);}
  huskylens.writeAlgorithm(ALGORITHM_LINE_TRACKING); //Switch the algorithm to line tracking.
  Serial.print("\n\t To start, click on the Start button"); while( digitalRead(0) ); delay(400);
}
 
void loop() {
  if (! digitalRead(0)) resetFunc();
  huskylens.request(ID1);
  if(!huskylens.available()){if ( d=='R' ) { sL.write(0);  sR.write(0);   return;}} // turning right
  if(!huskylens.available()){if ( d=='L' ) { sL.write(180);sR.write(180); return;}} // turning left
  HUSKYLENSResult result = huskylens.read();
  int err=map(result.xTarget,0,320,-90,90);                                   // getting and maping error
  if ( err < 0) { L=0-err; R=180; d='L'; }  else  { L=0; R=180-err; d='R'; }  // error makes turning left or right
  sL.write(L);  sR.write(R);                                                  // left and right servos order
}


#8 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é 24 janvier 2022 - 08:39

donc c'est bien un proportionnel :) 
tu réduis la vitesse d'une des roues proportionnellement à l'erreur observée.

Je pense que si tu mets ton char sur une longue ligne droite il va sens cesse zigzaguer autour de la ligne et pas la suivre en allant tout droit.

Cela n'en reste pas moins un suiveur de ligne qui fonctionne =)


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 ! 

 

Les réalisations de Mike118  

 

 

 


#9 dakota99

dakota99

    Nouveau membre

  • Membres
  • 65 messages

Posté 24 janvier 2022 - 08:43

Merci pour ce code qui est impressionnant de compacité et apparemment très efficace.



#10 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 24 janvier 2022 - 09:27

donc c'est bien un proportionnel :) 

Du coup, j'ai bien compris le tier de la solution. Je vais essayer d'aller plus loin, juste pour ma satisfaction personnelle.

J'essayerai la ligne droite, mais d'ici là, je vais peut-être faire une vidéo avec la deuxième version.

 

Merci dakota99. Oui, je vise toujours la compacité. Je sais que vais à contre courant, et que l'orthodoxie c'est une instruction par ligne, mais je pars du principe que moins il y a de lignes et plus c'est lisible.

L'oeil, le cerveau à une vue d'ensemble. Lorsque des instructions sont liées fonctionnellement, je les regroupe sur une même ligne. 



#11 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é 24 janvier 2022 - 11:36

Un correcteur proportionnel : 

c'est correction = Kp * erreur   ( cette opération toi elle se fait dans le "map " )


Un correcteur dérivé, on prend en compte l'erreur précédente : 

correction = Kd * (erreur -  erreur précédente)       ( en gros si on voit que l'erreur diminue alors par anticipation on commence à réduire la correction et au contraire si ça augmente par anticipation on corrige plus, mais il faut bien ajuster le kd ) 

 

 

Un correcteur intégral prend en compte la somme des erreurs au fil du temps si tu numérotes toutes les erreurs erreur0 erreur1 etc ... depuis le début tu peux noter intégrale = erreur0 + erreur1  + ..... + erreurn 

et correction = Ki * intégral 

Ce genre de correction permet entre autre de compenser le fait qu'une roue tourne malheureusement un peu plus vite qu'une autre pour une consigne " non asservie " où tu voudrais aller en ligne droite ...

 

 

 

un ¨PID c'est faire 

 

correction = Kp * erreur + Ki * intégrale + Kd *( erreur - erreur précédente)

Après tu peux aussi bien faire toi même les calculs, qu'utiliser des librairies qui le font pour toi ... 

 

Enfin une fois que tu mets les doigts dedans il y a plein d'autre paramètre " d'ajustement " qui peuvent être fait. Comment calculer l'intégrale ( au lieu de le faire depuis le début que le faire sur les N dernières mesures) brider la correction avec des min et max ( ce que ne fait pas le map ) , remettre à zero le terme intégrale à chaque changement de consigne ... Imbriquer différents asservissements, pour un servomoteur tu peux avec un asservissement en position, qui intègre un asservissement en vitesse et qui intègre un asservissement en courant (/ couple du moteur ) comme ce que fait pat92fr =) 

 


 


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 ! 

 

Les réalisations de Mike118  

 

 

 


#12 dakota99

dakota99

    Nouveau membre

  • Membres
  • 65 messages

Posté 25 janvier 2022 - 07:28

Super. Merci Mike118 pour ces explications.

Je ne suis pas sûr de tout comprendre :) mais je pense devoir en tenir compte car mon mobile aussi oscille le long d'une trajectoire et c'est pas très élégant et efficace.

Je vais essayer d'appliquer ta théorie à un exemple concret pour y voir plus clair.



#13 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 25 janvier 2022 - 08:13

Merci Mike. Il va falloir qu'un jour j'intègre ça.

J'avais déjà étudié tout ça, il y a quelques années, mais sans succès. Mon suiveur de ligne avait plutôt l'air d'un ramasse miettes.

 

Je pense qu'avec l'HuskyLens, c'est plus simple, car il indique les coordonnées de l'extrémité de la flèche qui suit la ligne.

Alors qu'avec un capteur, c'est à toi de calculer ces coordonnées. Il y a, là, une grande possibilité d'erreur. 

A mon avis, c'est sur ce point que l'HuskyLens apporte un énorme avantage.



#14 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 25 janvier 2022 - 01:46

Je pense que si tu mets ton char sur une longue ligne droite il va sens cesse zigzaguer autour de la ligne et pas la suivre en allant tout droit.

J'ai testé une ligne droite d'environ 5m. En fait un joint de mon carrelage.

Et bien, pas de problème, le petit char va tout droit sans aucune hésitation.



#15 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté 25 janvier 2022 - 09:01

Dans cette vidéo, je montre comment suivre une ligne au plus près.

L'idée, c'est de continuer la courbure courante, mais cela ne fonctionne pas avec un angle droit vers la gauche, alors que l'on vient de tourner à droite.

 

Le problème à l'origine est que le HuskyLens le voit pas les lignes horizontales.

 



#16 dakota99

dakota99

    Nouveau membre

  • Membres
  • 65 messages

Posté 25 janvier 2022 - 09:20

Le mouvement est assez fluide.

On ne se lasse pas de le regarder ce petit robot :)



#17 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 997 messages
  • Gender:Male

Posté 25 janvier 2022 - 09:52

Bonsoir,

c'est moi, où l'écran "tremble" beaucoup plus en ligne droite qu'en virage?

 

Si oui, je soupçonne que c'est du as des oscillations gauche-droite du robot. Si c'est ça, alors tu peux réduire ces oscillations soit en réduisant le coefficient "proportionnel" (ie remplacer +-90 dans le map par quelque chose de plus petit), soit en rajoutant un terme "dérivé".

À noter que si tu réduis le terme proportionnel, tu sera moins réactif lors de changements de direction rapide, donc je penses que le mieux serait de rajouter du dérivé (cf post de mike sur le PID)



#18 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é hier, 01:43

En tout cas il est déjà super comme ça ce robot =) 

Je vais peut être voir pour ajouter cette caméra à la boutique =)


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 ! 

 

Les réalisations de Mike118  

 

 

 


#19 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 844 messages
  • Gender:Male

Posté hier, 08:50

c'est moi, où l'écran "tremble" beaucoup plus en ligne droite qu'en virage?

Oui, j'ai noté également. Je pense que tout bêtement, c'est dû aux crampons des chenilles. Mais ça peu également être un problème d'effet stroboscopique lié à ma caméra de prise de vue.

 

Pour aller plus loin, il faudrait aller plus vite, chose que je ne peux pas faire avec ce Mini Tank.

J'ai regardé quelques vidéos sur le sujet et à part le fait que j'utilise une caméra intelligente, ma réalisation n'apporte pas grand chose à la discipline du "Suiveur de ligne" qui a énormément progressée. Aujourd'hui, on est loin, très loin de ce que j'ai vu à la dernière TRR.

 

Ma contribution pourrait être de monter l'HuskyLens sur mon quadrupède pour en faire un suiveur de ligne pour la prochaine TRR.

 

Regardez, et notez que dans ces 2 vidéos, il n'y a pas d'angle droit.

 

 

Notez que le YouTuber s'apelle "Robot Makers".





Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users