Brushless Gimbal Controller - SOFTWARE

Status
Nicht offen für weitere Antworten.

meister

Erfahrener Benutzer
Hallo zusammen,

ich hatte auch kurzzeitig das gleiche Problem, allerdings habe ich es eher auf die Motorrichtung geschoben. Im Tool steht manchmal 0 und in der Software steht -1 bzw. 1.

Wegen dem zurücksetzen habe ich einfach ein EEPROM Clear geflasht und schon konnte ich wieder von vorne anfangen einzustellen.

http://arduino.cc/en/Tutorial/EEPROMClear

Anschließend wieder die 39 oder 41 drauf und es funktioniert wieder.

Viele Grüße
Henry
Hi,
die 0 für die Richtung wird beim übertragen in eine -1 gewandelt, eine 1 bleibt 1, das war beim Aufbau des Tools einfacher als mit -1 und 1 zu arbeiten.

Gruß,
Olli
 
Hallo zusammen,

ich hatte auch kurzzeitig das gleiche Problem, allerdings habe ich es eher auf die Motorrichtung geschoben. Im Tool steht manchmal 0 und in der Software steht -1 bzw. 1.

Wegen dem zurücksetzen habe ich einfach ein EEPROM Clear geflasht und schon konnte ich wieder von vorne anfangen einzustellen.

http://arduino.cc/en/Tutorial/EEPROMClear

Anschließend wieder die 39 oder 41 drauf und es funktioniert wieder.

Viele Grüße
Henry
Danke Henry,
dass hat funktioniert und die 39 läuft wieder gut :)!
 
Hallo Lohnestar

Wieso benutzt du nicht einen Komplementärfilter wie ich es hier beschrieben habe?

Der Gewichtung des ACC ist nur so weit nötig um den Drift der mem's Gyros zu elementieren, da ansonsten das Integral wegläuft.
Der PID Regler bitte nur mit dem Winkel aus dem Komplementärfilter füttern.
Nicht mit der Winkelgeschwindigkeit zu verwechseln.

Sehr Informativ: Komplementärfilter

Beste Grüsse
Nitro
Hallo,

gemäß Nitros Vorschlag zur komplementären Gewichtung von Gyro und ACC
( Winkel = (0.98 )*(Winkel + gyro * dt) + (0.02)*(Winkel_acc); ), habe ich diese Änderung versucht, die bei mir ganz gut funktioniert:

gyroRoll = (1 - config.accelWeight)*gyroRoll + config.accelWeight * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = (1 - config.accelWeight)*gyroPitch + config.accelWeight * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;

Bei Version 039 entspricht das:
gyroRoll = (1 - ACC_WEIGHT)*gyroRoll + ACC_WEIGHT * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = (1 - ACC_WEIGHT)*gyroPitch + ACC_WEIGHT * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;
 
Zuletzt bearbeitet:

nico_99

Erfahrener Benutzer
Hallo Zusammen,

was mir persönlich in den Parametern bei den Motoren noch fehlt, ist die allgemeine Begrenzung/Konfiguration des Drehwinkels.
...oder habe ich es übersehen?
Man liest es immer wieder, dass die Nick oder Roll eine volle Drehung macht. Autsch.
Das kann u.U. voll in die Hose gehen. :-|
 
Hallo,

gemäß Nitros Vorschlag zur komplementären Gewichtung von Gyro und ACC
( Winkel = (0.98 )*(Winkel + gyro * dt) + (0.02)*(Winkel_acc); ), habe ich diese Änderung versucht, die bei mir ganz gut funktioniert:

gyroRoll = (1 - config.accelWeight)*gyroRoll + config.accelWeight * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = (1 - config.accelWeight)*gyroPitch + config.accelWeight * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;

Bei Version 039 entspricht das:
gyroRoll = (1 - ACC_WEIGHT)*gyroRoll + ACC_WEIGHT * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = (1 - ACC_WEIGHT)*gyroPitch + ACC_WEIGHT * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;
Ich habe gerade bemerkt, dass der ACC-Weight Faktor im EEROM mit dem Faktor x/1000 gespeichert wird! Wenn man also 0.05 im BL-Tool gewählt hat, ist der gespeicherte Wert in der Variable 'config.accelWeight' 50.

Die oben genannte Zeile für Version 041 müsste also lauten, wenn man den Komplementärfilter nutzen will:

gyroRoll = (1 - config.accelWeight/1000)*gyroRoll + (config.accelWeight/1000) * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = (1 - config.accelWeight/1000)*gyroPitch + (config.accelWeight/1000) * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;

_______________________________________________________________________

Ich lasse mir den EEPROM-Wert jetzt beim Start im Terminal anzeigen:

