Tuning PID Quadcopter

13

Sebagai kelanjutan dari pertanyaan yang saya ajukan di sini: Ketidakstabilan Quadcopter dengan lepas landas sederhana dalam mode otonom ... Saya ingin mengajukan beberapa pertanyaan tentang penerapan PID dasar untuk quadrotor yang dikendalikan oleh modul APM 2.6. (Saya menggunakan bingkai dari 3DRobotics)

Saya telah melucuti seluruh sistem kontrol menjadi hanya dua blok PID, satu untuk mengendalikan roll dan satu lagi untuk mengendalikan pitch (menguap dan yang lainnya ... saya akan memikirkannya nanti).

Saya sedang menguji pengaturan ini pada rig yang terdiri dari balok yang berputar bebas, di mana saya mengikat dua lengan quadrotor. Dua lainnya bebas bergerak. Jadi, saya sebenarnya menguji satu derajat kebebasan (roll atau pitch) pada suatu waktu.

Periksa gambar di bawah ini: di sini A, B menandai sinar yang berputar bebas di mana pengaturan dipasang. masukkan deskripsi gambar di sini

Dengan penyetelan parameter P dan D yang cermat, saya berhasil mendapatkan penerbangan berkelanjutan sekitar 30 detik.

Tapi dengan 'berkelanjutan', maksud saya sederhana adalah tes di mana drone tidak jatuh ke satu sisi. Penerbangan mantap rock masih belum terlihat, dan lebih dari 30 detik penerbangan juga terlihat cukup sulit. Bergetar sejak awal. Pada saat mencapai 20 - 25 detik, ia mulai miring ke satu sisi. Dalam 30 detik, ia miring ke satu sisi dengan margin yang tidak dapat diterima. Tak lama kemudian, saya menemukannya terbalik

Sedangkan untuk kode PID itu sendiri, saya menghitung kesalahan proporsional dari 'filter gratis' data gyro + accelerometer. Istilah integral diatur ke nol. Istilah P mencapai sekitar 0,39 dan istilah D pada 0,0012. (Saya tidak sengaja menggunakan perpustakaan PID Arduino, hanya ingin menerapkan salah satu PID saya sendiri di sini.)

Periksa video ini, jika Anda ingin melihat cara kerjanya.

http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Yeh, pengaturannya cukup kuno! Saya setuju. :)]

Tolong beri tahu saya apa yang bisa saya lakukan untuk meningkatkan stabilitas pada tahap ini.

@ Ian: Dari banyak tes yang saya lakukan dengan pengaturan saya, saya membuat grafik grafik untuk beberapa tes menggunakan pembacaan dari monitor serial. Berikut ini adalah contoh pembacaan Roll vs 'Motor1 & Motor2 - input PWM' (dua motor yang mengendalikan roll):

Roll vs input PWM Motor

Adapun input / output:

Input: Nilai roll dan pitch (dalam derajat), seperti yang diperoleh oleh kombinasi accelerometer + gyro

Keluaran: Nilai PWM untuk motor, dikirim menggunakan fungsi motor.write () perpustakaan Servo


Resolusi

Saya menyelesaikan masalah. Begini caranya:

  1. Inti dari masalah ini terletak pada cara saya menerapkan program Arduino. Saya menggunakan fungsi write () untuk memperbarui sudut servo, yang kebetulan hanya menerima langkah integer dalam argumen (atau entah bagaimana hanya menanggapi input integer, 100 dan 100.2 menghasilkan hasil yang sama). Saya mengubahnya menjadi writeMicroseconds () dan itu membuat copter lebih mantap.

  2. Saya menambahkan RPM pada satu motor sekaligus menjaga yang lain pada nilai yang stabil. Saya mengubah ini untuk meningkatkan RPM dalam satu motor sekaligus mengurangi motor lawan. Itu agaknya menjaga total dorong horizontal tidak berubah, yang mungkin membantu saya ketika saya mencoba untuk mendapatkan ketinggian vertikal pada benda ini.

  3. Saya mendorong RPM ke batas maksimal, itulah sebabnya quadcopter terus kehilangan kendali dengan kecepatan penuh. Tidak ada ruang untuk RPM untuk meningkat ketika merasakan kemiringan.

  4. Saya mengamati bahwa salah satu motor secara inheren lebih lemah daripada yang lain, saya tidak tahu mengapa. Saya hardcoded offset ke input PWM motor.

