Aller au contenu


pat92fr

Inscrit(e) (le) 04 août 2020
Déconnecté Dernière activité avril 28 2025 06:23
-----

#121420 Naissance de mon suiveur de ligne

Posté par pat92fr - 26 septembre 2024 - 12:15

Quand tu régles ton PID, est-ce que tu suis ce genre de méthode et est-ce que le comportement de ton robot est similaire à cette vidéo :

 

http://youtu.be/mjr5NwH0dH4?si=m2v9JNaAnwomaT7U

 

et aussi :

 

http://youtu.be/0sqT5LPRjic?si=8SPrNUoIzXMaE_IZ&t=72




#121402 Naissance de mon suiveur de ligne

Posté par pat92fr - 24 septembre 2024 - 12:30

Mon dernier suiveur de ligne pèse 100g et utilise des 1:5 et des 1:10 (de mémoire en 1:5, l'asservissement était très difficile à régler). Sans les modules Wifi et Bluetooth et les winglets de détection de marqueur de changement du rayon de courbure, il doit peser 90g voire moins. Ca doit jouer sur les besoins en couple moteur.

Image(s) jointe(s)

  • 20240924_130340.jpg



#121362 Naissance de mon suiveur de ligne

Posté par pat92fr - 20 septembre 2024 - 11:18

L'idée est d'atteindre la vitesse maximale en ligne droite, et de faire ralentir le robot dans les virages de manière automatique , jusqu'à une consigne permettant de négocier les virages les plus serrés, sans apprentissage préalable du circuit. Je fais ca sur tous mes robots Suiveur de ligne et TRR. Ca fait un Kp supplémentaire à régler ! Facile à régler de base : Kp = (VitesseMax-VitesseMin)/ErreurPositinLigneMax. Apres tu ajustes pour obtenir les meilleures performances avec le robot et le circuit. On obtient : VitesseConsigneActuelle = VitesseMaximale - Kp x | Erreur Position Ligne acutelle |. En pratique, il faut filtrer un peu, je te livre le principe de fonctionnement en quelques lignes.

 

Une fois que tu es à la limite des performances de ton robot en mode 'découverte', il faut travailler la capacité d'"apprentissage" pour améliorer les performances d'un tour à l'autre...




#121356 Naissance de mon suiveur de ligne

Posté par pat92fr - 20 septembre 2024 - 07:04

Bonjour,

 

Merci pour la vidéo ! Ca commence à rouler ! :-)

 

Voici mes conseils du jour :

