Durum Uzayı Modellerinde ve Denetleyicilerinde Hata Ayıklama

İşaretleri Kontrol Etmek

Durum alanı denetleyicilerindeki hataların en yaygın nedenlerinden biri, işaretlerin ters çevrilmesidir. Örneğin, WPILib’e dahil olan modeller, pozitif voltajın pozitif bir ivmeyle sonuçlanmasını bekler ve bunun tersi de geçerlidir. Pozitif voltaj uygulanması mekanizmanın ileriye doğru hızlanmasına neden olmazsa veya “ileri” hareket etmek kodlayıcıyı (veya diğer sensör okumalarını) düşürürse, pozitif voltaj girişinin pozitif kodlayıcı okumasıyla sonuçlanması için ters çevrilmelidirler. Örneğin, kodlayıcılarımın pozitif bir hız okuması için diferansiyel aktarma sistemime bir input of \([12, 12]^T\) (sol ve sağ motorlar için tam ileri) uygularsam, tekerleklerim robotumu “ileri” (yerel olarak + X ekseni boyunca) itmelidir.

Önemli

The WPILib DifferentialDrive, by default, does not invert any motors. You may need to call the setInverted(true) method on the motor controller object to invert so that positive input creates forward motion.

Grafiklerin Önemi

Reliable data of the system’s states, inputs and outputs over time is important when debugging state-space controllers and observers. One common approach is to send this data over NetworkTables and use tools such as Shuffleboard, which allow us to both graph the data in real-time as well as save it to a CSV file for plotting later with tools such as Google Sheets, Excel or Python.

Not

Varsayılan olarak, NetworkTables 10 hz güncelleme hızıyla sınırlıdır. Test için, 100 hz’ye kadar veri göndermek için aşağıdaki kod parçacığı ile bu atlanabilir. Yeni verileri zorla yayınlamak için bu kod periyodik olarak çalıştırılmalıdır.

Tehlike

Bu, NetworkTables üzerinden fazladan veri (100 hz’ye kadar) gönderecek ve bu, hem kullanıcı kodu hem de robot gösterge tablolarında gecikmeye neden olabilir. Bu aynı zamanda ağ kullanımını da artıracaktır. Yarışmalar sırasında bunu devre dışı bırakmak genellikle iyi bir fikirdir.

@Override
public void robotPeriodic() {
   NetworkTableInstance.getDefault().flush();
}
void RobotPeriodic() {
   NetworkTableInstance::GetDefault().Flush();
}
from ntcore import NetworkTableInstance

def robotPeriodic(self):
   NetworkTableInstance.getDefault().flush()

Giriş Gecikmesini Telafi Etme

Çoğu zaman, bazı sensör giriş verileri (yani hız okumaları), akıllı motor kontrol cihazlarının gerçekleştirme eğiliminde olduğu dahili filtreleme nedeniyle gecikebilir. Varsayılan olarak, LQR’nin K kazancı herhangi bir giriş gecikmesi olmadığını varsayar, bu nedenle onlarca milisaniye düzeyinde önemli bir gecikme uygulamak istikrarsızlığa neden olabilir. Bununla mücadele etmek için, LQR’nin K kazancı, istikrar için performansın takas edilmesi suretiyle azaltılabilir. Bu gecikmenin matematiksel olarak titiz bir şekilde nasıl telafi edileceğine dair bir kod örneği mevcuttur:ref:here <docs/software/advanced-controls/state-space/state-space-intro:LQR and Measurement Latency Compensation>.