Terima kasih atas semua dukungannya.


Kode sumber:

Jika Anda tertarik, inilah kode sumber implementasi PID saya yang sederhana: Kode Sumber PID

Silakan mengujinya di perangkat keras Anda. Segala kontribusi untuk proyek akan disambut baik.

metsburg
sumber
1
Apa input dan apa output dari loop?
Guy Sirton
@GuySirton: Memperbarui pertanyaan saya
metsburg
Apa itu bagian datar di perintah motor Anda? Sepertinya ada sesuatu yang jenuh. Anda memutar perubahan seperti fungsi terus menerus tetapi perintah Anda terlihat sangat tiba-tiba. Juga mengapa kedua perintah PWM motor melayang ketika input gulungan Anda tetap berada dalam kisaran yang sama? Omong-omong berapa kira-kira skala waktu?
Guy Sirton
1
Alasan Anda kehilangan kendali setelah 30 detik mungkin terkait dengan kedua perintah Anda. Saya pikir Anda mencoba untuk mengontrol perbedaan antara perintah tetapi Anda tidak bisa membiarkan mereka terus melayang.
Guy Sirton
@GuySirton: Mereka tidak melayang, saya menaikkannya dari nol, sehingga mencapai kondisi stabil tertentu dalam 3/4 detik. Namun, saya pikir Anda benar ketika Anda mengatakan "alasan Anda kehilangan kendali setelah 30 detik mungkin terkait dengan kedua perintah Anda melayang". Jika saya tidak menggunakan kenaikan bertahap ini, jika saya memperbaiki input PWM saya pada tingkat tertentu (lebih rendah dari input maks yang ditunjukkan di atas), masalah kehilangan kontrol setelah 30 detik hilang.
metsburg

Jawaban:

6
  1. Sepertinya keuntungan proporsional Anda terlalu tinggi.
  2. Anda tampaknya secara konstan meningkatkan RPM pada satu motor sambil mengunci yang lain untuk membuat sistem berputar. Ini bukan strategi kontrol yang baik karena pada akhirnya mereka akan jenuh dan Anda akan kehilangan kendali. Juga seiring waktu meningkatkan kemampuan Anda untuk memerintahkan sistem berkurang. Jadi, Anda membutuhkan model sistem yang lebih baik.
  3. Jika Anda berurusan dengan # 1, dan # 2 Anda akan memiliki sistem yang lebih stabil tetapi Anda mungkin tidak puas dengan bandwidth kontrol. Untuk mengatasinya Anda perlu membuat sistem Anda lebih kaku yang mencakup menyingkirkan segala kelambatan pada sisi sensor hal-hal dan pada sisi kontrol hal-hal.
Guy Sirton
sumber
3

Saya akan mulai dengan membaca pertanyaan ini: Apa strategi yang baik untuk mengatur loop PID?

Jika saya harus menebak, saya akan mengatakan Anda memiliki masalah dalam cara filter gratis Anda dibangun. Dengan motor quadcopter dimatikan, Anda harus memiringkan frame bolak-balik dan melihat apakah nilai roll / pitch yang dilaporkan benar-benar akurat.

Bagi saya, sepertinya ada penundaan antara input dari accelerometer dan output dari filter Anda - osilasi dapat dijelaskan oleh reaksi yang terlambat terhadap data input. Pembalikan akhirnya tampak seperti kemungkinan kesalahan integrasi yang terakumulasi dari waktu ke waktu - dengan kata lain, sementara quadcopter Anda berada di sisinya, ia sebenarnya berpikir itu melayang secara merata.

