Den NXT intelligent steuern Der PID Regler Aufbau und Funktionsweise Beispiel Schwarze Linie Boden-Sensor vorne An der Kante entlang Sollwert= Messwert weiß + Messwert schwarz Summe / 2 Rustikale Steuerung links oder rechts Intelligenz 1
Darf es ein wenig mehr sein? if(boden < grau) Linksrum(); else Rechtsrum(); if(boden < 44) Linksrum(); else if(boden > 46) Rechtsrum(); else Geradeaus(); } Das Pin PID ist der Schlüssel Proportionale Steuerung: Je größer der Fehler, desto mehr wird nach geregelt. 2
#FAKTOR = 10 Den Fehler bestimmen fehler = sollwert istwert; // -2 = ((40+50)/2) 47; drehen = FAKTOR * fehler; // -20 = 10 * -2; Nehme den Fehler und multipliziere ihn mit einer Konstanten um den Korrekturwert zu erhalten. Der P-Regler in nxc-syntax Kp = 10; // P-Konstante grau = 45; // Sollwert = (schwarz + weiss) / 2 Tp = 50; // Grundgeschwindigkeit von 50% while(1) boden = Sensor(S1); // Istwert, wo wir gerade sind fehler = boden grau; // Fehler berechnen drehen = Kp* fehler; // Korrekturwert für die Drehung fahrena= Tp+ drehen; // Power für Motor A fahrenc= Tp drehen; // Power für Motor B OnFwd(OUT_A,fahrenA); // Die endgültige Anweisung OnFwd(OUT_C,fahrenC); // Die endgültige Anweisung }// end ofwhile 3
Voraussetzungen: P- Regler Zusammenfassung Kenntnis des Sollwertes Kenntnis des Istwertes Roboter muss direkt reagieren können Direkter Einfluss auf die Steuerung Die Größe der P-Konstanze gibt die Regelgeschwindigkeit an Regelung ist proportional Der I-Regler oder was habe ich in der Vergangenheit gemacht? Integral ist das Zauberwort integral = integral + fehler; // Summe der letzten Fehler // 1+2+2 = 5 drehen = Kp*fehler+ Ki* integral; Kleine Abweichungen summieren sich und ermöglichen eine bessere Regelung. 4
Der PI-Regler in nxc-syntax Kp = 1000; // P-Konstante, hier Kp*100 in echt 10 Ki = 100; // I-Konstante, hier Ki *100 in echt 1 grau = 45; // Sollwert = (schwarz + weiss) / 2 Tp = 50; // Grundgeschwindigkeit von 50% integral = 0; // hier werden die Fehler summiert while(1) boden = Sensor(S1); // Istwert, wo wir gerade sind fehler = boden grau; // Fehler berechnen integral = integral + fehler; // aktuellen Fehler hinzufügen drehen = (Kp* fehler) + (Ki* integral); // Korrekturwert für die Drehung drehen = drehen /100; // Korrekturwert berichtigen siehe P und I-Konstante fahrena= Tp+ drehen; // Power für Motor A fahrenc= Tp drehen; // Power für Motor B OnFwd(OUT_A,fahrenA); // Die endgültige Anweisung OnFwd(OUT_C,fahrenC); // Die endgültige Anweisung }// end ofwhile Was werde ich in der Zukunft machen? Wie kann ich die Zukunft voraussehen? Kann ich aus meinen Fehlern lernen? Was ich kenne: Fehler in der Gegenwart Fehler aus der Vergangenheit Proportional Integral Derivate für die Gegenwart für die Vergangenheit für die Zukunft ( Abkömmling, von lateinisch derivare'ableiten') 5
Beispiel: Der D-Regler aktueller Fehler ist 2 integraler Fehler ist 5 Aktueller zukünftiger Fehler ist: aktueller Fehler -integraler Fehler // 2 5 = -3 NächsterFehler wird sein: (aktueller Fehler) + (aktueller zukünftiger Fehler) // 2+ (-3) = -1 Also wie immer: Drehen = Kp* fehler + Ki* integral + Kd* derivate Der PID-Regler Der Proportionale Teil steuert direkt, der Imaginäre Teil berichtigt mit den Erfahrung aus der Vergangenheit und der Derivate Teil nimmt Einfluss, mit der Vorhersage der Zukunft auf das Objekt. 6
Der PID-Regler in nxc-syntax Kp = 1000; // P-Konstante, hier Kp*100 in echt 10 Ki = 100; // I-Konstante, hier Ki *100 in echt 1 Kd = 10000; // D-Konstante, hier Kd*100 in echt 100 grau = 45; // Sollwert = (schwarz + weiss) / 2 Tp = 50; // Grundgeschwindigkeit von 50% integral = 0; // hier werden die Fehler summiert fehleralt = 0; // alten Fehler merken derivate= 0; // Platzhalter für die Zukunft while(1) boden = Sensor(S1); // Istwert, wo wir gerade sind fehler = boden grau; // Fehler berechnen integral = integral + fehler; // aktuellen Fehler hinzufügen derivate=fehler fehleralt; // derivate berechnen drehen = (Kp* fehler) + (Ki* integral) +(Kd*derivate); // Korrekturwert für die Drehung drehen = drehen /100; // Korrekturwert berichtigen siehe P und I-Konstante fahrena = Tp+ drehen; // Power für Motor A fahrenc= Tp drehen; // Power für Motor B OnFwd(OUT_A,fahrenA); // Die endgültige Anweisung OnFwd(OUT_C,fahrenC); // Die endgültige Anweisung fehleralt = fehler; // aktuell Fehler merken für die Zukunft }// end ofwhile Der PID Regler Quellen A PID Controller For Lego Mindstorms Robots Author: J. Sluka http://www.inpharmix.com/jps/pid_controller_for_lego_mindstorms_robots.html(engl.) 22 Seiten Dank an J.Sluka als Quelle für diese Dokumentation (Dezember 2011) NXT Line follower using a color or light sensor and PID controller http://www.techbricks.nl/my-nxt-projects/nxtlinefollower.html(engl.) 4 Seiten Using a PID-based Technique For Competitive Odometryand Dead-Reckoning Author: http://www.seattlerobotics.org/encoder/200108/using_a_pid.html(engl.) 28 Seiten Real-time Control Teaching Using LEGO Author: W Grega http://www.proceedings2008.imcsit.org/pliks/196.pdf(engl.) 4 Seiten Regelungstechnik http://www.rn-wissen.de/index.php/regelungstechnik(deu.) 7