Line Follower-Optimierung

9

Ich arbeite am Bau eines Linienfolger-Roboters und möchte seine Leistung optimieren. Es wurde vorgeschlagen, einen PID-Algorithmus zu verwenden. Ich habe viel über PID gelesen, bin aber etwas verwirrt in Bezug auf Folgendes:

Ich habe den error_value mit berechnet. Aber hinsichtlich der Änderung der Motordrehzahl bin ich verwirrt, was beim Vergleich die Differenz (dh Stromposition - Sollwert) oder der Fehlerwert zu verwenden ist. Das soll ich benutzenkpproportional+...

if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }

oder

if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }

es auch einen bestimmten Bereich für die Werte der Konstanten , und ? Ich benutze einen Differentialroboter für meinen Linienfolger.k i k dkpkikd

Ich würde mich auch freuen, wenn mir jemand einen anderen erweiterten Optimierungsalgorithmus zur Verbesserung des Linienfolgerroboters vorschlagen würde.

Meteore
quelle
Ich bin nicht sicher, welche Terminologie Sie verwenden, aber normal in der Terminologie von Steuerungssystemen ist Ihr "Unterschied" der Fehlerwert und (soweit ich das beurteilen kann) Ihr "Fehlerwert" der Steuerbefehl.
TimWescott
Hallo, die Variable ist zum Beispiel Ihre proportionale Verstärkung. Kennen Sie sich mit Steuerungstheorie aus? Kp
LeCrazyEngineer
@leCrazyEngineer Ich erinnere mich nicht an den größten Teil dieser Frage, wie es vor 3 Jahren war. Ich habe auch keine Ahnung von Kontrolltheorie. Vielleicht hätten die Leute, die geantwortet haben, eine Ahnung.
Meteore

Antworten:

8

Wenn Sie eine PID-Schleife zum Lenken mithilfe der Linienverfolgung verwenden, ist Ihr Sollwert immer der gleiche. Sie möchten immer, dass sich die Linie in Bezug auf den Roboter in derselben Position befindet, beispielsweise in der Mitte Ihres Sensors.

Wenn Ihr Leitungssensor also einen Wert von -1 bis 1 ausgibt, wobei 0 die Mitte des Sensors ist, möchten Sie, dass Ihr Sollwert Null ist (und das Zurücklesen des Sensors und die Differenz gleich sind). Wenn Ihr Liniensensor einen Wert von 0 bis 10 ausgibt, möchten Sie, dass Ihr Sollwert 5 beträgt (und Ihr Sensor zurückliest und die Differenz unterschiedlich ist).

Da Sie lenken, indem Sie die Räder so einstellen, dass sie sich mit unterschiedlichen Geschwindigkeiten drehen, und dann einer Linie mit konstanter Geschwindigkeit reibungslos folgen, möchten Sie wahrscheinlich die Geschwindigkeiten für beide Räder basierend auf dem Fehler anpassen. Wenn Sie beispielsweise nach links abbiegen müssen, um auf der Linie zu bleiben, verlangsamen Sie das linke Rad und beschleunigen das rechte Rad. Je mehr Sie drehen müssen, desto mehr müssen Sie das Innenrad verlangsamen und desto mehr müssen Sie das Außenrad beschleunigen.

Betrachten Sie die Situation, in der Sie radians nach links drehen müssen, um den Fehler zu korrigieren, und Ihre aktuelle Geschwindigkeit ist :e S 0θeS0

Differentiallenkung

Ihr linkes Rad muss also mit und Ihr rechtes Rad muss mit .S R = ( r + b ) θSL=rθSR=(r+b)θ

Um die gleiche Gesamtgeschwindigkeit aufrechtzuerhalten , benötigen Sie , sodass das linke Rad mit während das rechte Rad fahren muss bei .S 0 = ( r + b / 2 ) θ S L = S 0 - ( b / 2 ) θ S R = S 0 + ( b / 2 ) θS0S0=(r+b/2)θSL=S0(b/2)θSR=S0+(b/2)θ

Wenn Ihr Fehler gegen Null geht, tendieren auch die Drehzahlen jedes Motors zueinander. Wenn der Fehler zunimmt, nehmen auch die Geschwindigkeitsunterschiede zu.