Serial.print(F("Read ACC-Weight from EEPROM in x/1000 = "));
Serial.println(config.accelWeight);

_______________________________________________________________________

Auch in der normalen Version 041 müsste man den Faktor 1000 miteinrechnen, oder?

gyroRoll = gyroRoll + (config.accelWeight/1000) * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = gyroPitch + (config.accelWeight/1000) * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;
 
Zuletzt bearbeitet:

Lonestar78

Erfahrener Benutzer
@nitro: Ich hab ja gar nix gegen Komplementär-Filter.....
Warum ich 1kHz Raw Gyro und DMP haben möchte? Ganz Einfach: den Winkel über DMP zu bekommen ist faktisch viel besser, als ihn über den Beschleunigungssensor alleine zu beziehen, weniger drift bei Bewegung.
Ich will ja das Gyro-Signal gar nicht integrieren, sondern nur für 0-Drehgeschwindigkeit (grad/s) haben.

@Andreas: das, was Du geschrieben hast, ist nicht der Komplementärfilter, den nitro meint.
gyroRoll ist Drehrate in deg/s!
Der Vorschlag von nitro integriert das Gyrosignal hochpassgefiltert zum Winkel auf! In diesem Fall wäre Wingelabweichung die Regelgröße, in meinem Code ist es Abweichung von 0 grad/s.
 
Zuletzt bearbeitet:

digi45

Neuer Benutzer
hi,

hat jemand einen TIP für mich..

bekomme bei windows 7 64 immer den Fehler "serial Error com 11:mad:115200" bei allen Ports (6 bis 15?

gruss Frank
 

rc-action_de

Erfahrener Benutzer
Hallo zusammen,

@Andreas, schön das es wieder funktioniert ;-)

@alle
ich gebe leider wieder etwas Entwarnung. Die PID- Einstellungen, die mit dem Copter in der Hand funktionieren, sind am Copter leider noch viel zu hoch. Ich war Heute Abend wieder fliegen. Die Regelung von Roll sieht perfekt aus, bis ich die Motoren starte. Nick muss ich ja von Natur aus etwas begrenzen. Bei Gelegenheit teste ich hier mal einen anderen Motor.
Im Schwebeflug schwingt die Roll Achse ruckartig hin und her. Ich musste mit dem P- Wert von Roll nun doch wieder von 10 auf 7 runter und hoffe somit auf eine ruckelfreie Regelung.
Auch wenn Kamera und IMU per Alpha Gel vom Copter entkoppelt sind, wirken sich kleine Vibrationen trotzdem sehr stark aus.

Aber das wird schon ;-)

Viele Grüße
Henry
 
@nitro: Ich hab ja gar nix gegen Komplementär-Filter.....
Warum ich 1kHz Raw Gyro und DMP haben möchte? Ganz Einfach: den Winkel über DMP zu bekommen ist faktisch viel besser, asl ihn über den Beschleunigungssensor zu kriegen, weniger drift bei Bewegung.
Ich will ja das Gyro-Signal gar nicht integrieren, sondern nur für 0-Drehgeschwindigkeit (grad/s) haben.

@Andreas: das, was Du geschrieben hast, ist nicht der Komplementärfilter, den nitro meint.
gyroRoll ist Drehrate in deg/s!
Der Vorschlag von nitro integriert das Gyrosignal hochpassgefiltert zum Winkel auf! In diesem Fall wäre Wingelabweichung die Regelgröße, in meinem Code ist es Abweichung von 0 grad/s.
Wahrscheinlich funktioniert es bei in meinem Fall nur deshalb so gut, weil ich davor im Loop auch den Tiefpassfilter aus Version 036 benutze (..das hatte ich in 039 bei meinem Video auch gemacht). Jedenfalls sorgt diese Kombination im Moment dafür, dass nun auch die Version 041 bei mir stabil läuft, während sie davor im Ruhezustand pendelte (?!):

