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