Weitere Informationen zum Ultraschallsensor PING))) findet man unter
Statt Hindernisse zu finden und ihnen auszuweichen, kümmern wir uns hier darum, wie man einem Objekt folgt. Der gleiche Sensor, aber ein anderer Programmcode. Alles, was das neue Programm leisten muss, ist, innerhalb eines vorgegebenen Abstandes nach einem Objekt zu suchen und wenn sich der Abstand zum Objekt vergrößert, ihm zu folgen. Ist der Abstand geringer als die Vorgabe, geht der Roboter zurück, ist er gleich der Vorgabe, bleibt er stehen.
In diesem Programmbeispiel soll der ActivityBot einen Abstand von 32cm zwischen sich und einem Objekt vor ihm einhalten. Wird kein Hindernis erkannt, bewegt sich der Roboter vorwärts, bis er auf ein Objekt trifft. Dann soll er sich diesem bis auf 32cm annähern. Wird das Objekt vom ActivityBot entfernt, soll der Roboter nachsetzen und auf Distanz bleiben. Umgekehrt, wird das Objekt auf den Roboter zubewegt, setzt er zurück und stellt die alte Distanz von 32cm so wieder her.
Programm zur Objektverfolgung | |
Aufgaben |
|
Das Programm PING_Verfolger.c
Wie arbeitet das Programm PING_Verfolger.c?
Es werden fünf Variable deklariert: abstand_gemessen, abstand_vorgegeben, differenz, pk und speed.
Das Programm startet mit dem vorgegebenen Abstand von 32cm und einer Proportionalitätskonstanten von -10. Die Ramping Schrittweite wird auf 6 eingestellt, um plötzliche Geschwindigkeitsänderungen abzufedern. Innerhalb der Endlosschleife reagiert das Programm so, dass der ActivityBot einen Abstand von 32cm zwischen sich und einem Zielobjekt aufrecht erhält. Dazu werden wiederholt fünf Schritte sehr schnell durchlaufen:
Zeile 16
Bestimme den Abstand mit abstand = ping_cm(8).
Zeile 17
Berechne die Differenz zwischen dem gewünschten und tatsächlichen Abstand.
Zeile 18
Berechne die Geschwindigkeit, die notwendig ist, um die Abstandsdifferenz zu korrigieren.
Zeilen 19 und 20
Begrenze die Geschwindigkeit auf +/- 128 mit zwei if-Anweisungen.
Zeile 22
Treibe beide Räder mit der korrigierten Geschwindigkeit an.
Was du wissen solltest!
Ein automatisiertes System, das eine bestimmte gewünschte physikalische Größe aufrecht erhält, wird auch als Regelkreis bezeichnet. Im Fall des ActivityBot ist die physikalische Größe der Abstand zwischen dem Roboter und einem Objekt vor ihm.
Bei vielen Regelkreisen wird eine sogenannte Rückführung des aktuellen Wertes (abstand_gemessen) an den Regler benutzt, um der Abweichung (differenz) vom Sollwert (abstand_vorgegeben) kontinuierlich (durch eine Veränderung der Geschwindigkeit speed) entgegenzuwirken.
Ingenieure benutzen zeichnerische Darstellungen für solche Regelkreisanordnungen. Wenn der Wert von abstand_vorgegeben auf 32 eingestellt ist und der Wert von abstand_gemessen bei 38 liegt, dann ist der Fehlerwert oder die Differenz -6. Dieser Wert wird mit einem Proportionalitätsfaktor (pk) multipliziert und als Korrekturfaktor mit der Geschwindigkeit speed verknüpft (speed = pk x differenz = 60), um die Abweichung zu korrigieren.
Die Regelgröße (IST-Wert) wird mit der Führungsgröße (SOLL-Wert) verglichen und die Regelabweichung (Differenz von Soll- und Ist-Wert) dem Regler zugeführt. Der macht daraus eine entsprechende Steuergröße, die auf die Regelabweichung Einfluss nimmt.
Es ist sehr hilfreich zu sehen, wie die Werte auf verschiedene Abstandsmessungen reagieren. Um das zu erfahren, solltest du ein paar Werte im Terminalfenster anzeigen lassen.
Abstandsmessungen näher untersuchen | |
Aufgaben |
|
Das Programm Ping_SteuersignaleZeigen.c
WARNUNG: Dieses Programm ist nicht dafür geeignet, einen Roboter zu navigieren; es ist nur für die Darstellung der Steuerbefehle im Terminal gedacht und dient der Anschauung.
Liegt die Abstandsmessung bei 40, ergibt sich mit differenz = abstand_vorgegeben - abstand_gemessen = 32 - 40 = -8. Die Geschwindigkeit wird dann über speed = pk * differenz = -10 * -8 = + 80.
Der ActivityBot fährt vorwärts mit 80 Ticks pro Sekunde. Der Wert liegt im Bereich von +/- 128 und damit etwas über halber maximaler Geschwindigkeit, mit der er sich einem Objekt nähern würde. Nimmt die Abstandsmessung auf einen Wert 24 ab, reagiert der Roboter mit speed = -80 mit einer Rückwärtsbewegung. Bei einem Abstand von 28 bewegt er sich weniger schnell rückwärts mit einer Geschwindigkeit von speed = -49.
Jetzt kommst du!
Es lässt sich in dieser Übung mit vielen verschiedenen Werten experimentieren. Wenn der Wert der Variablen abstand_vorgegeben von 32 in 20 geändert wird, versucht der ActivityBot einen Abstand von 20cm zwischen sich und einem Objekt einzuhalten. Der Wert von pk kann erhöht werden, um Differenzen schneller auszugleichen oder erniedrigt werden, um die Prozesse langsamer ablaufen zu lassen.
Wird der Wert von drive_setRampStep erniedrigt, dämpft das das Reaktionsverhalten und kann dazu führen, dass der Roboter zu langsam reagiert und damit Gefahr läuft, mit dem Objekt zusammenzustoßen. Wird der Wert dagegen erhöht, reagiert der Roboter heftiger. Manchmal so heftig, dass bei einer abrupten Richtungsänderung der Ping))) Sensor vom Steckbrett geschleudert wird.
Weitere Untersuchungen mit den Variablenwerten |
|