Hi!
Es hat sich was getan!
Der Code den ich hier (
http://fpv-community.de/showthread....o-vern%FCnftig&p=149896&viewfull=1#post149896) als Beta hatte, hatte einen entscheidenen Fehler! Der Pidkontroller wurde jetzt alle 10ms (MS) bzw. alle 14ms(BMP) mit neuen Werten gefüttert, was ihm offensichtlich nicht bekommt, er braucht seine 25ms. Ist auch eigentlich logisch, ein PID Kontroller muss ja auch einen definierten Zeitraum überblicken.
Lösung: Die Daten werden jetzt weiterhin mit voller Geschwindigkeit in diesen magischen (ich verstehe ihn nicht), aber gut funktionierenden 40-Werte-Filter gefüttert, so dass kein Wert unberücksichtigt bleibt ("glatte Kurve"). Der Baro PID Kontroller macht nach dem Einschalten der Stromversorgung zunächst 4 sec Pause (ist so im Originalcode - muss einen Vorteil haben), um sich dann - wie gewohnt - alle 25ms (40Hz) neue Werte zu ergattern. EstAlt habe ich aus Kompatibilitätsgründen auch in dieser 40 Hz Schleife gelassen.
Der Code aus dem Post
http://fpv-community.de/showthread....o-vern%FCnftig&p=149896&viewfull=1#post149896 wurde jetzt also dem entsprechend geändert.
Der Faktor zur Limitierung des Sinkwertes, wie von DeaconBlues ausprobiert, ist (noch) nicht implementiert, da ich das noch nicht testen konnte.
Code:
#define BARO_TAB_SIZE 40
#define UPDATE_INTERVAL 25000 // 40hz update rate (20hz LPF on acc)
#define INIT_DELAY 4000000 // 4 sec initialization delay
void getEstimatedAltitude(){
uint8_t index;
static int16_t BaroHistTab[BARO_TAB_SIZE];
static int8_t BaroHistIdx;
static int32_t BaroHigh,BaroLow;
static uint32_t deadLine = INIT_DELAY;
int32_t temp32;
int16_t last;
if (newbaroalt==1) // Update only, if new values are available
{
newbaroalt=0; // Reset Boolean
//**** Alt. Set Point stabilization PID ****
//calculate speed for D calculation
last = BaroHistTab[BaroHistIdx]; // Do the magic
BaroHistTab[BaroHistIdx] = BaroAlt/10;
BaroHigh += BaroHistTab[BaroHistIdx];
index = (BaroHistIdx + (BARO_TAB_SIZE/2))%BARO_TAB_SIZE;
BaroHigh -= BaroHistTab[index];
BaroLow += BaroHistTab[index];
BaroLow -= last;
BaroHistIdx++;
if (BaroHistIdx == BARO_TAB_SIZE) BaroHistIdx = 0;
}
if (currentTime < deadLine) return; // Maintain old timing (40Hz)for PID calculation
deadLine = currentTime + UPDATE_INTERVAL;
EstAlt = BaroHigh*10/(BARO_TAB_SIZE/2);
newestalt=1; // Indicate, new EstAlt RDY
BaroPID = 0; // Calculate new PIDs
//D
temp32 = D8[PIDALT]*(BaroHigh - BaroLow)/BARO_TAB_SIZE;
BaroPID-=temp32;
temp32 = AltHold - EstAlt;
if (abs(temp32) < 10 && abs(BaroPID) < 10) BaroPID = 0; //remove small D parametr to reduce noise near zero position
//P
BaroPID += P8[PIDALT]*constrain(temp32,(-2)*P8[PIDALT],2*P8[PIDALT])/100;
BaroPID = constrain(BaroPID,-150,+150); //sum of P and D should be in range 150
//I
errorAltitudeI += temp32*I8[PIDALT]/50;
errorAltitudeI = constrain(errorAltitudeI,-30000,30000);
temp32 = errorAltitudeI / 500; //I in range +/-60
BaroPID+=temp32;
}
Hier kommt jetzt die modifizierte Version "Dev_20120504"
Die aktuelle Dev nehme ich mir auch noch zur Brust und wird nachgeliefert. (EDIT: erledigt)
Das Ausprobieren geschieht natürlich auf eigene Gefahr, aber ich bin mir zu 99,9% sicher, dass euer Copter nicht durch meine Codeänderung in den Boden geht. Den Finger zur Sicherheit aber auf dem Baroschalter haben!
Aktuell stürmt und regnet es hier
- kann also wenig praxistesten (Garage).
Todo: Jetzt kommt die Relativsteuerung zur Gaskanalmitte dran! Könnte klappen.
ACC Z und GPS mit einbeziehen: Kann ich nicht
PID Kontroller ggf verbessern: Kann ich nicht
LG
ROB
P.s.: Dieser Beitrag wird noch durch "EDIT"s verändert werden!
Warum die dev_20120504 - weil dort noch der alte, bewährte Timercode läuft. Ich bin bei den neueren Versionen etwas skeptisch.
Config.h - sind bei den jetzigen Mods nicht verändert worden.
Alt PID Einstellung:
http://www.multiwii.com/forum/viewtopic.php?f=17&t=1564#p12824
http://fpv-community.de/showthread....PID-Kontroller&p=143353&viewfull=1#post143353
Vor dem Flashen einer neuen Revision: File/examples/clear_eeprom. Nach dem Flashen ACC kalibrieren und die bereits erflogenen PIDS wieder einstellen - speichern.
Wenn die Barokurve zunächst wieder hackelig erscheint - einmal copter neu "hochfahren" (Strom aus/an) - warum, weiss ich nicht.
@Rosewhite:
Den Code für das Promini ums Verrecken klein zu halten, halte ich für überflüssig. Das Ding hat eh irgendwann ausgedient. Der Mega ist spätestens seit HW-PWM in meinen Augen deutlich überlegen und andere Microcontroller rücken auch immer mehr ins Licht. Es wäre ein Leichtes, dem Promini in Zukunft bestimmte Features wegen des begrenzten Speichers vorzuenthalten und es endgültig als Einsteiger-Controller zu behandeln. Ich habe eh nicht verstanden, warum man da noch so ein Hickhack macht, um ja noch einen Hexa oder Octo mit dem Mini fliegen zu können.
...Allerdings bin ich mir nach den vielen Testflügen sehr sicher, dass das große Geheimnis in der Z-Achse des ACC steckt:.....
Ich kann mir beim besten Willen nicht vorstellen, dass der MS5611 dafür die einzige Datenquelle ist. ...
Das sehe ich genau so! Arduino pro mini,wmp und bmp085 haben sich eigentlich überlebt. Beim Googeln nach BMP085, ACC usw sind mehrere
Dinge zu Tage getreten: Von Leuten, die sich sehr mit der Materie auskennen (z.B
http://www.pitlab.com/autopitlot-articles/37-comparison-of-pressure-sensors.html) wird konstatiert, dass sich der BMP auf Grund seiner Trägheit und seines Rauschverhaltens noch nicht mal für ein anständiges Variometer eignen würde. Andere haben mit BMP085 mit Kalmanfilter u/o moving average Filter und den ACC Werten (berechneter Z Vektor) auch keine bahnbrechenden Erfolge gehabt. Eine MWII Steuerung mit MS Baro und erhöhter Auflösung der ACC Werte könnte so gut wie der Naza werden und zu dem noch besser fliegen.
@martinez: "
..Wenn du das so sagst, ist es fast schon komisch, dass das noch nicht drin ist....."
Es gab Versuche auf der Multiwii z.B Alexmos.
@aileroned
"..Danke auf jeden Fall, dass sich endlich jemand an diesem Thema engangiert!..."
Ich hoffe, dass ich jemanden mit mehr Sachkenntnis und Erfahrung mit meinen Versuchen motivieren kann.