(Pembaruan) Mengenai grafik Anda, fakta bahwa kecepatan motor Anda terus meningkat (bukannya tetap seimbang) berarti Anda memiliki kesalahan di suatu tempat. Mungkin istilah Integral Anda tumbuh tanpa batas, dan Anda harus menentukan maksimum yang masuk akal untuk itu.

Ian
sumber
Saya memperbarui pertanyaan saya dengan nilai gulungan, saat memiringkan bolak-balik. Saya memecahkan pembalikan akhirnya dengan menurunkan input PWM maks. Sepertinya nilai koreksi tidak bekerja pada RPM yang sangat tinggi. Saya dapat dengan mudah memutar rig dengan tangan saya ketika bekerja di RPM tinggi. Pada RPM yang lebih rendah, saya merasakan hambatan yang cukup besar dan quadcopter tampaknya berosilasi kembali ke posisi semula (yang bagus, saya kira). Jadi, masalah 'turn over' mungkin diselesaikan dengan menurunkan RPM (tidak tahu apakah drone akan lepas landas sama sekali atau tidak, harap itu terjadi). Masalah osilasi masih ada.
metsburg
35±90
Yah, grafiknya tidak persis untuk tes yang ditunjukkan dalam video. Seperti disebutkan di atas, grafik berasal dari salah satu dari banyak tes yang saya lakukan dengan pengaturan ini dan saya tidak ingat persis seperti apa bentuk kasus ini. Grafik ini hanya untuk memberi Anda gambaran tentang bagaimana respons input vs output berperilaku, dan saya juga ingin memastikan bahwa tidak ada banyak jeda antara input dan output (mengingat bahwa loop berjalan pada 150+ Hz). Mencocokkan video dengan grafik mungkin tidak masuk akal. Saya tidak memiliki set data yang tepat untuk pengujian dalam video.
metsburg
Saya menyadari grafiknya agak menyesatkan, maaf untuk itu. Saya akan mencoba dan memperbarui grafik dengan yang lebih akurat. Sebenarnya, karena saya merencanakan data dari port serial, ketika saya membuat grafik ini, papan Arduino ditambatkan dengan laptop. Setelah sedikit osilasi, saya harus turun tangan dan memperlambat osilasi secara manual. Itu sebabnya Anda melihatnya menetap di - 5 derajat, sedangkan pada kenyataannya sekitar 90 derajat. Saya akan mencoba memperbarui grafik yang lebih akurat nanti.
metsburg
Satu hal lain yang saya lihat dari grafik adalah bahwa daya dorong gabungan Anda selalu meningkat. Sepertinya itu salah.
Ian
1

Mungkin ada beberapa hal yang terjadi di sini ...

1) Apakah sudut yang Anda laporkan benar? berisik? Anda dapat dengan mudah memeriksanya dengan memiringkan quad Anda secara manual dan memonitor nilai-nilai yang keluar.

2) implementasi PID Anda sendiri memiliki bug. Anda dapat menggunakan implementasi tepercaya di luar sana untuk memeriksa kode Anda.

3) Alat Peraga, motor terpasang dengan cara yang salah.

4) ...

dm76
sumber
1) Saya telah memiringkan dan memeriksa sudut yang dilaporkan, hampir benar, tapi pasti berisik. 2) sangat mungkin ... pada kenyataannya, saya pikir itu merangkum sepenuhnya: P 3) tidak sangat mungkin, dua searah jarum jam, dua searah jarum jam ... Saya telah memeriksa alat peraga berkali-kali + Saya kira jenis kesalahan ini akan telah menghasilkan kesalahan liar, jauh di luar kendali. 4) ....
metsburg
4) ... penyetelan PID yang salah dapat memperburuk keadaan daripada jika Anda tidak memiliki PID sama sekali!
dm76
Yeh, aku mengerti sekarang. Saya akan mengerjakannya besok. Rencana pertama saya adalah menggunakan PID library yang tepercaya dan yang kedua adalah mengubah output PID dari sinyal PWM ke roll.pitch koreksi.
metsburg