Skip to content

[FR] PID

Etoiles-ing edited this page May 30, 2023 · 3 revisions

Présentation

Le principe de la mise en place de PID dans notre projet permettra au robot d'atteindre sa cible en suivant une ligne noire. Pour cela, il récupéra les informations du capteur couleur afin de donner des consignes de déplacements pour que le robot reste sur la ligne.

Communication multi-nodes :

Le seul de but de la node PID et de faire les calculs de corrections de trajectoire, pour cela, il communique avec plusieurs comme on peut le voir ci-dessous :

Image description

Comme on peut le voir, la node calcule sans arrêt, mais c'est le contrôleur qui décide si les commandes qu'elle envoie seront utilisées.

Paramétrage du PID :

Ce PID comporte plusieurs paramètres qui sont configurés à la création de la node:

class PID_controller:
    def __init__(self,kp,ki,kd,isat):
        self.kp = kp
        self.ki = ki
        self.kd = kd
        self.isat = isat
        self.old_error = 0
        self.sum_integral = 0
  • kp pour la composante proportionnelle
  • ki pour la composante intégrale
  • kd pour la composante dérivée
  • isat la valeur max de l'erreur

Fonctionnement de la node:

Initialisation

def __init__(self):
	super().__init__('turtlebot_pid')
  
	self.publisher_ = self.create_publisher(Twist, 'PID_cmd_vel', 10)
	self.subscription = self.create_subscription(rgbtype,'RGB_Value',self.get_RGBvalue,10)
	self.subscription
  
	timer_period = 0.5  # seconds
	self.timer = self.create_timer(timer_period, self.pid_send)
  
	self.i = 0
	self.valeurgb= rgbtype()#specific topicof the RGB sensor
	self.pidangle=PID_controller(0.9,2.0,0,60)

Permets la souscription au topic du capteur('sensor'), et la publication des ordres de déplacement vers le contrôleur avec un topic ('PID_cmd_vel'). Initialisation du PID avec les paramètres donnés.

Calcul et envoie

def get_RGBvalue(self, msgsub):
	self.valeurgb=msgsub

def pid_send(self):
	error=((self.valeurgb.r+self.valeurgb.g+self.valeurgb.b)/(3*2.55))-40
	white=self.valeurgb.c    
	angle=self.pidangle.compute(0.1,error)
     
	msg = Twist() #RGB sensor
	msg.linear.x=2#self.order.straight;
	msg.angular.z=angle
	self.publisher_.publish(msg)
	self.i += 1

Récupération de la valeur du capteur toutes les demi secondes avec get_RGBvalue().

Calcule et envoie des paramètres de déplacements toutes les demi secondes avec pid_send().

Clone this wiki locally