Möglicherweise muss sich Ihr Innenrad sogar rückwärts drehen, wenn Ihr Sensor Ihnen mitteilt, dass die Linie enger gekrümmt ist als der Abstand zwischen Ihren Rädern. Dies sind Komplikationen, die Sie Schritt für Schritt durcharbeiten können, wenn Ihre Steuerung jedoch komplexer wird.

Da Ihr Fehler sowohl positive als auch negative Werte hat (um das Kontinuum von außerhalb der Skala links ... zu weit links ... auf der Linie ... zu weit rechts ... außerhalb der Skala rechts darzustellen, sollten Sie dies tun Sie müssen nie fragen, ob ifder Fehler positiv oder negativ ist. Sie sollten nur neue Werte basierend auf dem Fehlerwert berechnen, da ein positiver und ein negativer Wert entgegengesetzte und symmetrische Auswirkungen auf die Motoren haben sollten.

Beachten Sie, dass Sie bei der Zeilenverfolgung möglicherweise nur mit dem Proportional-Gain-Term davonkommen können (dh die anderen Terme bei Null belassen). Durch die Implementierung eines Derivat-Terms können Sie den Proportional-Gain-Term möglicherweise höher anheben, um ein reaktionsfähigeres System zu erhalten. Ein integraler Term hilft jedoch wahrscheinlich nicht weiter. Die Tatsache, dass der Fehler größer wird, wenn Ihr Roboter in die falsche Richtung geht, bedeutet, dass die physischen Bewegungen Ihres Roboters ohnehin wie ein integraler Begriff wirken.

Die spezifischen Werte von P, D und I werden durch die Reaktionsfähigkeit Ihres Systems bestimmt. Allgemeine Hinweise zum Einstellen von PID-Parametern finden Sie in meiner und anderen Antworten zu Was sind gute Strategien zum Einstellen von PID-Schleifen?

Mark Booth
quelle
Ihrer Meinung nach "sollten Sie nur neue Werte basierend auf dem Fehlerwert berechnen, da ein positiver und ein negativer Wert entgegengesetzte und symmetrische Auswirkungen auf die Motoren haben sollten." aber wie bestimme ich, welcher motor den fehler auslösen soll?
Meteore
@AnkitShah Beide tun es. Hoffentlich erklärt mein Update es etwas besser.
Mark Booth
Vielen Dank an Mark Booth, der das Zeug wirklich erklärt hat. Ich habe nicht genug Wiederholungen. auf der Website, um Ihre Antwort zu verbessern, aber das war wirklich schön erklärt.
Meteore
Ich bin froh, dass ich @AnkitShah helfen konnte - Wenn Sie Ihre Frage bearbeiten, um einige Unklarheiten zu beseitigen (z. B. ob Sie ein Differential oder eine Ackermann-Lenkung verwenden), erhalten Sie zumindest von mir und möglicherweise auch von anderen eine positive Bewertung. Es sollte nicht lange dauern, bis Sie 15 Wiederholungen erhalten, wenn Sie sich die Vorschläge anhören, die die Leute machen.
Mark Booth
Dank @Mark gibt es noch andere Algorithmen, die helfen, den Fehler zu reduzieren und den Bot reibungsloser zu bewegen und der Linie zu folgen?
Meteore
3

Vielleicht möchten Sie diese Frage zum Einstellen von PIDs lesen .

Es hört sich so an, als würden Sie die Rolle errordieser Berechnung verwirren . Die PID-Gleichung nimmt die Fehlermessung (Istposition - gewünschte Position) und bestimmt, wie viel "Reaktion" im Regler befohlen werden soll (z. B. wie viel Kraft).

Anstatt zu sagen if (error_value > 0) { }, sollten Sie so etwas sagen response = get_PID_calculation(error_value). Abhängig von der Konstruktion Ihres spezifischen Fahrzeugs wird diese Antwort als Drosselklappenbetrag, Lenkung als gewünschter Winkel oder eine andere Steuereingabe an den Antriebsmotor gesendet.

Ian
quelle
Dies ist der Link zu meinem Arduino-Code. Was schlagen Sie vor? www1.datafilehost.com/d/5dcbdd4e
Meteore
Das hängt davon ab, was macht der Roboter falsch?
Ian