LBotics.at

Ermittelt man mit einem Sensor nur die Information, ob sich dieser über einer schwarzen oder weißen Fläche befindet, so kann ein Roboter einer Linie nur dann verlässlich folgen, wenn alle Kurven (fast) die gleiche Krümmung aufweisen, an welche die Motorgeschwindigkeiten und die Differenz zwischen diesen beiden optimal angepasst werden kann.

Verlieren des Linienverlaufs bei zu starker Krümmung

Bei gleicher Geschwindigkeit und Fahrtrichtung ist der Sensor bei einer Kurve mit größerer Krümmung in der gleichen Zeit weiter von der Linie entfernt als bei einer Kurve mit geringerer Krümmung.

Aus diesem Grund muss die Drehung hin in Richtung zur schwarzen Linie bei einer Kurve mit starker Krümmung größer sein, als bei einer Kurve mit geringer Krümmung.

Unterschiedliche Intensitäten in Bezug auf die Position des Sensors

Damit ein Roboter besser und verlässlicher auf unterschiedliche Krümmungen in einem Kurvenverlauf einer Linie reagieren kann, ist es von Vorteil, sich die unterschiedlichen Intensitäten und damit die Informationen über die Entfernung des Sensors von der Grenze zwischen schwarz und weiß zu Nutze zu machen. Dazu steht im Modul mbuild die Funktion mbuild.quad_rgb_sensor.get_gray(port) zur Verfügung, mit der man Intensitätswerte zwischen 0 und 100 (0% - 100%) erhält.

Die unterschiedlichen Intensitäten können herangezogen werden, um den Roboter je nach Bereich in dem sich die Sensor-Werte befinden, entweder steiler oder flacher zur Linie oder zurück zur weißen Fläche fahren zu lassen.

Beispiel - Anzeigen der unterschiedlichen Grauwerte

Mit diesem Skript werden die unterschiedlichen Grauwerte angezeigt, wenn ein Sensor über die Grenze zwischen schwarz und weiß bewegt wird. Diese können dienen, um in der Folge Wertebereiche zu ermitteln und festzulegen, in denen unterschiedlich starke Korrekturbewegungen in Richtung der Linie oder in Richtung des weißen Bereichs gemacht werden.

Bei der tatsächlichen Steuerung des Roboters soll (muss) in der Folge auf gleichzeitge Anzeigen am Display verzichtet werden, da das Übergeben eines Strings an das Display sehr zeitintensiv ist und dazu führt, dass Reaktionen auf Sensorwerte innerhalb der Endlosschleife nicht schnell genug ausgeführt werden!

import cyberpi, mbot2, mbuild

while True:
int_s2 = mbuild.quad_rgb_sensor.get_gray(2)
cyberpi.display.show_label("Gray: " + str(int_s2),24,0,0)
Beispiel - Optimiertes Folgen einer Linie bei unterschiedlichen Grauwerten

Im folgenden Beispiel werden die möglichen Werte des Sensors in fünf unterschiedliche Bereiche aufgeteilt und davon ausgehend unterschiedlich große Unterschiede für die Geschwindigkeiten der beiden Motoren gesetzt.

Optimierung bei realen Bedingungen und einem vorgegebenen Streckenverlauf:

  • experimentelle Bestimmung der Bereiche basierend auf den tatsächlichen Lichtverhältnissen
  • Hinzufügen weiterer Bereiche (z. B. in Schrittweiten von nur 5 oder 10 Graustufen, anstatt 20)
  • Anpassung der Motorgeschwindigkeiten und der Differenzen zwischen beiden an den Kurvenverlauf
import cyberpi, mbot2, mbuild

while True:

int_s2 = mbuild.quad_rgb_sensor.get_gray(2)

if int_s2<20:
mbot2.EM_set_speed(40,1)
mbot2.EM_set_speed(-10,2)
if int_s2>=20 and int_s2<=40:
mbot2.EM_set_speed(30,1)
mbot2.EM_set_speed(-15,2)
if int_s2>40 and int_s2<60:
mbot2.EM_set_speed(20,1)
mbot2.EM_set_speed(-20,2)
if int_s2>=60 and int_s2<=80:
mbot2.EM_set_speed(15,1)
mbot2.EM_set_speed(-30,2)
if int_s2>80:
mbot2.EM_set_speed(10,1)
mbot2.EM_set_speed(-40,2)
Erklärungen zu diesem Skript

1: import cyberpi, mbot2, mbuild

Import der Module cyberpi, mbot2 (Motoren) und mbuild (Quad RGB Sensor)

5: int_s2 = mbuild.quad_rgb_sensor.get_gray(2)

In dieser Zeile wird der aktuelle Grauwert, den der Sensor 2 ermittelt, in der Variable int_s2 abgelegt.

7: if int_s2<20:

Hier wird überprüft, ob der Grauwert des Sensors kleiner als 20 ist, wo sich der Sensor also fast vollständig über der schwarzen Linie befindet. Ist dies erfüllt, so gibt es eine recht starke Korrektor in Richtung des weißen Bereichs mit dem Setzen der Motorgeschwindigkeiten in den nächsten beiden Zeilen.

13: if int_s2>40 and int_s2<60:

Liegt der Grauwert zwischen 40 und 60, so befindet sich der Sensor recht genau direkt über der Grenze zwischen schwarz und weiß. Hier erfolgt keine Korrektur, der Roboter soll in diesem Fall geradeaus fahren, was durch das Setzen der gleichen Motorgeschwindigkeiten in den nächsten beiden Zeilen erfolgt.