Quadcopter: Stabilisasi sepanjang sumbu z (untuk menahan ketinggian)

8

Saya baru-baru ini menghabiskan beberapa pekerjaan pada firmware quadcopter saya. Model ini menstabilkan sikapnya sekarang dengan relatif baik. Namun saya perhatikan, bahwa itu kadang-kadang mengubah ketinggiannya (mungkin tekanan berubah, angin atau turbulensi). Sekarang saya ingin menyingkirkan tetes ketinggian ini dan tidak menemukan banyak literatur. Pendekatan saya menggunakan accelerometer:

  • Menghitung gaya-g saat ini dari sumbu-z
  • jika g-force> 0,25 g dan lebih panjang dari 25 ms, maka saya memasukkan istilah accelerometer (cm per s²) ke dalam pid
  • output dikirim ke motor

Model sekarang bereaksi ketika jatuh dengan regulasi motor. Namun, saya tidak yakin, apakah pintar untuk memasukkan percepatan saat ini ke dalam regulator dan saat ini saya bertanya-tanya, apakah ada metode yang lebih cerdas untuk menghadapi perubahan ketinggian yang tiba-tiba dan lebih kecil.

Kode saat ini:

# define HLD_ALTITUDE_ZGBIAS 0.25f
# define HLD_ALTITUDE_ZTBIAS 25

const float fScaleF_g2cmss = 100.f * INERT_G_CONST;
int_fast16_t iAccZOutput = 0; // Accelerometer

// Calc current g-force
bool bOK_G;
float fAccel_g = Device::get_accel_z_g(m_pHalBoard, bOK_G); // Get the acceleration in g

// Small & fast stabilization using the accelerometer
static short iLAccSign = 0; 
if(fabs(fAccel_g) >= HLD_ALTITUDE_ZGBIAS) {
  if(iLAccSign == 0) {
    iLAccSign = sign_f(fAccel_g);
  }

  // The g-force must act for a minimum time interval before the PID can be used
  uint_fast32_t iAccZTime = m_pHalBoard->m_pHAL->scheduler->millis() - m_iAccZTimer;
  if(iAccZTime < HLD_ALTITUDE_ZTBIAS) {
     return; 
  }

  // Check whether the direction of acceleration changed suddenly
  // If so: reset the timer
  short iCAccSign = sign_f(fAccel_g);
  if(iCAccSign != iLAccSign) {
    // Reset the switch if acceleration becomes normal again
    m_iAccZTimer = m_pHalBoard->m_pHAL->scheduler->millis();
    // Reset the PID integrator
    m_pHalBoard->get_pid(PID_ACC_RATE).reset_I();
    // Save last sign
    iLAccSign = iCAccSign;
    return;
  }

  // Feed the current acceleration into the PID regulator
  float fAccZ_cmss = sign_f(fAccel_g) * (fabs(fAccel_g) - HLD_ALTITUDE_ZGBIAS) * fScaleF_g2cmss;
  iAccZOutput = static_cast<int_fast16_t>(constrain_float(m_pHalBoard->get_pid(PID_ACC_RATE).get_pid(-fAccZ_cmss, 1), -250, 250) );
} else {
  // Reset the switch if acceleration becomes normal again
  m_iAccZTimer = m_pHalBoard->m_pHAL->scheduler->millis();
  // Reset the PID integrator
  m_pHalBoard->get_pid(PID_ACC_RATE).reset_I();
}
dgrat
sumber
1
Bagaimana kalau menggunakan sonar yang mengarah ke bawah untuk mengukur ketinggian?
dm76
2
Mengapa Anda menggunakan ambang 0.4g? Mengapa tidak, seperti yang Anda katakan, selalu mengirim akselerasi Z ke PID?
Rocketmagnet
Sonar bekerja hanya untuk 6m dan saya ingin menggunakan accelerometer hanya untuk perubahan mendadak dan kecil. Saya pikir saya harus menggunakan cutoff, karena accelerometer rentan terhadap noise sensor. Lebih jauh PID seharusnya hanya berfungsi ketika ada perubahan yang lebih besar, tidak untuk setiap gerakan kecil.
dgrat
Jalankan data accelerometer melalui filter low-pass digital?
Simon Richter
4
Sebelum Anda dapat memegang ketinggian dengan akurasi apa pun, Anda harus dapat mengukur ketinggian Anda dengan akurat. Sebelum Anda dapat bereaksi dengan cepat, Anda perlu mengukur dengan cepat. Dengan asumsi bahwa Anda dapat secara instan menentukan ketinggian Anda (dan mengubah daya dorong yang Anda inginkan dengan cara yang sama), berapa lama yang dibutuhkan motor Anda untuk mempercepat dan berapa lama waktu yang dibutuhkan untuk itu memiliki efek pada massa & kecepatan quadcopter? Apa perbedaan antara latensi optimal dan latensi yang Anda lihat sekarang?
Ian

