LBotics.at

Verwendet man nur einen Schwellenwert, 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 wurde.

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 größer Krümmung stärker 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.

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.

Programmbeispiel - Optimiertes Folgen einer Linie mit mehreren Bereichen

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
  • Anpassung der Motorgeschwindigkeiten und der Differenzen zwischen beiden an den Kurvenverlauf
#include "evclibrary.h"
int main()
{
// 1. Konfiguration
SET_IN(IN_1,IN_EV3_LIGHT);
SET_OUT(OUT_A,OUT_MOTOR);
SET_OUT(OUT_B,OUT_MOTOR);
// 2. Initialisieren des Brick
EVC_INIT();
// 3. Programm - Roboter
int Wert = 0;
while(NOTEXITBUTTON)
{
Wert = READ_IN(IN_1);
LCD_DRAW_INT(2,2,Wert);
if(Wert<20)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 20);
}
if ((Wert>=20)&&(Wert<=40))
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 30);
}
if ((Wert>40)&&(Wert<60))
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
if ((Wert>=60)&&(Wert<=80))
{
WRITE_OUT(OUT_A, MOTOR_POWER, 30);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
if(Wert>80)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 20);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}