PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer hat den Linien-Entlang-Fahr Algorithmus verstanden?



Simsys
02.02.2007, 20:54
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!


/************************************************** *****************************
*
* 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

damaltor
02.02.2007, 21:30
naja.. er versucht halt, immer den einen sensor auf einem hellen untergrund und den anderen sensor auf einem dunklen hintergrung zu halten. so ist normalerweise unter einem der transistoren die linie.

unter dem linken transistoe muss die dunkle seite sein, also wird er da normalerweise die linie hinbugsieren. wenn er die linie verliert (der linke transistor einen niedrigen widerstand hat) gibt es zwei möglichkeiten: der rechte sensor, der eigentlich nur "weiss" sieht, wird dunkler --> der asuro dreht ein wenig nach rechts, um die linie zurückzufinden. oder: der rechte sensor meldet keine veränderung, und der asuro dreht in die andere richtung, um wieder was dunkles auf dem linken sensor zu "sehen".

kann das so sein? dann würde er auch auf der kante fahren.

Simsys
02.02.2007, 22:01
Sorry, aber dafür gebe ich keinen Keks.

Ich lasse den Asuro auf der dunklen Fläche starten. Da bestimmt er erst mal den Offset. Die beiden Helligkeitswerte werden dann von einander abgezogen. Solange ein Messwert größer ist als der andere wird der Asuro das entsprechende Rad dauernd bremsen und er fährt eine Kurve. Es kann niemals zum Ausgleich und so zur Geradeausfahrt kommen.

Er macht es aber trotzdem und ich weiß auch warum.

Simsys

damaltor
02.02.2007, 23:32
hmm... na gut, werd noch bissl drüber nachdenken...

Simsys
03.02.2007, 14:18
Wie sieht es aus? Keine Idee? Das kann ich nicht glauben...

In diesem Film (http://www.youtube.com/watch?v=EYLeHWCnxP4) könnt ihr sehen, dass unser Asuro tatsächlich die Kante verfolgt.

Tipp 1: Habt ihr es mit eurem Asusro schon mal versucht? Funktiert das auch? Die Chancen dazu stehen etwa 50 zu 50. Wenn euer Kleiner nicht in der Lage ist einer Kante zu folgen, solltet ihr im Quelltext die Zeile mit "Helle Linie" auskommentieren und dafür bei der folgenden Zeile ("dunkle Linie") die Kommentarzeichen entfernen. Dann sollte es gehen. Es könnte theoretisch auch Asuros geben, die mit diesem Programm gar nicht in der Lage sind Kanten zu folgen.

Viel Spaß beim knobeln. Wenn ihr es heraus bekommen habt, dann bitte eine Mail an mich (simsys.miller@googlemail.com) damit die Spannung für den Rest noch ein wenig erhalten bleibt.

Beste Grüße
Simsys

damaltor
03.02.2007, 14:22
kann es sein dass er versucht, beide sensoren über dem hellen zu behalten? wenn ein sensor dunkel wird, dreht er nach rechts. das würde auch erklären, warum es nur in eine richtung funktioniert..

Simsys
04.02.2007, 11:39
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

Simsys
05.02.2007, 20:40
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.

damaltor
05.02.2007, 23:01
macht sinn eigentlich... schönes experiment!