Baro Code Änderungen

Roberto

Erfahrener Benutzer
#41
Ich bin kein Hardwarespezi, aber eigentlich haben ATmega32U4 und ATmeag328 (Promini) beide 32 KB (minus Bootlader). Das Programm ist nicht länger geworden, da die "Final" mittlerweile schon auf Byte-Diät gesetzt ist. Ein paar Dinge bereiten mir noch Kopfzerbrechen, die ich nur im Freiflug testen kann. Was man so liesst, soll die Dev allerdings schon nicht mehr passen. Erstmal abwarten und weiter frickeln.
LG
Rob
 
#43
Hi Rob,
gibts eigentlich ne Möglichkeit deinen Code in die letzte Mulitwii dev einzupflanzen? Da sind ein paar interesante Änderungen drin. Wie kann man das denn händeln wenn die "offizielle" Version deinen Code nicht verwendet sonder die mahowik Lösung?
Gruß Jan
 

Roberto

Erfahrener Benutzer
#45
@ staroman:
"gibts eigentlich ne Möglichkeit deinen Code in die letzte Mulitwii dev einzupflanzen?"
Natürlich ist es möglich, die Dev würde m.E dadurch sogar kürzer (müsste ich mal testen). Die Devs haben mir noch zuviel Kinderkrankheiten http://www.multiwii.com/forum/viewforum.php?f=8. Deswegen habe ich es damit nicht ganz so eilig, ausserdem müsste die Dev doch auch schon verbessertes althold enthalten.

"Wie kann man das denn händeln wenn die "offizielle" Version deinen Code nicht verwendet sonder die mahowik Lösung?"
Mahowik legt doch auch gute Arbeit hin. Mit Sicherheit hat er sich auch unsere Version angesehen. Wenn bei der nächsten, offiziellen Version alles gut lüppt, dann hat es sich hier sowieso erledigt, sonst bastel ich da wieder mein Zeugs rein.

@Jürgen:
wohl ein Grund auf den nächsten Billigen Prozessor auszuweichen.
... oder die weitere Entwicklung einzustellen.
Da fällt mir etwas ein: Du hast Doch das Naze32, ich könnte doch mal versuchen meinen Code in diese Timecop Version zu häkeln - nach allem was man so liesst ("AvrTards" etc), dürfte er dann Gift und Galle spucken :) . Hast Du Interesse?

LG
Rob
 

Frickelpiet

Erfahrener Benutzer
#46
Hi Rob,

ich lese hier aufmerksam mit und habe den Vario2b-Code auch auf meinem Flydispider. Ich finde es super was du machst, und die Entwicklung geht aus meiner Sicht genau in die richtige Richtung, insbesondere was die Steuerung angeht. Naza kenne ich nicht, aber MikroKopter, und die MK-Steuerung habe ich immer als sehr angenehm und eingängig empfunden.

Ich schließe mich JinGej an: Ich bin auf den neuen Code gespannt!

Beste Grüße!

Piet
 

JUERGEN_

Generation 60++
#48
...
Da fällt mir etwas ein: Du hast Doch das Naze32,
ich könnte doch mal versuchen meinen Code in diese Timecop Version zu häkeln
na denn mal los,
Forschende soll man nicht aufhalten. :D


...
- nach allem was man so liesst ("AvrTards" etc), dürfte er dann Gift und Galle spucken :)
verstehe ich zwar nicht :confused:

gibt ja schon die "baseflightplus", ... du nennst sie dann "baseflightplusplus" ? :D
nunja die "MultiWii32" gibts ja auch noch nicht. :)


immer wenns was neues gibt. :) (und nix kostet)
 

Roberto

