-
Notifications
You must be signed in to change notification settings - Fork 2
[FR] PID
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.
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 :
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.
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
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.
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().
- [FR]
- [EN]