Liste der Anhänge anzeigen (Anzahl: 1)
Hey Sternthaler, hey mare_crisium,
Zitat:
Zitat von jeffrey
... das ergebnis wird natürlich umso besser, je kleiner die störungen sind...
Der Vollständigkeit halber muss ich dazu noch etwas sagen. Wir arbeiten digital (ja ja, das wisst Ihr), selbst floating point ist da von begrenzter Genauigkeit. Und das kann natürlich bei kleinen Messwerten (bei integer kanns fürchterlich werden) zu Problemen führen.
Das beiliegende Bild (aus einer völlig anderen Thematik) zeigt ein Beispiel. Der untere Graph ist eine Art Geschwindigket. Sieht relativ gut aus, nicht wahr? Der obere Graph ist - schon wieder, aber es zu erklären würde zu weit führen - eine Art Ableitung des ersten Graphen. Man sieht nun das jämmerliche Messrauschen. Durch kleine Incremente werden die nur finit langen Messwert-Differenzen teilweise so klein, dass Rundungsfehler eintreten (das ganze lief mit double precision - aber die Messwerte hatten eben keine 15 signifikanten Stellen), die zu einem Rauschen um den Nullpunkt führen. Insgesamt macht das nix aus - aber wenn man einen begrenzten Abschnitt betrachtet (oder auswertet), dann hat man wirklich Probleme!
Mit ähnlicher Problematik hat der integrierende Regler zu tun - der zwar allmählich irre genau werden kann, aber OHNE freigeschnittenen "Mittelstreifen" um den Sollwert zum Schwingen neigt.
Und bei kleinen "Störungen" - und/oder bei Schleichfahrt - könnten natürlich adaptive Algorithmen erst RICHTIG ihre Probleme zeigen.
Hab ich mich verständlich gemacht?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
fürs raten war das ziemlich gut. Du hättest heute Lotto spielen sollen. Wären mindestens 6 richtige gewesen, ob es für die richtige Zusatzzahl auch noch gereicht hätte, muss ich mir mal morgen anschauen ;-)
Habe hier mal die Formel als Bild, so sollte es verständlicher sein. Wie gewünscht dieses mal Kp nicht vor der Klammer, ist völlig egal, dann hat man halt ein anderes Kd, bzw. Ki für das gleiche Reglerverhalten, das ist das gleiche, was ich meine, wie sich die Konstanten ändern, wenn man die Abtastzeit ändert.
e sind die Abweichungen vom Sollwert zum Zeitpunkt k, bzw k-1.
So jetzt dann aber gute Nacht.
Gruß Jeffrey
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen,
ja, es wird so langsam Weihnachten.
Genau aus diesem Grund, und weil der erste Ansatz nun im Asuro steckt, hier mal auf die schnelle das ganze Zeug.
Die rechnende Funktion als Ausschnitt aus asuro_st.c:
Code:
/*****************************************************************************
FUNKTION: NaviCalc
Aufgabe: Funktion zur Berechnung der Navigationswerte.
Diese Funktion wird im ADC-Interrupt aufgerufen um die aktuellen
Positions-Koordinaten und Richtung vom Asuro anhand der Daten
der Odometrie zu berechnen.
Ausgewertet werden die globalen Variablen count36kHz_l .._r
Die Ergenisse werden in einer globalen Datenstruktur fuer die
Anwendung zur Verfuegung gestellt.
Parameter: seite Angabe, an welcher Rad-Seite der Tik gerade
aufgetreten war.
Global: count36kHz_l
count36kHz_r
V011 26.11.2007 Sternthaler
Funktion in erster Version
*****************************************************************************/
unsigned char NaviCalc (
unsigned char seite)
{
static double speed_last_l = 0;
static double speed_last_r = 0;
double speed_l;
double speed_r;
double speed, omega, zeit;
double omega_zeit = 0, speed_zeit = 0;
static double phase_x = 0;
static double phase_y = 1;
static double pos_x = 0;
static double pos_y = 0;
if (seite == RECHTS)
{
speed_l = speed_last_l;
speed_r = 10789.0 / count36kHz_r;
speed_last_r = speed_r;
zeit = count36kHz_r / 36000.0;
count36kHz_r = 0;
}
else
{
speed_l = 10789.0 / count36kHz_l;
speed_r = speed_last_r;
speed_last_l = speed_l;
zeit = count36kHz_l / 36000.0;
count36kHz_l = 0;
}
/*
Mittelere Geschwindigkeit
*/
speed = (speed_r + speed_l) / 2;
/*
Drehwinkel. Die 10.36 sind der Radabstand.
*/
omega = (speed_r - speed_l) / 10.36;
/*
Neue Phasenwerte berechnen
*/
omega_zeit = omega * zeit;
phase_x = phase_x - phase_y * omega_zeit;
phase_y = phase_y + phase_x * omega_zeit;
/*
Und endlich auch die neuen X- und Y-Positonen
*/
speed_zeit = speed * zeit;
pos_x = pos_x + phase_x * speed_zeit;
pos_y = pos_y + phase_y * speed_zeit;
MD_RAD_POS_HIST ((int)(pos_x * 100), (int)(pos_y * 100));
return 0;
}
Ich weiß. Noch wird mit Fließkomma gerechnet. Noch sind nicht alle notwendigen Rechenschritte vorhanden. Und auch bei der Berücksichtigung der beiden Tik-Zeiten-Zähler ist bestimmt noch ein dicker Fehler vorhanden.
Aber, das Ergebnis ist schon nicht allzu schlecht.
Die besten Zahlen stecken zur Anschauung im Excel-Diagramm.
@mare_crisium
Deine neueste Version V06 ist noch nicht gelesen. Ich schätze, dass ich somit um das Schätzen dann demnächst auch nicht herrumkommen werde. Ich schätze aber, dass dies auch wieder etwas dauern wird :Ostern .
Zitat:
Zitat von oberallgeier
... für die Trägheit des Dings, ...
Ich fühle mich geradezu angesprochen. :cheesy:
P.S.: Ich glaube, der Asuro mit Taucheranzug ist noch nicht gebaut worden ;-). Du erklärst die Probleme immer sehr schön bildlich. Klasse.
So, viel Spaß mit dem Codehaufen.
Gruß Sternthaler
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen.
Nun, Weihnachten ist definitiv vorbei.
Also, das Thema ist noch lange nicht vom Tisch und mit der Hartnäckigkeit eines verzweifelten Asurobesitzers geht es nun weiter.
Zur Erinnerung:
- Mathematik zur XY-Berechnung ist vorhanden (Dank mare_crisium)
- Rechenleistung zur Umsetzung im AVR scheint gegeben zu sein.
- Verlagerung in Interrupt steht an. (Sternthaler (ich) behauptet dies.)
Mein Problem ist folgendes:
Das im Anhang vorliegende Testprogramm liefert nicht immer Geschwindigkeitsdaten von 0, wenn die Motoren NICHT drehen. Das ist definitiv falsch. Ich habe aber keine Vorstellung, wo der Fehler steckt.
Vorgehen im Programm:
- Timerinterrupt zählt 1/36000 Sekunden.
- Timerinterrupt startet Odometrie-Messungen (AD-Wandler).
- AD-Interrupt zählt Odometriewechsel .
- Hauptprogramm sendet per asuro_st.c/NaviPrint() Odo-Daten und Zählerdaten alle 500 ms an PC.
- PC wertet diese Daten in Excel aus, und kommt bei stehenden Motoren mit den übertragenen Daten NICHT zum Ergebnis, dass die Motoren stehen.
--> Somit würden XY-Koordinaten berechnet, die falsch sind.
Die Messdaten sind so zustande gekommen, dass die Motoren:
- nicht drehen
- langsam drehen
- nicht drehen
- schnell drehen
- nicht drehen
- langsam drehen
- nicht drehen
In den Exceldaten sieht man aber:
- "nicht; langsam; NICHT nicht; schnell; nicht; mittel; NICHT nicht"
- "nicht; langsam; nicht; schnell; NICHT nicht; langsam; nicht"
In keiner meiner unendlichen Messreihe schaffe ich es, dass beim "nicht drehen" eine Geschwindigkeit von 0 reproduziert werden kann.
So lange die Motoren drehen, scheinen korrekte Daten erzeugt zu werden. Nur bei einer Geschwindigkeit von definitiv 0 werden meistens falsche Daten erzeugt.
Irgendwo ist da von mir ein Wurm eingebaut worden.
HILFE, wer findet den Wurm?
Auch wenn oberallgeier in einem anderen Thread sagt, dass ich "nebenher" noch beschäftigt bin, so ist dieses Thema immer noch eine 'Herzensangelegenheit' bei mir :).
Ich könnte euch mittlerweile auch noch Fotos vom Flur ohne Tapeten beilegen, aber ich glaube, dass ihr schon lange wisst, dass ich gerne und viele neue Tapeten an Wände pappe. (Zumindest will dies meine Frau so.)
Gruß Sternthaler