Wer hat den Linien-Entlang-Fahr Algorithmus verstanden?
Hallo,
schon mal aufgefallen? Der nachfolgende Algorithmus funktioniert nicht nur bei Linien sondern auch an Kanten. Beispiel: Lege ich ein helles stück Papier auf einen dunklen Untergrund, so fährt der Asuro brav an der Kante entlang. Mein Asuro macht das, wenn die helle Seite rechts liegt, andersherum nicht. Wieso eigentlich?
Ich hatte ein anderes Verhalten erwartet. Ich dachte, an der Grenze dreht er entweder ab oder hin (je nachdem ob rechts oder links), über dem hellen oder dunklen Untergrund angekommen, sollte er eigentlich dann geradeaus von der Kante weg fahren. Also kann er niemals an der Kante entlang "regeln".
Tut er aber!
Code:
/*******************************************************************************
*
* Original: File Name: LineDemo.c by Jan Grewe
* Copyright (c) 2003 DLR Robotics & Mechatronics
*
* Geändert: Simsys
*
***************************************************************************
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
***************************************************************************/
#include "asuro.h"
#define MAXSPEED 140
#define MINSPEED 30
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void)
{
speedRight -= 1; /* rechts bremsen */
if (speedRight < MINSPEED)
speedRight = MINSPEED;
}
void LineRight (void)
{
speedLeft -= 1; /* links bremsen */
if (speedLeft < MINSPEED)
speedLeft = MINSPEED;
}
int main(void)
{
int i;
unsigned char j;
Init();
FrontLED(ON);
for (j = 0; j < 0xFF; j++)
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = MAXSPEED;
StatusLED(GREEN);
while (1) {
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset; // Helle Linie
// i = (lineData[RIGHT] - lineData[LEFT]) + ADOffset; // Dunkle Linie
if ( i > 4)
LineLeft();
else {
if ( i < -4)
LineRight();
else
speedLeft = speedRight = MAXSPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}
(Funktioniert auch mit dem original "LineDemo.c")
Wer es als erster heraus bekommt, hat einen virtuellen Keks verdient!
Gruß
Simsys
Asuro meidet dunklen Untergrund
Hallo damaltor,
die Strecke in dem Filmchen oben hat Rechts- und Linkskurven. Der Asuro folgt den Kurven tadellos. Außerdem sieht man das typische hin- und herruckeln entlang der Kante. Er korrigiert also in beide Richtungen. Das ist ja gerade das Merkwürdige.
-----------------------------
An alle:
Im zweiten Film (http://www.youtube.com/watch?v=tE-DL_kYTeg) sieht man ein anderes Verhalten. Hier startet der Asuro mit dem gleichen Programm auf der weißen Fläche und jetzt ist er nicht mehr in der Lage der Kante zu folgen. Er meidet den dunklen Untergrund. Er fährt hinaus, dreht und kommt wieder zur weißen Fläche zurück und fährt dort geradeaus weiter. Er kann jetzt der Kante nur noch bei Rechtskrümmungen folgen, Linkskurven schneider er ab.
Tipp 2: Es genügt nicht, nur den Algorithmus zu betrachten. Daraus lässt sich das Verhalten nicht ableiten. Wenn man auf dunkler Fläche startet, dann fährt er auf hellen Flächen Kreise. Wenn man auf hellen Flächen startet, fährt er auf dunklen Flächen Kreise. Wieso macht der das?
-----------------------------
Nochmal meine meine Frage vom Anfang: Wieso kann der Asuro mit dem Linen-Verfolgungs-Programm auch Kanten verfolgen?
Für die richtige Antwort gibt es einen digitalen Keks! Wie sieht es aus ihr m.a.r.v.i.ns., stochris, wastes und alle anderen: Wie bekomme ich euch aus der Reserve?
Gruß
Simsys
Liste der Anhänge anzeigen (Anzahl: 1)
OK, hier die Lösung:
Das Verhalten kommt zustande, weil die beiden Sensoren unterschiedlich lichtempfindlich sind. Dadurch ergibt sich zwangsläufig ein Punkt, bei dem Asuro der Meinung ist die beiden Sensoren seien gleich hell. Wenn die Vorzeichen richtig sind, dann regelt der Asuro um diesen Punkt herum. In dem ersten Film sieht man sehr schön, dass die Kante nicht zwischen den beiden Empfangselementen, sondern unterhalb einem Empfänger liegt was für die These spricht.
Im nachfolgenden Bild sieht man die bei unserem Exemplar gemessenen Helligkeitswerte. Ich habe die Werte aufgenommen, in dem ich den Asuro 0,5-cm-weise seitlich in Richtung Kante versetzt habe und mir die Helligkeitswerte ausgeben lies. Der linke Sensor bringt es auf maximal 83, der rechte Sensor auf 57 über weißem Untergrund. Der Schnittpunkt liegt bei etwa 2,7 cm. Der Linien-Entlang-Fahr-Algorithmus zieht den einen vom anderen Wert ab. Bei 2,7 cm ist die Differenz 0, bei 2 cm negativ und bei 3,5 cm positiv (Bild). Dieser Wechsel von plus nach minus ist notwendig, damit der Asuro in beide Richtungen korrigieren kann. Unser Asuro regelt im Bereich von 1,2 bis 4,5 cm korrekt. Dieser Bereich ist weit größer, als über einer Linie.
Bei anderen Asuros könnten die Sensoren vertauscht sein, diese brauchen dann eine inverse Logik oder man muss sie vom hellen statt dem dunklen Untergrund starten. Das erklärt auch, warum der Asuro, wenn über schwarz gestartet auf hellem Untergrund Kreise dreht und umgekehrt (scheinbare andauernde Differenz der Helligkeit).
Mich hat an dieser Sache fasziniert, dass hier eine brauchbare zusätzliche Funktion aufgrund von "Dreckeffekten" oder "Unvollkommenheiten" der Hardware zustande kommt. Wäre die Hardware ideal, wäre diese Experiment nicht erfolgreich.
Beste Grüße
Simsys
PS: Ich freue mich über jeden Kommentar.