Hallo flobot,
erst einmal herzlich willkommen hier im Forum.
Dein Ansatz zur Geradeausfahrt finde ich nicht schlecht. Leider ist nicht immer alles so einfach wie es scheint.
Ich habe mal ein paar Fotos (Film ist zu viel Datenzeugs) angehängt um dir mal das Problem mit meinem Asuro zu zeigen.
Bei mir ist der rechte Motor miserabel (Tschuldigung, einige von euch wissen das schon.), so dass mein Asuro immer mit einer Rechtskurve startet wenn man nichts dagen tut.
Trotzdem ist dein Ansatz auch bei meinem Asuro ungefähr nach 3 Metern funktionsfähig und der Asuro fährt recht ordentlich geradeaus. Klasse Arbeit!
Was ich an deiner Lösung besonders toll finde, ist dass die Reglung ja einen interessanten Ansatz zum lösen des Umgebungslichtproblems hat.
Hierzu ist meines Wissens nach noch kein 'herzhafter' Versuch im Forum aufgetaucht. Ich habe auch gleich eine dicke Taschenlampe zum ärgern vom Asuro rausgekramt und bin echt begeistert wie klein die Abweichungen vom rechten Weg dann sind. Licht aus machen und freudig den geraden Weg sehen war auch nicht schlecht.
Natürlich kommt jetzt nach dem Lob auch gleich das große Fragezeichen in Form von 2 Anmerkungen.
Wenn du auch den Asuro benutzt, hast du als CPU den ATmega8 eingebaut. Das Ding hat gerade mal 1K-Byte RAM.
Du hast in deinem Program aber schon 2 int-Variablen (a 2 Byte) als Array mit jeweils 500 Elementen angelegt. Somit benötigst du eigendlich 2 * 500 * 2 Byte. Ist ein bisschen zu viel. Ich habe bei mir im Programm das ganze über popSize=220 auf 'nur' 880 Byte reduziert. Dann bleibt noch ein Rest für die anderen Variablen und hoffentlich genug für den Stack übrig.
Als 2-tes finde ich deine geschachtelte Schleife in der Funktion findMd sehr 'brutal'. Du loopst mit deinen 500 aus popSize immerhin 250.000 mal da drin rum. Ist es wirklich sinnvoll den Median zu berechnen? Wäre hier ein Mittelwert nicht genauso gut?
Nun noch eine kleine Überschlagsrechnung zu deiner Frage zum Takt der Odometriedaten.
Überschlagen deshalb, da ich nicht zu jedem Maschinenbefehl nachgesehen habe, ob da 1 oder 2 oder auch mal 3 Takte verballert werden.
Ich habe im compilierten Output einfach mal nur die Assemblerbefehle gezählt. Das sind die Angaben mit dem T dahinter.
Deine Loop über OdometrieData
popSize * (29T + 1 * OdometrieData)
Funktion OdometrieData
31T + 2 * ADC
ADC-Wandlung (Hier ist die Zeitangabe recht genau. Maximal plus einen Quarz-Takt)
Quarztakt (1/8Mhz) * 64 (ADC-Vorteiler-In-Init) * 13
(Die 13 gilt ab der 2.ten Wandlung nachdem ADEN eingeschaltet wurde. Für die erste Wandlung muss da ne 25 hin. Vergessen wir das mal ganz schnell wieder, ist ja Haarspalterei)
Ergibt ca.:
ADC-Wandlung = (1 / 8000000) * 64 * 13 = 0,000104 Sekunden
Funktion OdometrieData = 31T + 2 * 0,000104 = 0,000211875 Sekunden
Deine Loop = 500 * (29T + 1 * 0,000211875) = 0,10775 Sekunden
Die Loop in findMd müsste ca. folgende Zeiten haben:
500 * (10 + 2 + 500 * (6 + 17) + 33) = 5772500 Takte = 0,7215625 Sekunden
In Summe verbrennt dein Programm also ca.
2 * findMD + 1 * Loop-Odometrie = 1,55 Sekunden für eine Schleife im Main
Wenn ich für popSize 220 einsetzet, komme ich auf ungefähr 0,68 Sekunden.
Wenn ich die Zeit mal nehme und ein bisschen weiterrechne kommt da folgendes raus:
Ich weiss von meinem Asuro, dass ich ungefähr eine Differenz von 50 in MotorSpeed brauche um halbwegs gerade zu fahren.
Somit brauche ich also ca. 25 mal die Main-Loop. Das sind dann ca. 17 Sekunden.
Da ich die Startgeschwindigkeit mit 150 angegeben habe sollten danach ungefähr die Werte für links und rechts von 125 und 175 rauskommen.
Wenn ich nun schätze, dass ich bei diesen Werten ca. 20 cm pro Sekunde zurücklege und dann knapp 17 Sekunden brauche, müsste mein Asuro nach ca. 340 cm geradeaus fahren.
Scheint also mit meinen oben geschätzten 3 Metern ganz gut im Rennen zu liegen.
So, ich hoffe hier niemanden allzu stark gelangweilt zu haben.
@flobot: Mach weiter so mit guten Ideen.
Lesezeichen