Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit Odometrie geradeaus fahren?
RoboRace
25.03.2006, 19:51
Hallo zusammen,
ich bin ein Newbie in Sachen ASURO. Kann mir jemand helfen? Ich möchte gerne mit meinem ASURO möglichst gerade fahren. Im folgenden Code habe ich versucht die Odometrie zu nutzen. Was mache ich falsch???
Danke.
void geradeaus(int m){
int speedLeft = 255;
int speedRight = 255;
int posLeft = 0;
int posRight = 0;
int flagLeft = FALSE;
int flagRight = FALSE;
int schwelle = 255;
unsigned int data[2];
while (posLeft < m){
OdometrieData(data);
//linkes Rad
if ( (data[0] < schwelle) && (flagLeft == TRUE)) {
flagLeft = FALSE;
}
if ( (data[0] > schwelle) && (flagLeft == FALSE)) {
posLeft ++;
flagLeft = TRUE;
}
//rechtes Rad
if ( (data[1] < schwelle) && (flagRight == TRUE)) {
flagRight = FALSE;
}
if ( (data[1] > schwelle) && (flagRight == FALSE)) {
posRight ++;
flagRight = TRUE;
}
//ggf. links oder recht in bisschen bremsen
if ((posLeft-posRight)>3) {
StatusLED(GREEN);
speedLeft--;
}
else if ((posLeft-posRight)<-3) {
StatusLED(RED);
speedRight--;
}
else {
StatusLED(OFF);
posLeft = posLeft = 0;
speedLeft = speedLeft = 255;
}
MotorSpeed(speedLeft,speedRight);
}
MotorSpeed(0,0);
}
Probier es doch mal mit diesem minimal Programm:
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(175,175);
while(1){
diff=encoder[RIGHT]-encoder[LEFT];
MotorSpeed(175+diff,175-diff);
}
RoboRace
26.03.2006, 09:40
Hallo,
die Lösung sieht interessant aus, aber woher hast du die Methode Encoder_Init????
Gruß RoboRace
Die sind fertig in der asuro.c
* Encoder_Init() initializing encoder-counter
* Encoder_Start() start autoencoding
* Encoder_Stop() stop autoencoding
Die aktuelle Versinon kannst du hier finden: http://sourceforge.net/project/showfiles.php?group_id=155217
RoboRace
06.04.2006, 18:04
Prima, danke für Deine Antwort. Funktioniert!
RoboRace
06.04.2006, 18:05
Prima, danke für Deine Antwort. Funktioniert!
Westside
12.04.2006, 16:40
Hi, ich habe von ein paar Tagen ein Programm geschrieben, dass der Asuro Roboter ein Hindernis umfahren kann. Mein Problem ist, dass der Asuro nicht geradeaus fährt...ich bitte sie daher, ob sie mir mit der Odometrie helfen können, damit ich dieses Problem so schnell wie möglichst beheben kann.
mfG Westside
Westside
12.04.2006, 17:02
dieses kleine Programm, dass vogon gepostet hat, geht bei mir nicht....wenn ich es compiliere, dann kommen 2errors und etwa 4warnings.
mfG Westside
Westside
12.04.2006, 17:45
ich habe diese Problem jetzt beheben können....
ich hätte ja von Anfang an drauf kommen können, dass das main und viele andere dinge noch fehlten....jedenfalls habe ich jetzt keinen Fehler mehr!Vielen Dank!!!!
mfG Westside
Pitchriddick
22.10.2006, 00:07
Hi, was hat dieses flagRight = TRUE; int flagLeft = FALSE; usw. zu bedeuten ?
wie kann ich den zurückglegten Weg beim Asuro messen , in cm ?
damaltor
22.10.2006, 13:55
Hi, was hat dieses flagRight = TRUE; int flagLeft = FALSE; usw. zu bedeuten ?
wie kann ich den zurückglegten Weg beim Asuro messen , in cm ?
Bitte benutze die Suchfunktion, zu diesem Thema sind schon viele threads offen... Du kannst die Strecke nicht Messen, zumindest nicht direkt. du kannst nur mithilfe der odometriesensoren Helligkeitswerte der Signalscheibe am Getriebe abfragen. Daraus kannst du versuchen, die Anzahl der Radumdrehungen abzuleiten. und davon kommst du evtl auf die gefahrene Strecke, in einer Maßeinheit deiner Wahl. aber beachte dabei dass eine umdrehung der signalscheibe nicht zwangsläufig auch eine umdrehung des Rades ist...
Pitchriddick
22.10.2006, 14:47
damaltor, ich habe schon fast alle Themen in diesem Asuro Forum gelesen, werde aber einfach nicht schlau... was soll ich denn noch machen :-k
frage nebenbei, warum funktioniert dieses programm nicht
#include "asuro.h"
int main(void)
{
int speedl=130, speedr=110;
unsigned int data[2];
Init();
while(1){
OdometrieData(data);
FrontLED(ON);
MotorDir(RWD,RWD);
MotorSpeed(speedl,speedr);
OdometrieData(data);
if(data[0]<data[1]){ //Hier dran liegt es bestimmt ?
FrontLED(OFF); //Blinkt nur wahnsinnig schnell
}
}
return 0;
}
Danke für eure Hilfe
damaltor
22.10.2006, 15:38
die odometriedata funktion gibt keine geschwindigkeitsangabe aus bzw speichert sie in "data". durch diese funktion bekommst du nur den aktuellen helligkeitswert der linken bzw der rechten lichtschranke. wenn also die linke schranke gerade ein helles feld "sieht" und die recht ein dunkles, dann ist der wert für die rechte schranke kleiner. dadurch ist nicht zwangsläufig auch die geschwindigkeit des rades kleiner! versuche, die übergänge zwischen hell und dunkel zu zählen (zB über 500 Millisekunden) und dann finde heraus, auf welcher seite mehr hell- und dunkelübergänge passiert sind. dann weisst du, dass auf dieser seite die motorleistung etwas zurückgefahren werden muss.
mfg
Toschtosch
22.10.2006, 16:44
benutze doch einfach aus der asuro.c die go() funktion, damit fährst du nicht exakt gerade sondern eher in so kleinem "zick-zack" weil er immer ausmisst und dann auf der einen seite dazuaddiert bzw wenn die zahl über 244 ist, abzieht
Pitchriddick
23.10.2006, 00:49
versuche, die übergänge zwischen hell und dunkel zu zählen (zB über 500 Millisekunden)
Und wie geht das genau ? Sorry, aber ich verstehe nur sehr langsam...
damaltor
23.10.2006, 09:12
stell den mtor an, so dass er fährt. dann machst du eine variable für die übergänge des linken rades und eine variable für die übergänge des rechten rades. und dann misst du in einer endlosschleife die werte für den rechten bzw linken odometriesensor uns speicherst ihn in einer zweiten variable zwischen (z.B. "TEMP") und wenn der neue wert kleiner als TEMP ist, dann ist offensichtlich gerade eine schwarze fläche vor dem sensor, der vorher einen hohen wert für die helle fläche gemessen hat. also: 1 Übergang. den speicherst du in der zuerst genannten variable. und das gleihe machst du beim linken rad.
wenn die schleife ca 300-500mal durchgelaufen ist, dann vergleichst du die beiden werte: sind rechts mehr übergänge als links, dann musst du den rechten motor zurückfahren. aber nur ein bisschen! durch die nächste messung in der endloschschleife zeigt sich ja, ob es genug war. und wenn du links mehr übergänge hast als rechts, dann musst du DEN RECHTEN MOTOR SCHNELLER MACHEN, nicht den linken langsamer! ansonsten werden die motoren abwechselnd immer langsamer, bs der asuro steht. =)
Jetzt setzt du alle Variablen zurück auf 0, und dann fängt die endlosschleife wieder an.
also das wäre das was mir spontan enfallen würde, es gibt bestimmt viele einfachere lösungen und ch werde vermutlich gesteinigt in den nächsten 20 posts, aber das wre meine spontane idee.
wenn du es geschafft hast, dann lass dir die aktuellen motorwerte per infrarot ausgeben, und dann kannst du sie in deinen programmen verwenden ohne jedes mal sone aktion zu machen =)
Toschtosch
23.10.2006, 13:44
und wenn du links mehr übergänge hast als rechts, dann musst du DEN RECHTEN MOTOR SCHNELLER MACHEN, nicht den linken langsamer! ansonsten werden die motoren abwechselnd immer langsamer, bs der asuro steht. =)
du solltest dann in die schleife aber auch einfügen das er testet ob das jeweils andere rad schon bei 244 ist, denn dann musst du es runtersetzen ( max speed 255 // 11 als "buffer")
z.b.
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
mfgchen
Pitchriddick
24.10.2006, 14:24
Mit der Funktion Encoder kann ich doch auch den zurückgelegten Weg messen oder? Dann brauch ich ja kein extra Programm zu schreiben ?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.