Erfahrener Benutzer
#49
@Jürgen: Ich meinte, er beschimpft auch mal gerne: " Why do avrtards still insist on using FTDI?" (http://www.rcgroups.com/forums/showthread.php?t=1595761). Den baseflightplus code schaue ich mir auch an.
So, das Kopfzerbrechen hat was gebracht, jetzt habe ich eine Version auf meinen kleinen Quad geladen, die ich für Aussen - flugfähig halte. Ich muss mir nur noch einen Acker mit Steckdose oder Parkplatz suchen, damit das altersschwache Laptop auch mitmacht. Irgendwie bin ich schon gespannt wie ein kleines Kind, ich hoffe, dass das Ergebnis für eine Vorabversion reicht. Die kommt dann natürlich zuerst in diesen Thread.
Dann schaue ich mir die Dev auch mal genauer an.

LG
Rob

EDIT 1730: Flugtest bestanden!
 

JUERGEN_

Generation 60++
#50
Ich meinte, er beschimpft auch mal gerne: " Why do avrtards still insist on using FTDI?"
(http://www.rcgroups.com/forums/showthread.php?t=1595761).
naja, wo er recht hat, hat er recht. :D

konnte ich noch nie verstehen, warum man ewig auf FTDI gesetz hat, und sogar noch für 15€ gekauft.


dabei gibts/gabs sogar bessere Chips in den Telefonadaptern, für nen 1/4. des Preises.


und du siehst ja selbst wie langsam sich nen verbesserter Code durchsetzt. :D
getreu der Devise, wenn's funktioniert, ist's Richtig.
 

Roberto

Erfahrener Benutzer
#51
**** DAS IST EIN BETATEST ******

So, jetzt gibts mal wieder was.

Also, diese Version ist NICHT "ausgiebig" getestet, aber geflogen und für richtig brauchbar befunden.
Die Änderungen betreffen nicht nur das Höheändern (Gasknüppelmitte) sondern auch den Altholdalgorithmus. Im Prinzip ist das, was im Gelaber hier: http://fpv-community.de/showthread.php?14199-Baro-Code-%C4nderungen&p=208149&viewfull=1#post208149 beschrieben wurde umgesetzt. Ich schreibe hier, in diesem Post gleich (später) noch eine genaue Anleitung/Erklärung per EDIT. Eure config.h könnt ihr weiter verwenden, die "ALT_HOLD_THROTTLE_NEUTRAL_ZONE" ist jetzt bei 80 - nicht erschrecken, klappt trotzdem butterweich. "AltHoldBlindTime" gibts nicht mehr, ist eigentlich auch klar. Eure Alt PIDs der final3 sollten, trotz der Änderungen, weiter gültig sein. EEPROMclear ist nur bei Versionswechsel (von DEV oder so) erforderlich (dies ist 2.1). GUI - ACC Calibration kann, wie immer, trotzdem nicht schaden. Unser Bigbretl - mod ist auch drin.
Wie gesagt, später mehr, ich wollte nur schon mal die Version zum Testen bei letztem Sonnenlicht zur Verfügung Stellen.

LG
Rob

EDIT:
Funktionsweise:

Sobald Althold eingeschaltet wird, wird die Höhe mit den eingestellten altPids gehalten, die Gasknüppelstellung wird für 1sec ignoriert, ab dann ist die Gasknüppelmitte (definiert durch "MIDRC", sollte man nicht ändern) der neue Referenzpunkt. Wird der Gasknüppel aus der definierten neutral Zone (ALT_HOLD_THROTTLE_NEUTRAL_ZONE steht auf 80) um die Mitte herum herausbewegt, erfolgt ein Steigen oder Sinken. Dabei werden die Werte immer auf die Neutralzone bezogen, d.h. z.B nach Verlassen der Neutralzone nach oben ergibt es z.B einen Wert von +1, d.h. egal wie Ihr die Neutralzone einstellt, es kann nach ihrem Verlassen keine sprunghaften Änderungen geben.
Beim Ausschalten des Altholdmodus wird ohne Übergang direkt wieder die herkömmliche Gassteuerung aktiv!

Starten im Altholdmodus:
Nur mit voreingestellten Alt PIDs ratsam, sonst kommt er nicht richtig, oder zu gut vom Boden weg!
Wenn man z.B mit den üblichen Stickbewegungen die Motoren scharf schaltet, steht das Gas natürlich ganz unten, d.h. es würde eine neue Sollhöhe weit unterhalb des Bodens bestimmt und wenn man dann starten wollte mit dem Gasstick über Mitte, würde erstmal nichts passieren, weil er dabei ist, die stark negative Sollhöhe wieder nach oben zu zählen. Damit das NICHT passiert wird bei der unteren Gasstick position (definiert durch MINTHROTTLE) nicht die Sollhöhe nach unten verschoben. Natürlich kann man das austricksen, indem man im Stand den Gasstick über die untere Position hinaus bewegt, dann wird tatsächlich die Sollhöhe nach unten gezählt (max -21474 KM !). Baro aus/anschalten resettet natürlich die Sollhöhe.

Landen im Altholdmodus:
Kein Problem, nur muss man aufpassen, dass nach man nach erfolgreicher Landung den Gasstick direkt ganz nach unten zieht. Damit zählt er zum einen die Sollhöhe nicht mehr herunter und zum anderen führt ein versehentliches Ausschalten der Barofunktion nicht zu einem ungewollten Starterlebnis (je nach Stickposition). Wenn man jetzt mit der gleichen Akkuladung weiterfliegen möchte, ist es sinnvoll den Baro kurz aus und wieder einzuschalten damit die Sollhöhe wieder zurückgesetzt wird.

Infos & Möglichkeiten & Probleme:
Im Hinblick auf die kommenden, offiziellen Versionen und dem gewünschten GPS Gebrauch, wird der Programmspeicher von promini und micro knapp - d.h. so viele Faxen können wir hier nicht mehr machen. Diese Version ist schon auf Diät gesetzt, aber ca. 1KB länger als die original 2.1.
Die Hoffnung, durch den vereinfachten PosHold Override (GPS) Code von Mahowik Bytes sparen zu können, hat sich zunächst zerschlagen, nach User Berichten ("flyrobot") funktioniert es (noch) nicht. Deswegen bleibt es bei Bigbretl.
Zu der 1-Sekunden Lösung: Sie ist bytetechnisch kurz und erfüllt ihren Zweck. Schöner (und machbar) wäre es, wenn man nach aktiviertem Althold warten würde, bis der Gasstick die mittlere Neutralzone erreicht hat, bevor sich Gasknüppeländerungen auswirken. Damit hätte man auch gleich die Scherzkekse mit erwischt, die durch etwas Gas im Stand den Erdkern als Sollhöhe setzten wollen. Allerdings wäre dieses dann immer noch während einer Zwischenlandung im Althold möglich. Dann müsste noch eine Zwischenlandungserkennung her, also z.B wenn der anliegende Motorgaswert MINTHROTTLE+20 erreicht wird, ist von einer Landung aus zu gehen. Die könnte natürlich bei einem schnellen Abstieg fehlinterpretiert werden, deswegen müsste man die Abfrage noch um das Variometer und eine Zeitkomponente erweitern also z.B: Wenn der Motorgaswert MINTHROTTLE+20 für 2Sek unterschritten wird und sich keine signifikannte Höhenänderung in dieser Zeit ergeben hat, dann ist von einer Landung aus zu gehen. Eine Begrenzung der negativen Sollhöhe auf z.B -10m ist m.E auch nicht sinnvoll. Zum einen schwank der Luftdruck, ok bei einer Flugzeit von 20Min wäre eine Schwankung von mehr als +- 1 bis 5m eigentlich nicht zu erwarten, zum anderen kann man auch von einer Anhöhe aus starten (Hochsitz etc) und zu "Tal" fliegen, wenn dann die -10m unterschritten werden sollen, ist es nicht möglich und der Pilot wundert sich, warum ausgerechnet sein Kopter vom Boden abgestossen wird. Naja, das sind so meine Gedanken zu den Problemen, wie seht Ihr das? Was ist sinnvoll, Stichwort: Foolproof? Was sollte noch rein?
Dann noch was: Beim Höheändern wird unsere Variometerbremse (klar, die stört dann) nicht ganz ausgeschaltet, sondern in ihrer Stärke halbiert. Ich bilde mir ein, dadurch ist es noch etwas weicher. Wer damit experimentieren will:
Original Zeile 979:
Code:
      if (HightChange == 1) BaroI = BaroI>>1;                                                                   // do Baro 1/2"I" on Hightchange
Ausschalten der Variometerbremse bei Höhenänderung wäre dann z.B:
Code:
      if (HightChange == 1) BaroI = 0;                                                                   // do Baro 1/2"I" on Hightchange
Oder nur 20% "I" würde z.B so aussehen
Code:
      if (HightChange == 1) BaroI = (BaroI*20)/100;                                                                   // do Baro 1/2"I" on Hightchange
Info Gasnachführung, Ziel: Keine weiteren Einstellungsparameter, kein zusätzlicher ThrottlePID kontroller (z.B Arducopter)
Intern wird das Gas nachgeführt, und da bin ich gespannt, ob das bei anderen Setups auch so funktioniert. Das läuft so: 10 mal pro Sekunde (10Hz sei die Minimalanforderung für Echtzeitanwendungen lt. DIY Drones) wird der Gaswert, der sich aus eurem "AltP" ergibt, ohne Fliesskommarest durch 100 geteilt und das Ergebnis dem "Sockelgas", das bei Einschalten des Baros definiert wurde hinzugefügt oder abgezogen. Z.B laut P Regelung ist ein Gaswert von 99 nötig zur Höhenkorrektur 99/100 = 0,99 ergibt dann für die Nachführung den Wert 0, Gaswerte von 100 - 199 dann eine Nachführung von 1.

So, das wars jetzt erstmal, die genauen Codeänderungen kommen noch.

Lg
Rob

Codeänderungen dieser Testversion gegenüber der "NewBaroPIDVario3Final"

Änderungen bei IMU

Weniger Variablen:
Code:
Original: 
static uint8_t newbaroalt=0;           //Crashpilotmod
static int32_t GroundAlt=0;
static int16_t BaroClimbRate = 0;      // in cm/s
static uint32_t AltHoldBlindTimer=0,PosHoldBlindTimer=0;
static int16_t LastThrottle;
static uint32_t ThrTime;
static uint8_t HightChange=0,PSholdChange=0;
static int16_t ThrottleRate;           // Ticks/sec
static float accVelScale;

Jetzt:
static int32_t  GroundAlt=0;
static uint32_t AltRCTimer0,PosHoldBlindTimer=0;
static uint8_t  newbaroalt=0,HightChange,PSholdChange=0;
static int16_t  BaroP,BaroI,BaroD;
static float    accVelScale;
Andere Initialisierung:
Code:
Original:
    #if BARO
      if (rcOptions[BOXBARO]) {
        if (!f.BARO_MODE) {
          f.BARO_MODE = 1;
          AltHold = EstAlt;
          HightChange=0;
          BaroPID=0;
          AltHoldBlindTimer=0;
          initialThrottleHold = rcCommand[THROTTLE];
        }
      } else {
        f.BARO_MODE = 0;
      }
    #endif

Jetzt:
    #if BARO
      if (rcOptions[BOXBARO]) {
        if (!f.BARO_MODE) {
          f.BARO_MODE = 1;
          AltHold = EstAlt;
          AltRCTimer0 = currentTime+1000000;         // The User has 1sec to center throttle after Althold is engaged
          HightChange = 0;
          initialThrottleHold = rcCommand[THROTTLE];
        }
      } else {
        f.BARO_MODE = 0;
      }
    #endif
Andere Logik:
Code:
Original:
  #if BARO
    Baro_update();                                                                                               // Do Baro every time!
    getEstimatedAltitude();
    if (currentTime >= ThrTime){                                                                                 //  Get ThrottleRate in Ticks/sec Upmovement=+ Polling at 10Hz
     ThrTime = currentTime+100000;
     ThrottleRate = (rcCommand[THROTTLE]-LastThrottle)*10;
     if (abs(ThrottleRate) < 150) ThrottleRate = 0;
     LastThrottle=rcCommand[THROTTLE];}

    if (rcOptions[BOXBARO]){           // New Logic: When User exceeds neutral zone and stops fiddeling with throttle, then after 1 second a new Althold is defined
      if (abs(rcCommand[THROTTLE] - initialThrottleHold)<ALT_HOLD_THROTTLE_NEUTRAL_ZONE && HightChange==0){
       rcCommand[THROTTLE] = initialThrottleHold + BaroPID;
       rcCommand[THROTTLE] = constrain(rcCommand[THROTTLE],MINTHROTTLE+1,MAXTHROTTLE-50);}
      else {
       HightChange=1;
       if (ThrottleRate==0 && AltHoldBlindTimer==0) AltHoldBlindTimer = currentTime+AltHoldBlindTime;}
      if (ThrottleRate !=0) AltHoldBlindTimer = 0;
      if (currentTime >= AltHoldBlindTimer && AltHoldBlindTimer !=0) f.BARO_MODE = 0;                            // Set new ref hight
     }
  #endif

Jetzt:
  #if BARO
    Baro_update();                                                                                               // Do Baro every time!
    getEstimatedAltitude();
    if (rcOptions[BOXBARO])
     {
      if (currentTime >= AltRCTimer0){                                                                           // 10Hz Loop
       AltRCTimer0 = currentTime+100000;
       int16_t thrstick = rcData[THROTTLE];
       int16_t thrdiff = thrstick-MIDRC;
       if (abs(thrdiff) > ALT_HOLD_THROTTLE_NEUTRAL_ZONE){
        HightChange = 1;                                    
        initialThrottleHold = initialThrottleHold + BaroP/100;                                                   // Adjust Baselinethr by 1% of BaroP
        if (thrdiff > 0) thrstick = thrdiff - ALT_HOLD_THROTTLE_NEUTRAL_ZONE;
        if (thrdiff < 0){
         thrstick = thrdiff + ALT_HOLD_THROTTLE_NEUTRAL_ZONE;
         if (rcData[THROTTLE] <= MINTHROTTLE) thrstick = 0;}
       }
       else{
        thrstick = 0;
        HightChange = 0;}
      AltHold = AltHold + (thrstick>>3);                                                                        // BaroStickDevider = 5000/MaxBaroStickClimbrate(in cm/s)
      }                                                                                                         // End of 10 Hz Loop
      if (HightChange == 1) BaroI = BaroI>>1;                                                                   // do Baro 1/2"I" on Hightchange
      rcCommand[THROTTLE] = constrain(initialThrottleHold + BaroP + BaroD - BaroI,MINTHROTTLE+1,MAXTHROTTLE-50);
     }
  #endif
Änderungen im Bereich IMU:
Code:
Original:
void getGroundAlt()                                              // Executed in Setup takes approx 4.5 sec
{
    uint8_t gacnt=0;
    while(gacnt < 150){
     while(newbaroalt ==0){                                      // Wait for new Baroval
      Baro_update();
     }
     newbaroalt = 0;                                             // Reset Boolean
     GroundAlt=GroundAlt+BaroAlt;
     gacnt++;
    }
    GroundAlt=GroundAlt/150;
    accVelScale = 9.80665f/acc_1G/10000.0f;
}

///////////////////////////////////////////////
//Crashpilot1000 Mod getEstimatedAltitude ACC//
///////////////////////////////////////////////
#define VarioTabsize 8
#define BaroTabsize 5
  
void getEstimatedAltitude()
{
  static uint8_t Vidx=0,Bidx=0;
  static int32_t LastEstAlt=0;
  static int16_t BaroP;
  static int8_t VarioTab[VarioTabsize];
  static int32_t BaroTab[BaroTabsize];
  static float velz = 0.0f;
  int8_t IdxCnt,ThrAngle;
  int16_t AltI,ThrD,BaroDiff;
  int32_t tmp32;

  int16_t accZ = (accADC[ROLL]*EstG.V.X+accADC[PITCH]*EstG.V.Y+accADC[YAW]*EstG.V.Z)*InvSqrt(fsq(EstG.V.X)+fsq(EstG.V.Y)+fsq(EstG.V.Z)) - acc_1G; //if (abs(accZ)<acc_1G/25) accZ=0;
  velz = velz+accZ*accVelScale*cycleTime;
  ThrAngle =  EstG.V.Z/acc_1G * 100.0f;
  if (BaroPID==0) BaroP=0;                                      // Reset BaroP if necessary, so I and D can be done before first Barovalue

  if (newbaroalt!=0)
   {
    newbaroalt = 0;                                             // Reset Boolean
    // Get EstAlt
    BaroTab[Bidx] = BaroAlt-GroundAlt; Bidx++;
    if (Bidx==BaroTabsize) Bidx=0;
    tmp32=0; IdxCnt = 0;
    while(IdxCnt<BaroTabsize){tmp32=tmp32+BaroTab[IdxCnt]; IdxCnt++;}//    EstAlt = (EstAlt+(tmp32/BaroTabsize))/2;
    EstAlt = tmp32/BaroTabsize;
    // Baro Climbrate 
    VarioTab[Vidx] = constrain(EstAlt-LastEstAlt,-126,126); Vidx++;
    if (Vidx==VarioTabsize) Vidx=0; 
    LastEstAlt = EstAlt;
    tmp32 = 0; IdxCnt = 0;
    while(IdxCnt<VarioTabsize){tmp32=tmp32+VarioTab[IdxCnt]; IdxCnt++;}//    BaroClimbRate = (BaroClimbRate+((tmp32*33)/VarioTabsize))/2;//BaroClimbRate in cm/sec // + is up // 30ms * 33 = 990ms
    BaroClimbRate = (tmp32*33)/VarioTabsize;                    //BaroClimbRate in cm/sec // + is up // 30ms * 33 = 990ms
    velz = velz * 0.982f + BaroClimbRate * 0.018f;              //velz= Baro&Acc Climbrate
    // Baro P
    BaroDiff = constrain(AltHold-EstAlt,-200,200);              // BaroDiff = Difference to locked hight neg if risen
    BaroP = constrain(((int16_t)conf.P8[PIDALT]*BaroDiff)/200,-200,200); // Limit Baro P to +/- 200
   }
  if (ThrAngle < 40){BaroPID=0; return;}                        // Don't do BaroPID if copter too tilted// EstAlt & Baroclimbrate are always done :)
  AltI = constrain((((int32_t)conf.I8[PIDALT]*velz)/50),-150,150);   // Baro I
  ThrD = (((int16_t)conf.D8[PIDALT]) * (100 - ThrAngle))/25;    // "D"
  BaroPID = (BaroPID+constrain(BaroP-AltI+ThrD,-250,250))/2;
}

Jetzt:
void getGroundAlt()                                              // Executed in Setup takes approx 4.5 sec
{
    uint8_t gacnt=0;
    while(gacnt < 150){
     while(newbaroalt ==0) Baro_update();                        // Wait for new Baroval
     newbaroalt = 0;                                             // Reset Boolean
     GroundAlt=GroundAlt+BaroAlt;
     gacnt++;}
    GroundAlt=GroundAlt/150;
    accVelScale = 9.80665f/10000.0f/acc_1G;
}

///////////////////////////////////////////////
//Crashpilot1000 Mod getEstimatedAltitude ACC//
///////////////////////////////////////////////
#define VarioTabsize 8                                           // Increasing over 8 -> Risk of 16 Bit Overflow in Baro Climbrate
#define BaroTabsize 5
  
void getEstimatedAltitude()
{
  static uint8_t Vidx=0,Bidx=0;
  static int32_t LastEstAltBaro=0;
  static int8_t VarioTab[VarioTabsize];
  static int32_t BaroTab[BaroTabsize];
  static float velz = 0.0f, accalt = 0.0f;
  int8_t IdxCnt,ThrAngle;

  int16_t accZ = (accADC[ROLL]*EstG.V.X+accADC[PITCH]*EstG.V.Y+accADC[YAW]*EstG.V.Z)*InvSqrt(fsq(EstG.V.X)+fsq(EstG.V.Y)+fsq(EstG.V.Z)) - acc_1G;
  velz = velz+accZ*accVelScale*cycleTime;
  accalt = accalt+velz*cycleTime*0.000001f;
  ThrAngle = EstG.V.Z/acc_1G * 100.0f;

  if (newbaroalt!=0)
   {
    newbaroalt = 0;                                             // Reset Boolean
    BaroTab[Bidx] = BaroAlt-GroundAlt; Bidx++;                  // Get EstAltBaro
    if (Bidx==BaroTabsize) Bidx=0;
    int32_t tmp32=0; IdxCnt = 0;
    while(IdxCnt<BaroTabsize){tmp32 = tmp32 + BaroTab[IdxCnt]; IdxCnt++;}
    int32_t EstAltBaro = tmp32/BaroTabsize;
    VarioTab[Vidx] = constrain(EstAltBaro - LastEstAltBaro,-120,120); Vidx++;     // Baro Climbrate 
    if (Vidx==VarioTabsize) Vidx=0; 
    LastEstAltBaro = EstAltBaro;
    int16_t tmp16 = 0; IdxCnt = 0;
    while(IdxCnt<VarioTabsize){tmp16 = tmp16 + VarioTab[IdxCnt]; IdxCnt++;}
    int16_t BaroClimbRate = (tmp16*33)/VarioTabsize;            // BaroClimbRate in cm/sec // + is up // 30ms * 33 = 990ms
    velz = velz * 0.982f + BaroClimbRate * 0.018f;              // velz= Baro&Acc Climbrate
    accalt = accalt * 0.85f + EstAltBaro * 0.15f;
   }
  int16_t ClimbRate = velz/50;                                  // put float into 16Bit
  EstAlt = accalt;
  BaroP = 0,BaroI = 0,BaroD = 0;
  if (ThrAngle < 40) return;                                    // Don't do BaroPID if copter too tilted// EstAlt & Baroclimbrate are always done :)
  BaroP = ((AltHold-EstAlt)*conf.P8[PIDALT])/200;
  BaroI = constrain(ClimbRate*conf.I8[PIDALT],-150,150);
  BaroD = (((int16_t)conf.D8[PIDALT]) * (100 - ThrAngle))/25;
}
 

Anhänge

Roberto

Erfahrener Benutzer
#53
Freut mich!
Aber die wirkliche Herausforderung für den code kommt erst dann, wenn Du den Regelbereich des Pidkontrollers verlässt - also Draussen wirds spannend. Die Gasnachführung ist das eigentliche Problem, dass ich hoffentlich gelöst habe (Ganzzahlige 1% des BaroP werden mit 10Hz hinzugefügt/abgezogen - das entspricht daher nicht 10%/Sek). Das ist quasi eine Art echtes "I" nur eben durch P, und damit von Deinem Coptersetup beeinflusst. Damit versuche ich an einem weiteren Parameter dem Throttle "I" vorbei zu kommen. Sonst würden die auftretenden Höhenfehler einfach summiert und mit einer Fliesskommakonstanten multipliziert ("echtes I") und zum Ergebnis addiert. Aber ich rede schon wieder zuviel, dass soll eigentlich oben in die Erklärung, die ich wohl erst Morgen schaffe.
Hast Du in der Wohnung eine Änderung durch den anderen Altholdalgorithmus bemerkt (besser/schlechter)? Eigentlich ist ein Baro erst ab 2m tauglich, in Wohnräumen eher unbrauchbar. Die jetzige Version verlässt sich allerdings mehr auf das Accelerometer.
Ist die ALT_HOLD_THROTTLE_NEUTRAL_ZONE von 80 bei Dir auch ok?
Naja, wenigstens hast Du keine 3 einhalb schwarze Kreise an der Decke!

LG
Rob
 
J

JinGej

Gast
#54
also die reaktion auf den knüppel war seeeehr weich sowohl beim "loslegen" als auch beim abstoppen... ca 10cm unter der decke kam er sanft zum stehen - ansonsten höhe halten - wie gehabt 1a auf 5cm genau (ja, dank ACCZ) als IMU hab ich ja die gleiche wie Du (0.3.5-MS)
 

FireN

trägt sonst keine Brille!
#56
aaah! :D
ständig was neues,
ich will das auch endlich ausprobieren (hab den MicroWii mit freeimu 043),
aber mein(e) rahmen aus hongkong brauchen so lange xD

Trotzdem weiter so! :)
 

Roberto

Erfahrener Benutzer
#57
@JinGej:

Danke für Deine PNs zum Lösungsvorschlag!

@JinGej, @Alle:
Aber ich glaube, ich habe jetzt eine sichere Lösung für die obigen Probleme gefunden, die auch nur 44 Bytes länger ist (incl. Punkt 3). Leider kann ich bei dem Wetter keinen Testflug machen.

1.: Bislang von mir unerkanntes Problem:
Strom an den Copter, Baromode an, Gas schön erstmal auf Vollgas stellen und warten (die Sollhöhe zählt jetzt fleissig hoch), jetzt den copter scharf machen und das Ding geht ab wie eine Rakete auf dem Weg zur Sollhöhe.
- Das ist jetzt abgestellt -

2.: Die Sache mit den Landungen und der 1 Sekundengeschichte ist jetzt so gelöst:
Die Sekunde gibt es nicht mehr. Wenn im Flug oder im Stand der Baromode zugeschaltet wird (nur bei scharfem copter -> Punkt 1), wird gleich die Höhe gehalten, aber eine Höhenänderung über den Gasstick ist erst dann möglich, wenn er einmal die Neutralzone erreicht hat. Das erleichtert das "PID" Einstellen und löst auch gleich teilweise das Startproblem (ungebremstes Herunterzählen der Sollhöhe im Stand mit etwas Gas). Die Sollhöhe wird jetzt nur noch so weit heruntergezählt bis sich ein Regelungswert von MINTHROTTLE-100 ergibt (d.h. Standgas-100). Das können natürlich, je nach pids, immer noch ein paar Meter sein, fällt aber nicht weiter ins Gewicht. Danach wird nämlich ein Reset der Barofunktion ausgelöst (wie quasi Baroschalter An/Aus) und es wird wieder auf die Knüppelmitte gewartet, bevor die Zählerei wieder los geht. Im rasanten Sturzflug mag es vielleicht möglich sein so einen Regelungswert zu provozieren, dann würde folgendes passieren: Althold wird resettet und der Sturzflug damit abgeschwächt oder aufgehalten (der aktuelle Gasknüppelwert wird als Basis für die Regelung verwendet), dann würde wieder gewartet, bis der Gasknüppel die mittlere Neutralzone erreicht hat, bevor weitere Höhenänderungen möglich sind.
Das müsste doch eigentlich sicher genug sein? Was ist noch an Problemen möglich?

3.: Die Probleme (http://fpv-community.de/showthread....o-vern%FCnftig&p=209529&viewfull=1#post209529) von Martinez, mit seinem schweren Copter bin ich auch angegangen.
Bei einem persistenten Regelungsfehler von >1m wird das Gas LANGSAM angepasst. Das ist natürlich kein echtes error "I", und ich bin mal gespannt, wie sich die Automatik auswirkt, das kann natürlich auf grandiose Weise daneben gehen.

@ stoooorm: Danke, für Deine Testbereitschaft! Du siehst, es gibt immer wieder Baustellen.
@ FireN: Da hilft nur eine Fahrt zum Baumarkt :) .

LG
Rob

EDIT 3.10 (u.a auch Antwort auf PN):
P.s.: Ich poste den Code erst, wenn ich ihn selber geflogen bin, irgendwas kann immer sein, und ich will nicht hier kaputte copter provozieren, sonst heisst es: "Alles in Deckung, Roberto hat wieder einen Killercode fertig!" Die Betaversion ist so lange ungefährlich, wie man vernünftig mit ihr umgeht. Die Sicherheits-Schwachpunkte der Beta, soweit mir bekannt, sind eigentlich ausführlich dargestellt. Ich gehe davon aus das alle, die an einem Betatest teilnehmen eben genau nicht zu den Leuten gehören, die eine Foolproof Lösung benötigen.

Einen schönen Tag der Deutschen Einheit noch! Dresden hat jetzt gutes Wetter - grr!

LG
Rob
 

amb

Erfahrener Benutzer
#58
Hallo,

ich habe eine MicroWii und er sagt mir, dass der Code ca 200 bytes zu groß ist. Gibt es da eine Möglichkeit?

Viele Grüße
 

Roberto

Erfahrener Benutzer
#59
Hi amb!
Also, wenn ich für die MicroWii (http://flyduino.net/MicroWii-ATmega32u4-Based-10DOF-MultiWii-FC) die config.h ändere: (ich weiss nicht, ob dann die Sensorrichtungen auch stimmen)
Code:
#define QUADX
#define NANOWII         // the smallest multiwii FC based on MPU6050 + pro micro based proc <- confirmed by Alex
#define MS561101BA
#define HMC5883
Komme ich auf: 22838 Bytes

mit:
Code:
#define I2C_GPS
und Bigbretl mod
#define PositionHoldOverride                          // Uncomment to activate
und
#define INFLIGHT_ACC_CALIBRATION
Komme ich auf: 25914 Bytes

mit LCD config:
Code:
#define LCD_CONF
#define LCD_SERIAL3W    // Alex' initial variant with 3 wires, using rx-pin for transmission @9600 baud fixed
Komme ich auf: 27978 Bytes

Passt also auch noch. Wo liegt mein Denkfehler?
Was hast Du so alles aktiviert??


LG
Rob
 

amb

Erfahrener Benutzer
#60
Hey Roberto,

danke für die schnelle Antwort. Also ich hab bis jetzt immer #define freeimu43 benutzt. Ansonsten hab ich auch alles eingebunden wie von die beschrieben. Nur ohne LCD Config
 
RCLogger

FPV1

Banggood

Banggood

Oben