C-H-T
24.03.2009, 00:31
Hallo werte Community,
habe mir ein Programm geschrieben was Kollision per Taster erkennt, ausweicht usw. und noch auf dunkle Flächen achtet und diese meidet (Tischkante oder Klebeband). Das Funktioniert alles perfekt, auch durch ein kleines Labyrinth kommt mein Asuro durch.
Nun passiert es aber mal das er irgendwo hängen bleibt wo gerade kein Taster ist, daher wollte ich nebenbei noch die Odometrie abfragen ob der Asuro sich bewegt, falls nicht Rückwärtsgang rein und umfahren.
Da gibts jetzt das Problem das er selten erkennt das er sich bewegt.. im großen und ganzen fährt mein Asuro nur rückwärts und lenkt kurz nach links ](*,) hab dann noch ein wenig optimiert und er ist paar Sekunden gerade aus gefahren und dann wieder in seine Rückwärts fahren Schleife gekommen obwohl er da ja nix drinnen zu suchen hat wenn er fährt ^^..
Hat da jemand eine Idee wie ich das parallel laufen lassen kann? weil selbst wenn ich die Fehler beim auslesen oder was auch immer da schief läuft beseitige würde der wahrscheinlich bei Kollision wieder reinkommen da der Asuro nicht schnell genug dagegen kracht Rückwärts fährt und umlenkt ohne das meine Odometrie Abfrage dazwischen kommt und meint Asuro steht .. fährt er also unendlich Rückwärts im Kreis..
Also im Prinzip sollte er wenn normal fahren und sobald er zB 2 Sekunden sich nicht von der Stelle bewegt eine Aktion ausführen.
Hab jetzt vor Frust mein Quellcode gelöscht was die Odometrie gesteuert hatte, aber die Funktionsweiße ist fast die selbe wie die ich auf roboter.net-con.net gefunden hatte..
OdometrieData(data); // 0. links, 1. rechts
// Schwellwert für schwarz/weiss linke Seite
if (data[0] > THRES_L)
Lnow = 1;
else
Lnow = 0;
// Schwellwert für schwarz/weiss rechte Seite
if (data[1] > THRES_R)
Rnow = 1;
else
Rnow = 0;
// wenn sich der linke Wert geändert hat zähler ++
if (Lnow ^ Lold) {
Count1++;
fl_Lch = 1;
}
else {
fl_Lch = 0;
}
// wenn sich der rechte Wert geändert hat zähler ++
if (Rnow ^ Rold) {
Count2++;
fl_Rch = 1;
}
else {
fl_Rch = 0;
}
// hat sich der Asuro bewegt ?
if (fl_Rch || fl_Lch) {
// alte werte merken für nächsten schleifendurchlauf
Lold = Lnow;
Rold = Rnow;
diff = Count2 - Count1;
if (diff > 0)
sr--;
else if (diff < 0)
sl--;
else {
sr = 130;
sl = 130;
}
if (sr < 50) {
sr = 0;
}
if (sl < 50) {
sl = 0;
}
}
Wäre toll wenn mir jemand einen Tipp geben kann, vllt gibt es ja auch andere Methoden um herauszufinden ob Asuro steht oder fährt und ob man das nach bestimmter Zeit abfragen kann.. aber nicht mit Sleep oder so weil in der Zeit reagiert er ja dann nicht.
P.S die Sensoren sind vor Fremdlicht geschützt, Median schwarz: 750 und weiß 230
mfg
habe mir ein Programm geschrieben was Kollision per Taster erkennt, ausweicht usw. und noch auf dunkle Flächen achtet und diese meidet (Tischkante oder Klebeband). Das Funktioniert alles perfekt, auch durch ein kleines Labyrinth kommt mein Asuro durch.
Nun passiert es aber mal das er irgendwo hängen bleibt wo gerade kein Taster ist, daher wollte ich nebenbei noch die Odometrie abfragen ob der Asuro sich bewegt, falls nicht Rückwärtsgang rein und umfahren.
Da gibts jetzt das Problem das er selten erkennt das er sich bewegt.. im großen und ganzen fährt mein Asuro nur rückwärts und lenkt kurz nach links ](*,) hab dann noch ein wenig optimiert und er ist paar Sekunden gerade aus gefahren und dann wieder in seine Rückwärts fahren Schleife gekommen obwohl er da ja nix drinnen zu suchen hat wenn er fährt ^^..
Hat da jemand eine Idee wie ich das parallel laufen lassen kann? weil selbst wenn ich die Fehler beim auslesen oder was auch immer da schief läuft beseitige würde der wahrscheinlich bei Kollision wieder reinkommen da der Asuro nicht schnell genug dagegen kracht Rückwärts fährt und umlenkt ohne das meine Odometrie Abfrage dazwischen kommt und meint Asuro steht .. fährt er also unendlich Rückwärts im Kreis..
Also im Prinzip sollte er wenn normal fahren und sobald er zB 2 Sekunden sich nicht von der Stelle bewegt eine Aktion ausführen.
Hab jetzt vor Frust mein Quellcode gelöscht was die Odometrie gesteuert hatte, aber die Funktionsweiße ist fast die selbe wie die ich auf roboter.net-con.net gefunden hatte..
OdometrieData(data); // 0. links, 1. rechts
// Schwellwert für schwarz/weiss linke Seite
if (data[0] > THRES_L)
Lnow = 1;
else
Lnow = 0;
// Schwellwert für schwarz/weiss rechte Seite
if (data[1] > THRES_R)
Rnow = 1;
else
Rnow = 0;
// wenn sich der linke Wert geändert hat zähler ++
if (Lnow ^ Lold) {
Count1++;
fl_Lch = 1;
}
else {
fl_Lch = 0;
}
// wenn sich der rechte Wert geändert hat zähler ++
if (Rnow ^ Rold) {
Count2++;
fl_Rch = 1;
}
else {
fl_Rch = 0;
}
// hat sich der Asuro bewegt ?
if (fl_Rch || fl_Lch) {
// alte werte merken für nächsten schleifendurchlauf
Lold = Lnow;
Rold = Rnow;
diff = Count2 - Count1;
if (diff > 0)
sr--;
else if (diff < 0)
sl--;
else {
sr = 130;
sl = 130;
}
if (sr < 50) {
sr = 0;
}
if (sl < 50) {
sl = 0;
}
}
Wäre toll wenn mir jemand einen Tipp geben kann, vllt gibt es ja auch andere Methoden um herauszufinden ob Asuro steht oder fährt und ob man das nach bestimmter Zeit abfragen kann.. aber nicht mit Sleep oder so weil in der Zeit reagiert er ja dann nicht.
P.S die Sensoren sind vor Fremdlicht geschützt, Median schwarz: 750 und weiß 230
mfg