- pose ton smartphone (ou ta caméra de manière à filmer le robot arriver et passer le premiers virages

- filme à 120 images seconde.

- analyse les ralentis du robot sur la ligne droite et sur les deux premiers virage en priorité.

 

Pour faire le chrono :

- batterie chargée à 100%,

- nettoyage des roues au rouleau adhésif anti-poils de chats/chients.

 

Points positifs :

- La vitesse en virage est intéressante. 

- L'asserv en boucle ouverte fonctionne.

- Les roues ont l'air très bien pour ce niveau de performances (ne change pas les roues pour le moment (ni diamètre ni matière)).

 

Points négatifs :

- La vitesse max en ligne droite doit être améliorée,

- L'accélération en ligne droite doit être améliorée,

- L'asserv en boucle ouverte doit être améliorée,

- L'asserv en boucle fermée en ligne droite n'est pas réglée (les oscillations ne s'atténuent pas),

- L'asserv en boucle fermée en virage manque (beaucoup) d'efficacité (entre deux virages exécutés en PID boucle ouverte, le PID virage n'arrive pas à stabiliser le robot).

 

Questions & Pistes d'amélioration :

- Augmenter le gain de l'asserv en boucle ouverte (puissance max sur la roue extérieure, frein max sur la roue intérieur) ---> Le nez ne doit pas complètement sortir de la ligne, sauf au premier virage en sortie de ligne droite.

- Augmenter la vitesse linéaire : alléger, changer les moteurs

- Augmenter l'accélération linéaire du robot. La limite est simple à trouver : le nez doit légèrement se soulever au départ arrété. Tu pourras alors installer des barres anti-wheeling et/ou coder une procédure de launch-control pour le départ arrété. Objectif : 10 m/s².

- La command de PWM est mise à jour à quelle fréquence ?

- Les PID tournent à quelle cadence ? 

- Tu as combien de mesures par seconde pour la position de la ligne droite ? Quelle quantification ?

- Tu as combien de mesures par seconde de vitesse des moteurs ? Quelle quantification (?

 

Essais :

- fais tourner ton robot en continue pour le régler (à distance) et code la fonction de compensation de la commande des gaz en fonction de la tension batterie. Ca signifie augmenter la valeur de PWM lorsque la tension de la batterie baisse au fil des tours.




#121350 Naissance de mon suiveur de ligne

Posté par pat92fr - 19 septembre 2024 - 07:28

Bonjour,

 

Un Kd sur une commande direction a un impact significatif sur le comportement de robot :

- Kd trop faible : le robot manque de réactivité et oscille du fait d'un Kp probablement réglé trop fort pour compenser l'absence de Kd. Généralement, une fois un premier Kp valide trouvé, on ajuste Kd et on peut réduire Kp.

- Kd trop fort, le robot devient trop réactif, même instable.

Tu a cherché à ajuster Kd et tu n'a constaté aucun changement de comportement, alors c'est la garantie qu'il y a un probleme d'implémentation de l'asserv et/ou de choix de la plage de valeurs de Kd.

 

De mon coté, une branche 'derivative' non filtrée d'un PID avec ou sans FF ne mène souvent à rien de bien performant dans ce genre de robot, et quel que soit les valeur de Kp/Kd appliquées, surtout si l'estimation de l'erreur de position de la ligne est une valeur avec une quantification faible.

Un indice : Structure-of-PID-controller-with-derivative-filter.png

Note : le filtrage ajoute une légère latence. et la fréquence de coupure du filtre s'ajoute aux Kp et Kd à régler.

 

Désolé, je me répète : difficile d'optimiser un asservissement sans aucune donnée. Encore plus pour tes lecteurs qui ne peuvent pas apprécier le comportement de ton robot à distance. En l'absence de données sur les erreurs et les consignes générées, un asserv peux donner l'impression de fonctionner, et avoir de gros défauts. Je renvoie souvent vers cette vidéo que je trouve très pertinente tant sur la conception de l'asserv (PID+FF mentionné dans nos posts précédents) que sur la méthode de réglage et l'outillage à réaliser pour parvenir à l'optimum.

http://youtu.be/qKoPRacXk9Q?si=fuSYrdOUKuaYi6qB

 

Le feuilleton du suiveur de ligne est néanmoins intéressant ! Tu as un premier résultat sympa. A mon sens, la marge de progression est encore élevée. C'est un peu dommage de ne pas pouvoir t'aider plus. On ne peut que t'encourager ! Bon courage ! :-)

 

Patrick.




#121209 Naissance de mon suiveur de ligne

Posté par pat92fr - 17 août 2024 - 09:02

Tu peux afficher la courbe de vitesse de rotation (consigne PWM et RPM mesuré) des deux moteurs pendant une boucle et notamment pendant un virage serré.

 

Si la cause n'est pas un problème d'adhérence des roues, alors il peut s'agir d'un manque de couple/vitesse/accélération des moteurs.

 

Plus la voie est importante et plus la motorisation est mise à l'épreuve pour les courbes serrées.

 

--edit : Autre cause, l'asservissement en direction mal réglé. Tu peux afficher la position de la ligne et les commandes moteurs (PMW droit et gauche). 




#121050 Naissance de mon suiveur de ligne

Posté par pat92fr - 07 juillet 2024 - 05:50

La série HPCB 6V devrait te permettre de faire un suiveur de ligne performant. Une pack LIPO 2S sera adapté. Pense à choisir un moteur avec encodeur pour faire une régulation en vitesse et avoir une odométrie permettant au robot d'apprendre le tracé pour optimiser sa vitesse d'avance.




#121044 Naissance de mon suiveur de ligne

Posté par pat92fr - 07 juillet 2024 - 07:18

Bonjour,

 

Une "pile" Li-Ion 1s couplé à un convertisseur Step-Up 9v ne fonctionnera pas. Ce type de produit est bon pour des petits montages électroniques à faible courant.

 

Pour alimenter des moteurs CC d'un suiveur de ligne (pic de courant aux accélérations et aux virages), je recommande une batterie à faible résistance série de type LIPO en 2s ou 3s selon le choix des moteurs..

 

En 2s : https://amzn.eu/d/0ib15MBa

 

Patrick.




#121002 8DOF-Q8 Grand quadrupède avec micro servos et semelles - Juillet 2024

Posté par pat92fr - 28 juin 2024 - 07:22

Intéressant !

 

Et si tu as encore des élastiques, est-ce que tu voudrais essayer d'ajouter un tendon, pour que la semelle étire le tendon au contact (touch down) et se détende en fin de foulée (lift off) ?

 

20240628_081704.jpg




#120983 Naissance de mon suiveur de ligne

Posté par pat92fr - 26 juin 2024 - 08:16

Bravo !  Tu pourrais participer au Tournoi National de Nîmes en catégorie Robot F1 : http://www.robot-sumo.fr/

 

 

 

Est-ce que tu as prévu des encodeurs sur les moteurs pour réguler la vitesse d'avance ?

 

Réduire un peu le poids de la partie avant peut avoir un impact positif sur les performances et la facilité de réglage.

 

Remplacer les billes par un simple patin 'téflon' (ou autre) peut également jouer sur les performances et les réglages.

 

Bonne chance !

 

 

 

PJ > J'avais presque failli faire à nouveau un suiveur de ligne il y a deux ans, mais la TRR est passée par là.

Image(s) jointe(s)

  • IMG20220809131656.jpg



#120964 [Mars Attacks!] Participating in the French Robot Cup 2024 ( Eurobot 2024)

Posté par pat92fr - 23 juin 2024 - 09:48

Hello,

 

When we registered for the CDR in Legend, we submitted a scientific project with the goal of publishing a method for simple and low-cost absolute localization.

 

After the Coupe d'Ile de France, we finalized our paper. In it, you will find a description of our localization algorithm using a truly affordable LIDAR. This technical subject kept us busy throughout the 2024 robotics season and posed quite a challenge for us.

 

From the first matches in the Coupe de Belgique, where the algorithm was not yet perfected but miraculously worked, to the matches we almost entirely lost due to localization issues in the Coupe de France, we continuously improved our method. Finally, our localization proved to be reliable and efficient in Brittany (Breizh Ty Geek) and in Ile de France, just today!

 

We hope this technical contribution will be useful to the community! Please feel free to comment on our paper.

 

Fichier joint  Enhancing_Robot_Navigation_with_a_Low_Cost_LIDAR_and_Absolute_Localization_Algorithm (1).pdf   1,69 Mo   91 téléchargement(s)




#119296 8DOF - Q5 - Mon grand quadrupède

Posté par pat92fr - 24 août 2023 - 06:39

Pour moi, la longueur du robot est égale ou légèrement supérieure à la somme de la longueur du tibia et du fémur. Du coup, ca donne une indication de la garde au sol que je retiens (un peu supérieure à la longueur du tibia).

 

Ca permet de courir avec cette extension :

go1web-3a.png

(désolé pour la pub Uni)

 

Pour le ratio entre la longueur et la largeur, je dirais environ K = 1.5 à 2 (ie. longueur = K x largeur). Comme je n'ai pas d'algorithme de stabilité, je ne sais pas augmenter ce ratio comme certains robots commerciaux et courir avec pieds qui se rapprochent d'une ligne (à l'extrème comme les chats).

Capture.PNG




#119202 8DOF - Q5 - Mon grand quadrupède

Posté par pat92fr - 12 août 2023 - 11:17

Bravo Oracid. 2m/s avec un quadrupède XL en Lego, c'était pas gagné !

 

De toutes nos observations, on constate qu'une vitesse angulaire élevée des actionneurs (servo ou autre) aux articulations, notamment hanches/genoux, et une faible inertie des pattes, sont décisives pour obtenir une marche rapide. Réduire la masse totale du robot, et positionner le Cg le plus bas possible, sont aussi des facteurs de réussite (stabilité, accélération). La résistance des matériaux Lego atteint sa limite avec cette version XL, et il serait certainement possible d'aller plus loin avec d'autres matériaux. 

 

Il doit y avoir un gisement de gain de performance dans l'allure du robot. Aujourd'hui, on est limité à une forme très particulière du trot, sans phase de suspension avec des pieds qui peuvent même glisser sur le sol en phase de swing. Si on parvenait à réaliser un véritable trot avec une phase de suspension, les vitesses atteintes seraient intéressantes. Il faudrait non seulement conserver la vitesse de rotation des pates, mais parvenir à augmenter la force d'appui au sol, en fin de phase de stance pour donner l'impulsion nécessaire au "décollage". Il faut un (dos) châssis suffisamment rigide pour que cette impulsion déplace le centre de gravité de robot vers le haut et l'avant, et pas juste déformer le corps du robot au niveau des hanches. 

 

Avec des matériaux très rigides, de bons servos, et un moyen de reproduire des tendons pour absorber les chocs, voire restituer un peu d'énergie et surtout préserver les engrenages des servos....quitte à ce que cela ne fonctionne qu'à une seule vitesse optimisée. Faudrait un peu de temps !




#119106 8DOF - Q5 - Mon grand quadrupède

Posté par pat92fr - 29 juillet 2023 - 09:54

Ce matin, j'ai profité d'une petite éclaircie pour faire quelques tests.

 

Dans Servo.h, j'ai modifié REFRESH_INTERVAL  3300

Avec un writeMicroseconds(1700) , une longueur d'itération à 15mm, un pas de 200mm, un Y = 15 et un garrot à 355mm, j'ai obtenu :

 

                     10m en 5,5 secondes

 

J'ai fait le test 3 fois, ce qui pour moi le valide. Mais, il faut relativiser car je suis à califourchon sur le quadrupède, pour éviter qu'il ne se renverse.

 

J'ai également testé avec REFRESH_INTERVAL  5000, mais je n'ai pas noté d'amélioration notable, par rapport à une valeur de 10000.

Maintenant, pour faire mieux, je peux revenir à une longueur d'itération à 10mm en diminuant la valeur du  writeMicroseconds(). L'allure sera plus souple.

Ou alors, j'augmente la longueur d'itération à 20mm avec un mouvement plus saccadé, mais plus rapide.

 

Mais la pluie revient . . .

 

On dirait bien que ta carte Arduino offre un bon niveau de performance et tient bon avec un REFRESH_INTERVAL petit. Est-ce que tu sais contrôler la fréquence PWM des sorties servo de ta carte Arduino, avec un analyseur numérique ou un oscilloscope pour valider le bon fonctionnement dans cette configuration de la bibliothèque Servo ?

 

Au passage, le réglage "ultime" serait de 3031 (avec une petite marge) puisque tes servos acceptent une fréquence PWM de 330Hz d'après les caractéristiques énoncées sur le site que tu as envoyé.

 

Ensuite, tu devrais harmoniser ton implémentation. Idéalement, ton algorithme de marche doit envoyer une consigne de position, à chaque nouvelle impulsion PWM, afin de profiter de la cadence des servos et de la bibliothèque Servo. Si tu ne respectes pas cette synchronisation, tu risques d'avoir plus de difficultés à faire le lien entre tes paramètres de configuration et leurs effets sur les performances réelles du robot.

 

Je t'invite à faire une itération de ton calcul de marche toutes les 3031 microsecondes (ou une fois sur deux à la rigueur) . On a déjà évoqué la façon de coder la boucle loop() avec une telle contrainte temps réelle. C'est facile. Tu remplaces do_action par ton calcul de la position des servos et par les appels writeMicroseconds(). tu auras certainement quelques ajustement à faire pour retrouver le comportement actuel de ton robot.

unsigned long previousTime = micros(); 
long timeInterval = REFRESH_INTERVAL*2; 
unsigned long counter = 0; 

void setup() { }

void loop() {
  unsigned long currentTime = micros(); 
  // Enter the If block only if at least 3031micros has passed since last time
  if (currentTime - previousTime > timeInterval) {
    // do action
    previousTime = currentTime;
    ++counter;
  }
}

Il se peut que la carte Arduino ne soit pas assez puissante pour tenir une telle cadence pour piloter les servos à 330Hz et exécuter tes calculs de démarche à la cadence de 165Hz. On avisera. Tu peux facilement vérifier si la cadence est tenue en affichant dans la console serie la valeur "counter*1000/millis()". Ca doit retourner 165 (Hz). Si ca retourne une valeur inférieure, et bien il faudra juste ajuster REFRESH_INTERVAL pour trouver la bonne valeur qui assure une synchronisation correcte entre tes calculs et les servos.

 

Patrick.




#119090 8DOF - Q5 - Mon grand quadrupède

Posté par pat92fr - 26 juillet 2023 - 05:43

La fonction writeMicroseconds() permet de régler la longueur des impulsions PWM vers les servos. Mes ces impulsions ne sont envoyées que toutes les 20ms par le processeur avec Arduino/Servo.

 

Les servosacceptent un délai de l'ordre de 3.3ms (330Hz). Tu peux donc ajuster la valeur de la bibliothèque servo : 

#define REFRESH_INTERVAL    20000     // minimum time to refresh servos in microseconds 

Tester une valeur inférieure, 10000, 5000, 3300 et voir !