Skip to content

[FR] PID

Thorgaran edited this page Jun 17, 2023 · 3 revisions

Présentation

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

Communication multi-nodes

Le seul but de la node PID est de faire les calculs de correction de trajectoire. Pour cela, il communique avec plusieurs autres nodes, 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 envoit 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.2,0,0,60)

Permet 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'). Initialise le PID avec les paramètres donnés.

Calculs et envoi

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

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

La vitesse est limité à 0.5 car avec un fréquence de 500ms pour le PID, le robot doit être très lent pour suivre la ligne. Récupération de la valeur du capteur toutes les demi secondes avec get_RGBvalue().

Calcul et envoi des paramètres de déplacement toutes les demi secondes avec pid_send().

Clone this wiki locally