PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO eine bestimmte Zeit eine Aktion machen lassen



upaucc
29.01.2007, 14:57
Hi an alle,

ich habe mich gefragt ob es prinzipiell möglich ist ASURO eine gewisse zeitlang eine aktion machen zu lassen, also z.b.: erst soll er 5 sekunden geradeausfahren und dann 10 sekunden rückwärts...
habe mir einmal die funktion sleep() in der asuro.c angeguckt, da diese ja im prinzip so funktioniert, daraus bin ich nicht schlau geworden. vielen dank schonmal im vorraus

sloti
29.01.2007, 14:59
man könnte es mit einer "for" schleife machen.

damaltor
29.01.2007, 15:02
du sagst ihm was er machen soll, zB fahre vorwärts.
dann benutzt du sleep() oder Msleep() um eine zeit von 5 bzw 10 sekunden abzuwarten. der asuro macht dann in dieser zeit das was er vorher auch gemacht hat: vorwärts fahren.
jetzt kannst du ihm sagen, was er als nächstes machen soll.

wie man die funktion sleep() einsetzt, steht ganz gut in der anleitung beschrieben. mit Msleep aus der neuen bibliothek gehts sogar noch einfacher.

upaucc
29.01.2007, 15:11
ja, das mit der for-schleife und Msleep() hab ich gewusst, aber ich glaub ich hab die frage oben flasch formuliert, oder zumindest missverständlich.
was ich machen will:
asuro folgt einer linie, verliert er diese bleiben die ausgelesenen werte von LineData() ja konstant, und eben wenn die werte länger als z.B. 2sekunden konstant sind soll asuro in eine Liniensuchprogramm wechseln...hoffe das war einigermaßen verständlich

damaltor
29.01.2007, 15:21
achso...na dann prüf doch einfach über z.B. die letzten 50 messzyklen (könnte evtl zu viel sein für das eine kilobyte ram) ob die werte etwa konstant gewesen sind... öhm...

irgendwie die letzten werte speichern, und dann mit den aktuelllen werten vergleichen oder so.

wenn du das nur von der zeit abhängig machst, und beispielsweise den aktuellen wert mit dem von vor 10 messungen vergleichst oder so, dann könnte es auch zufällig sein, dass die werte sich ähneln und der asuro denkt dann seine linie wäre weg.

upaucc
02.02.2007, 11:03
das mit den messzyklen ist eine super idee, nur wird bei einer mittelwertbildung, wenn man den arithmetischen mittelwert nimmt, wie damaltor schon gesagt hat zuviel speicher verbraucht.
ich habe das jetzt so gelöst, mit einem sog. IIR-Filter, hier mal der code


LineData(data1);
if(i>0){
filterL[1]=(1-a)*data1[0]+a*filterL[0];
filterR[1]=(1-a)*data1[1]+a*filterR[0];
}
else{filterL[1]=data1[0];
filterR[1]=data1[0];}
i=1;
SerWrite("\n\rMittelwert links: ",22);
PrintInt(filterL[1]);
SerWrite(" Mittelwert rechts ",29);
PrintInt(filterR[1]);
filterL[0]=filterL[1];
filterR[0]=filterR[1];
es wird also ein mittelwert gebildet, der zur berechnung nur jeweils den vorherigen messwert benötigt, die variable a entspricht der gewichtung...
somit braucht man nicht soviel speicher...damit klappt das erkennen einer verlorenen linie ganz gut