void loop()
{
count++;

sampleTimePID = (micros()-timer)/1000000.0/CC_FACTOR; // in Seconds!
timer = micros();

// Update raw Gyro
updateRawGyroData(&gyroRoll,&gyroPitch);

// Optional Low Pass Filter for Gyro Signal
// filter it with exponentially weighed moving average (EWMA)
#ifdef LP_FILTER_GYRO
gyroPitch = LP_ALPHA_GYRO * gyroPitch + (1.0-LP_ALPHA_GYRO) * gyroPitchOld;
gyroPitchOld=gyroPitch;
gyroRoll = LP_ALPHA_GYRO * gyroRoll + (1.0-LP_ALPHA_GYRO) * gyroRollOld;
gyroRollOld=gyroRoll;
#endif
// Loop Time 530 us

// Update ACC data approximately at 50Hz to save calculation time.
if(count == 20)
{
mpu.getAcceleration(&x_val,&y_val,&z_val);

sampleTimeACC = (micros()-timerACC)/1000.0/CC_FACTOR; // in Seconds * 1000.0 to account for factor 1000 in parameters
timerACC=timer;
//{Serial.print(sampleTimeACC,5);Serial.print(" ");Serial.println(sampleTimePID,5);}
}
if(count == 21) rollAngleACC =atan2(-y_val,-z_val)*57.2957795;
if(count == 22)
{
pitchAngleACC =-atan2(-x_val,-z_val)*57.2957795;
count=0;
}

//Serial.println( (micros()-timer)/CC_FACTOR);

gyroRoll = (1 - config.accelWeight/1000)*gyroRoll + config.accelWeight * (rollAngleACC - rollSetpoint)/sampleTimeACC;
gyroPitch = (1 - config.accelWeight/1000)*gyroPitch + config.accelWeight * (pitchAngleACC - pitchSetpoint)/sampleTimeACC;
pitchPID = ComputePID(sampleTimePID,gyroPitch,0.0, &pitchErrorSum, &pitchErrorOld,config.gyroPitchKp,config.gyroPitchKi,config.gyroPitchKd,maxDegPerSecondPitch);
rollPID = ComputePID(sampleTimePID,gyroRoll,0.0, &rollErrorSum, &rollErrorOld,config.gyroRollKp,config.gyroRollKi,config.gyroRollKd,maxDegPerSecondRoll);

pitchDevider = constrain(maxDegPerSecondPitch / (pitchPID + 0.000001), -15000,15000);
pitchDirection = sgn(pitchDevider) * config.dirMotorPitch;
rollDevider = constrain(maxDegPerSecondRoll / (rollPID + 0.000001), -15000,15000);
rollDirection = sgn(rollDevider) * config.dirMotorRoll;

sCmd.readSerial();
}

Das Spiegelvideo ist nun ähnlich wie mein letztes Video mit der Version 039, wobei die Möglichkeit über das Terminal und "GC" den Gyro-Offset zur Laufzeit neu zu kalibrieren ein Vorteil ist.

http://www.youtube.com/watch?v=vMGqux20BRg
 
Zuletzt bearbeitet:

rc-action_de

Erfahrener Benutzer
Hallo Andreas,

das sieht super aus ;-)

Ich bin immer wieder begeistert, wie spielend die Outrunner die schwere Kamera bewegen. Die Bewegung selbst sieht Klasse aus. Hier dürfte die große Masse allerdings auch eine große Rolle spielen.

Viele Grüße
Henry
 

Lonestar78

Erfahrener Benutzer
Hallo Zusammen,

nachdem jetz viele Begeisterte ein neues Board haben, dank Martinez:
Update im ersten Post, Version 042A

Features: alles von der 41er plus:
- memory optimizations
- reintroduce a way to control max motor power: PWM from 1 to 255 for each Motor seperately

Schönes WE :)
 

meister

Erfahrener Benutzer
Hi,
bei mir funktioniert das Terminal nicht, ich sehe zwar die Ausgaben beim booten:

MPU6050 ok
GO! Type HE for help, activate NL in Arduino Terminal!

kann aber kein HE senden ?!?!?

Kann das jemand bestätigen ?


Gruß,
Olli


EDIT: sorry, liegt wohl an meiner hardware, per arduino-Board funktioniert es (ohne MPU6050), hmmm
EDIT2: liegt wohl an meinem INT vom MPU6050, wenn ich den Pin abklemm, funktioniert auf die Konsole wieder.
 
Zuletzt bearbeitet:
Nicht Bestätigt, Tool und Terminal gehen bei mir einwandfrei.
PWM geht auch Einwandfrei :)
Die PID sind super einstellbar!
Die Sollwinkel werden nun auch ohne "tricksen" direkt und sauber erreicht :)
GEIL!
 
4.0:0.02:0.033
Es gibt aber keine PID werte... bissl mehr oder weniger Strom, andere Gopro und das schaut schon wieder anders aus...
Pole habe ich für meine 14 Poler mal auf 28 gestellt ;)
Und selbst dann laufen die Motoren noch deutlich vor... hm... habt ihr das auch, das die Kamera bei Bewegung voraus eilt?
Bei der V039 war das gerade anders rum, da hing die permanent hinterher...
Nachtrag: bei Einstellung von 14 Polen passen die Vorgabe PID schon sehr gut, man braucht eigentlich nur den strom anpassen bis es nicht mehr zittert LOL. Voreilen tut die Schaukel aber auch da.
... ich wickle mal den 2.Motor fertig...
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten