Mesafe için Quadcopter PID Controller
Yatay olarak seyahat ederken belirli bir konumda bir quadcopter durdurmak için bir PID denetleyicisi kullanmaya çalışıyorum, ancak şu anda maksimum hıza bağlı olarak aşıyor / yetersiz kalıyor. P, I ve D kazançlarını sınırlı bir başarı ile manuel olarak ayarlamayı denedim. Esasen hızın, uçuş yolunun en sonunda maxSpeed'den 0'a gitmesi gerekir.
DJI SDK'yı kullanır, bu nedenle quadcopter girişleri çok basittir, quadcopter'e pitch girişi m / s cinsindendir ve her yinelemede hedefe olan mesafeyi (m) yeniden hesaplıyorum.
Saniyenin her 0,1'ini çalıştıran bir döngü çalıştırıyorum. Bazı sözde kodlar:
kP = 0.25
kI = 0.50
kD = 90
timeStep = 0.1
maxSpeed = 10
currentError = initialDistanceToLocation - currentDistanceToLocation
derivativeError = (currentError - previousError) / timeStep
previousError = currentError
output = kP * currentError + kI * integralError + kD * derivativeError
integralError = integralError + currentError * timeStep
if >= maxSpeed {
output = maxSpeed
} else if output <= 0 {
output = 0
}
return output
Bu PID kontrol cihazını, farklı maksimum hızlar için çalışacak olan bu sisteme güvenilir bir şekilde ayarlamanın bir yolu var mı, yoksa çok mu basit ve dikkate almam gereken başka faktörler var mı?
Yanıtlar
Daha yüksek hızlarla çalışmak istiyorsanız, hız kontrol cihazına da bakmanız gerekir. Ayrıca hız kontrolünü kontrol sisteminize dahil etmeyi deneyebilirsiniz. Sorununuzu hafifletebilecek noktaya yumuşak durma sağlar. Ancak, sadece konum kontrolüne sahip genel bir PID denetleyicisi, doğru şekilde ayarlanmışsa ve maksimum hızlar çok yüksek değilse çok fazla aşmamalıdır.
Sahte kodunuzun gerçek kodunuzun temsilcisi olarak ne ölçüde alınabileceğini bilmiyorum, ancak aşağıdaki endişeleri görebiliyorum.
Türev terim
Pratik uygulamalarda, aşağıdaki gibi tek adımlı sonlu bir fark olarak hesaplanan türev terimi tamamen işe yaramaz:
derivativeError = (currentError - previousError) / timeStep
Bunun çok sayıda nedeni vardır, temel olarak hedeften ölçülen mesafe gibi fiziksel sinyallerin gürültüden büyük ölçüde etkilenmesi ve bu işlemle yükseltilen yüksek frekanslı bileşenlerin kaçınılmaz olarak zayıflamasıyla ilgilidir. PID performansı ve istikrarsızlığa neden oluyor.
Bu nedenle, hız gözlemcileri (ör. Kalman durum tahmincisi) veya sağlam filtreleme (ör. Savitzky-Golay filtreleme) gibi daha karmaşık tekniklere veya hatta hızı doğal olarak ölçmeye uygun (bunlar nadirdir ve oldukça pahalı cihazlar olsa da).
Panik yapmayın / endişelenmeyin, türev terimi gönülsüzce bırakın. Unutmayın, dünya çapındaki PID kontrolörlerinin% 90'ı sadece PI 😉
İntegral terim
Bu en sorunlu kısımdır. PID'ye neler olduğunu söylemeden kontrolör çıkışını [0, maxSpeed] içinde eşikleyemezsiniz. Basitçe yürümeyecek. Bunu yaparak, aslında, gözlemlediğiniz gibi doğru olan istenmeyen salınımları ortaya çıkaracaksınız.
Kontrolörün çalıştırma sınırlarından haberdar olmasını sağlamak için standart bir anti-rüzgar şemasına güvenmelisiniz .
Bu, literatürde iyi bilinen bir prosedürdür. Bunu PID denetleyicileri kutsal kitabında (par. 3.5) bulabilir, ayrıca bu ilginç MATLAB kaynağını okuyabilirsiniz .
Esasen, eşikli çıktı ile tam çıktı arasındaki farkı da entegre etmeniz gerekir (aşağıdaki resme bakın).
integralError += (currentError + thresOutput - sheerOutput) * timeStep
Son açıklamalar
Yukarıdaki tüm noktalarda oynadıktan sonra, kesinlikle fazla / eksikleri azaltmak için daha fazla şansınız olacak. Bununla birlikte, saf hız kontrolörü bir tür basit yaklaşım haline gelir. Bu nedenle, daha etkili ve doğru olmak için, sonunda quadcopter'ın dinamik modeliyle oynuyor olmalısınız.
Umarım yardımcı olur.