man könnte es mit einer "for" schleife machen.
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
man könnte es mit einer "for" schleife machen.
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.
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
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.
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
es wird also ein mittelwert gebildet, der zur berechnung nur jeweils den vorherigen messwert benötigt, die variable a entspricht der gewichtung...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];
somit braucht man nicht soviel speicher...damit klappt das erkennen einer verlorenen linie ganz gut
Lesezeichen