Jag har ingen cutoff, de är inställda på NiMh med low-cutoff villket vad jag hört betyder att den står på 0 V på Turnigy Plush. Jag har tänkt att lägga den logikien i styrkortet istället men inte kommit så långt än. Just nu har jag 4800 mAh batterier på och det mesta jag lyckats aldda i ett batteri efter att jag lekt en stund är ca 1600 mAh. Så jag tror att jag har lite marginal att byta batteri innan jag kör det i botten. Jag vill inte riskera att ett fartreglage går in i soft-cutoff-mode medan de andra fortsätter som vanligt.
Jag har inte tillgång till källkoden just nu, men jag kan försöka skriva ungefär vad jag har för värden på reglersystemet nu.
Till att börja med är pitch & roll axlarna helt frikopplade om man bortser från yaw och grundgas. För att uppskadda nuvarande vinkel & vinkelhastighet används följande kalman-filter
(Wikipedia notation)
Kod: Markera allt
ts = 1/200; % samplingstid vid 200 Hz
x = [vinkel;
vinkelhastighet;
gyrobias
F = [1 ts -ts;
0 1 0;
0 0 1];
B = 0;
Q = [100 0 0;
[0 1000 0;
0 0 0.01];
z = [vinkel enl. accelerometer;
vinkelhastighet enl. gyro];
H = [1 0 0;
0 1 0];
R = [10000 0;
0 100];
När jag tänker efter så måste det vara att broms-läget i ESC:erna ger upphov till en olinjäritet i form av en backlash/hysteres som ställer till problem för reglerloopen.
Styrsignalen som sedan kommer ut ur pid-regulatorn mixas in i motorutsignalen enligt följande
Kod: Markera allt
motor = k1*thrust + k2*pitch_roll_pid_out + k3 * yaw_p_out
k2 är plus/minus 0.8 beroende på motor
k3 är plus/minus 0.6 beroende på motor
Jag har också ett villkor som inte tillåter motorerna att gå ner på 0 så länge inte gasreglaget är helt av för att de inte ska tappa synk. Har även laborerat med att ha den negativa mixkoefficienten mindre än den positiva villket gav ett bättre resultat då bromsen var aktiverad. Men jag är inte säker på att det är så fortfarande. Ett exempel för roll:
Kod: Markera allt
if(u_roll > 0.0)
{
motor_left = k1*thrust + k2*u_roll + k3*u_yaw;
motor_right = k1*thrust - 0.3*k2*u_roll + k3*u_yaw;
} else {
motor_left = k1*thrust + 0.3*k2*u_roll + k3*u_yaw;
motor_right = k1*thrust - k2*u_roll + k3*u_yaw;
}