Aller au contenu


Photo
- - - - -

Se passer de PID ?


11 réponses à ce sujet

#1 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 382 messages
  • Gender:Male
  • Location:Paris

Posté 27 juin 2018 - 07:19

J'aime pas configurer ces 3 valeurs de PID alors j'ai cherché comment m'en passer. J'ai testé ce code. Il me convient et je voulais votre avis.

void PiloteMoteur::update(unsigned int vitesseMesuree, unsigned int duration) {

	float output = (float)_setpoint * 255.0 / 280.0; // PWM 100% -> 280 fronts/100ms

	if( duration < 2000) { // On accélère sur 2s de 0 à output

		output = output * duration / 2000;
	}
	else { // On gère une correction proportionnelle basée sur l'erreur

		float errorRatio = 0;
		if(_setpoint > 0) {
			errorRatio = (_setpoint - vitesseMesuree) / _setpoint * 255.0 / 280.0;
		}
		
		output = output + (output * errorRatio);
	}
	
	byte command = constrain((int)output, 0, 255);

	analogWrite(_pinPWM, command);
}

Voilà, j'ai une correction de la commande du moteur fonction de la vitesse mesurée sans avoir de PID.

 

Cette simplification a un prix.

- Il faut être dans une zone linéaire du ratio feedback/setpoint.

- Il faut gérer une accélération avant de corriger. Il faut que le moteur soit déjà lancé pour pouvoir appliquer ce code simple. En partant de la vitesse 0, je trouvais pas ce chose simple pour éliminer l'asservissement par PID.

 

Sur l'écran, j'affiche le feedback (vitesseMesuree) pour les 4 moteurs. Au dessus c'est la commande strafe et rotation. J'y reviendrai. ;)

 


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#2 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 27 juin 2018 - 08:49

ahhh caca !!!! mais je laisse jojo répondre pour de vrais car il va dire mathématiquement ce que ça fait vraiment.

Pour moi ça incrémente juste la sortie de (l'erreur*gain) / Tu intègres à la sortie (l'erreur*gain)

c'est un PI cheloux quoi...


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#3 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 844 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é 27 juin 2018 - 08:49

En fait tu fais un début de correcteur PID sans mettre l'intégrale et la dérivée ...  et en mettant toi même l'équivalent du correcteur intégrale pour avoir une erreur nulle ...

 

 normalement quand on fait du Kp only

On est censé faire

output = kp * ( consigne - sortie)  

Du coup si on se tien uniquement à ça on voit que si consigne = sortie on aura output = 0... Et en général c'est pas ce qu'on cherche à avoir... car généralement si output est à 0 ça a tendance à arrêter notre système ...  ( sauf cas particulier d'asservissement de vitesse par rapport à une distance mais dans ce cas particulier il y a une notion d'intégration qui rentre dans la boucle de contrôle ... ) 

C'est pour cela qu'on dit généralement qu'un correcteur proportionnel simple a une erreur statique pour fonctionner ... et qu'on ajoute le correcteur intégrale pour supprimer ce problème d'erreur statique, le correcteur intégrale gardant le " cap " de consigne quand la partie proportionnelle est à 0. 

 

le correcteur PI  c'est censé être ça :

 

output = ki * Somme d'erreur +   kp * ( consigne - sortie)  

Pour en revenir à ce que tu as fait path si j'essaye de l'analyser  : 

Step 1 : phase d'accélération pendant 2 secondes où tu suppose que grosso modo l'output doit être proche du setpoint. 
Tu augmentes progressivement output jusqu'à atteindre le setpoint. Mis à part pour avoir une accélération douce je ne vois pas pourquoi tu fais cette phase comme cela .
Au lieu de mettre une duration fixe, qui sera en place même si tu as un infime changement dans la consigne, pourquoi ? Il faut choisir un incrément fixe qui correspond à l'accélération max que tu veux mettre =) Ainsi la phase d'accélération ne sera plus à "duration fixe " mais dépendante de l'accélération max que tu veux et de l'écart que tu as entre consigne et sortie ...

 

Step 2 : Tu fixes le résultat de ce que serait la partie correction intégrale à la valeur "output" actuelle auquel tu ajoutes le correcteur proportionnel. 

 

output = output + kp * ( consigne - sortie)  

 

et donc dans ton cas tu remplace le " ki * Somme d'erreur " du correcteur PI en par output.


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 !

 

Les réalisations de Mike118  

 

 

 


#4 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 27 juin 2018 - 08:56

Oui bien conclusion c'est un mélange bizarre quoi

 

Par contre le petit écran de debug c'est la classe


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#5 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 382 messages
  • Gender:Male
  • Location:Paris

Posté 27 juin 2018 - 09:19

Merci pour vos réponses.

 

 

Par contre le petit écran de debug c'est la classe

Oué !! C un mini kiffe dans le gros kiffe ^^

 

 

Pour le step 1,

Je cherche pas une accélération fixe. Mais je veux accélérer pendant une durée fixe. pour que les 4 moteurs soient à leur vitesse voulue en même temps.

Je pars aussi de ça 

float commandAsFloat = ((float)_setpoint * 255.0 / 280.0) + ((float)_setpoint * errorRatio);

Et quand l'erreur est au max, c'est à dire vitesse à 0, ma commande est doublée. C'est pour ne pas retomber dans un PID que j'ai choisi d'accélérer d'abord puis de passer au 2.

 

Pour le step 2,

Ne cherchez pas un PID ^^ C'est pas un PID :) C'est juste appliquer un ratio de correction sur la commande.

Le petit truc qui ressemble à un PID, c'est juste le (* 255.0 / 280.0), quand je passe un ratio linéaire pour adapter le setpoint à la commande. Je vais l'améliorer en le mesurant au démarrage du robot.

Ça ressemble seulement à un Kp mais c'est pas ça. Kp * (consigne - sortie) donnerait une commande à 0 quand le moteur atteint la consigne ... Pas bon oscilation. C'est ça que j'ai cherché à éviter ;)

 

Bref, tout ce que je fais c'est ajouter une correction sur la commande en + ou en - pour obtenir la consigne. Je calcule cette correction en faisant un % de l'erreur. D'où le fait que ce doit être linéaire. La non linéarité serait la principale erreur de ce petit bout de code. Et peut-être d'autres erreurs, si vous en voyez.

 

Pour le moment, je n'ai testé qu'à vide. Et ça fonctionne. Ça oscille léger. C'est ce que j'ai voulu montrer sur la video. Je ferai une courbe pour le montrer mieux. Si ça tient avec la charge du robot, je vous ferai signe.

 

En attendant, je me suis pas embêté avec l'emploi de ces satanées (pour être poli) constantes.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#6 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 27 juin 2018 - 09:35

mais c'est neuneu à régler un PID, bien plus simple que tout ça:)


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#7 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 382 messages
  • Gender:Male
  • Location:Paris

Posté 27 juin 2018 - 09:42

Ben je trouve ça plus simple en fait. J'ai pas encore trouvé de truc simple pour régler un PID. Mine rien, c'est pas mon premier. Peut-être un jour ça viendra. Pour le moment, je suis sur la solution fainéant.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#8 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 27 juin 2018 - 09:47

Mais tu pousses le P pour obtenir un poil d'oscillations que tu amorties avec le D.

Ou alors tu pousses le P pour ne pas avoir d'oscillation et tu améliore la performance avec le D

Tu ajustes les P et D pour avoir la montée la plus performante sans trop dépasser (overshoot).

 

Pour P et D la charge moteur doit être représentative, le D est sensé avaler/compenser l'inertie du système.

 

Puis le I se règle en toute indépendance car la correction doit être lente (sinon contre productive) et le I est facile à sentir à en forçant le moteur à la main:) En fait il faut le monter jusqu'a ce qu'il deviennent contre productif (oscillation de I) et redescendre / garder une bonne marge.

 

Au feeling ça prend quelques minute pour avoir un réglage potable (et c idem sur un drone multirotors ou une base roulante)


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#9 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 382 messages
  • Gender:Male
  • Location:Paris

Posté 27 juin 2018 - 10:03

Ici, c'est super bien expliqué. C'est le blog du mec qui a fait la lib PID pour arduino.

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#10 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 27 juin 2018 - 10:10

Oui je la connais bien cette page ça m'a inspiré pour l'anti windup mais au final j'ai réinventé le mien.

Par contre c'est du float et le float ça flotte pas mais ça coule les perfomances du CPU donc c'est pas cool.

En plus d'être integer celui de mon robot est étudié pour bosser en vélocité si tu veux je peux te filer le code pour t'en inspirer ou au pire jojo fera un article mais uniquement si on veux le publier.


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 


#11 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 382 messages
  • Gender:Male
  • Location:Paris

Posté 18 août 2018 - 09:32

Conclusion, si on peut s'en approcher, rien ne vaut un pid.
Conclusion de la conclusion, pour de passer de pid, il faut fonctionner avec une boucle ouverte. Si l'application le permet, un moteur pas à pas avec la gestion de laccelération peut faire l'affaire.

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#12 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 18 août 2018 - 09:41

J'ai commandé des (2) Alphabot2 pour les webiser et les motoréducteurs n'ont pas d'encodeurs... boucle ouverte obligatoire en même temps vu les petits trucs ça ira surtout que la tête comporte un pan&tilt ce qui est le plus important pour regarder partout façon fluide avec le H.264


Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

 

Mon serveur de développement : https://www.serveurperso.com

 




Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users