Jawaban:

2

Ada dua pendekatan yang mungkin:

  1. Gabungkan data ketinggian (GPS atau tekanan) dan sensor akselerasi vertikal untuk menghitung ketinggian geometris yang lebih baik, dan sesuaikan pengontrol vertikal Anda menggunakan umpan balik ini dalam loop Anda.

  2. Gunakan loop augmentasi stabilitas untuk akselerasi z (dalam rangka tubuh). Dalam hal ini, jika kendaraan Anda berayun, seperti ditunjukkan pada jawaban Jon, kendaraan Anda akan merasakan akselerasi z dan akan mencoba memperbaikinya. Ini mungkin bukan praktik terbaik untuk bekerja pada z-akselerasi dalam rangka tubuh , karena ia akan memasangkan gulungan dengan ketinggian saat pesawat berguling dan bergerak. Jadi konversi trigonometri dapat dilakukan untuk mengubah data a_z (dalam bingkai tubuh) menjadi a_z_inertial (dalam bingkai Inertial, misalnya dalam gravitasi). Cara terbaik untuk mengerjakan ini di atas kertas (Anda memiliki roll dan pitch, yang mempengaruhi hasilnya).

Tentang algoritma saat ini:

  1. Saring akselerasi Anda. Coba rata-rata berjalan (low pass filter) dari akselerasi Anda, untuk menghilangkan kebisingan. Mungkin akan baik-baik saja untuk memiliki rata-rata berjalan 0,2 detik terakhir, misalnya.

  2. Jangan gunakan cut-off sama sekali. Itu membuat hidup menjadi tidak linier, dan itu tidak baik. Biarkan pengontrol menangani semua peristiwa, dan biarkan ia bereaksi terhadap kesalahan kecil, sebelum menjadi besar.

Gürkan Çetin
sumber
1

Belum dapat berkomentar.

Saya akan menambahkan gyro dan menggunakan filter komplementer atau Kalman. Accelerometer benar, rata-rata , tetapi salah, saat ini . Gyros benar, saat ini , tetapi rata-rata salah . Filter menimbang kedua input berdasarkan seberapa salahnya mereka dan menampilkan nilai di suatu tempat antara saat ini dan saat ini .

masukkan deskripsi gambar di sini

Jon
sumber
Saya tidak melihat bagaimana gyro dapat membantu dalam kasus ini, karena ia mengukur kecepatan sudut dan bukan variasi ketinggian. Accelerometer tidak memberikan pengukuran langsung dari ketinggian tetapi dapat memberikan umpan balik pada gerakan linear melalui integrasi, yah ...
Ugo Pattacini
Jika Anda membidik gyro dan akselerometer pada copter Anda, lalu memutarnya 45 derajat pada sumbu, gyro akan membaca 45 sekarang, kemudian mulai salah. Accelerometer akan salah, tetapi segera menunjukkan "turun" berada di 45. Kemungkinan accelerometer Anda merespons getaran tanpa filter. Lang dan filter akan tahu bahwa tidak ada alasan untuk membaca accelerometer dan memperbaikinya.
Jon
Demikian juga, ketika gyro mengatakan copter terbalik, akselerometer tahu turun masih turun.
Jon
Ok, Anda telah menyebutkan penyesuaian filter komplementer klasik untuk mengoreksi pembacaan percepatan, tapi saya pikir di sini lebih baik menggunakan percepatan untuk mendapatkan estimasi ketinggian. Maksud saya, "bayangkan kita memiliki nilai akselerasi yang baik maka yang kita butuhkan di sini adalah ..."
Ugo Pattacini
Ketika copter miring, accelerometer-z berubah dan copter melihat "jatuh" yang tidak terjadi. Dia sudah memaksanya untuk bekerja dengan zona nol tetapi ingin berhenti menjadi bingung.
Jon