Odometrie Programm Probleme
Hallo!!
Endlich hab ich mal wieder Zeit gefunden um mich mit dem asuro zu beschäftigen.
Ich hab mich mal an die Odometrie gewagt und eigentlich meiner Meinung nach ein nicht so schlechtes Programm geschriebenm welches nur leider nicht funktioniert.
Code:
#include "asuro.h"
int main (void)
{
unsigned int data[2];
unsigned int L_alt_l[1]; //Letzte Wert des linken Fototransistors
unsigned int L_alt_r[1]; //Letzte Wert des rechten Fototransistors
float n_l;
float n_r;
int a; //Hilfsvariable
int b; //Hilfsvariable
unsigned char c; //Wert für die Geschwindigkeit des linken Motors
unsigned char d; //Wert für die Geschwindigkeit des rechten Motors
int dh_l;
a = 0;
b = 0;
c = 140; // Wert für linken Motor bestimmen
d = 140; // Wert für rechten Motor bestimmen
Init();
OdometrieData(data);
MotorDir(FWD, FWD);
while(1)
{
MotorSpeed(c, d);
L_alt_l[0] = data[0];
L_alt_r[0] = data[1];
OdometrieData(data);
dh_l = data[0] - L_alt_l[0];
if( dh_l > 200)
{
a++;
n_l=a/8; //Umdrehungen in der Zeit t
}
if( data[1] - L_alt_r[0] > 200 || data[1] - L_alt_r[0] < -200)
{
b++;
n_r=b/8; //Umdrehungen in der Zeit t
}
if( n_l < n_r)
{
d--; //Geschwindigkeit des rechten Motors verkleinern
}
if( n_l > n_r)
{
c--; //Geschwindigkeit des rechten Motors verkleinern
}
}
}
könnt ihr da vielleicht wo nen Fehler entdecken, oder ist das ganze generell falsch was ich da mache? Bitte nicht wunder das ich im unteren Teil für die Berechnung der Differenz zwei verschieden Methoden angewandt habe, will damit nur zeige das es mit keiner der zwei funktioniert.
mfg Chrise
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chrise,
mein Fehler. Jetzt habe ich das MotorSpeed() auch im ersten Programm gefunden. Ist meinen wild suchenden Augen irgendwie entfleucht.
Dann nun also zum eigendlichen Inhalt.
Code:
L_alt_l[0] = data[0];
L_alt_r[0] = data[1];
OdometrieData(data);
dh_l = data[0] - L_alt_l[0];
Hier in dh_l bestimmst du die Differenz zwischen 2 hintereinander gemachten ODO-Messwerten.
Mit Folgendem untersuchst du diese Differenz auf einen Sprung um mehr als 200 Messeinheiten um a zu beeinflussen:
Code:
if( dh_l > 200 || dh_l < -200)
{
a++;
}
Ähnlich machst du das dann auch für die rechte Seite.
Und schon fängt dein Programm wieder von vorne an.
Unterm Strich hast du als größten Zeitfresser nur den Aufruf der Funktion OdometrieData(). Dort werden gerade mal 2 AD-Wandlungen gemacht, die so langsam auch nicht sind.
Nun passiert also folgendes:
- Die Odo-Scheiben drehen sich vor den Sensoren
- Du misst kontinuierlich die Helligkeitsänderungen
- Du untersuchst die Messwerte auf eine Differenz von mehr als 200 Einheiten
- Du berechnest 'Geschwindigkeitsanpassungen' in d und c
Ich glaube, dass dein Asuro startet, und dass sich die Geschwindigkeit überhaupt nicht ändert, so dass er in einem Bogen im Kreis fährt.
Das wird daher kommen, dass die Differenzen zwischen 2 hintereinander gemachten Messungen keinesfalls größer als 200 Einheiten sein werden. (Ausnahmen bestätigen die Regel)
Um dir hier nicht alles direkt zu verraten, nur mal ein Hinweis auf einen Thread zu diesem Thema: farratt weist auf einen
Sinusverlauf der Daten hin.
Und dazu dann auch ein Bildchen. Die oberen 10-Bit-Daten gelten für die Funktion OdometrieData().
Es waren ungefähr 30 Messungen in einem Sinuszyklus!
Gruß Sternthaler
Liste der Anhänge anzeigen (Anzahl: 2)
Sorry für doppel Post, aba bei mir geht das nicht anders oder ich bon zu blöd dafür!
Das zweite Diagramm sieht in etwa gleich aus, nur die rote Linie hat einen anderen Verlauf
mfg