Implementasi algoritma PID menggunakan visi komputer

10

Saya membangun pemecah labirin labirin otomatis, dan menggunakan webcam untuk mengontrol labirin saya.

Berdasarkan saran di forum lain, saya mencoba mengendalikan pergerakan bola labirin setidaknya dalam satu arah saat ini. Jadi, saya mencoba mengendalikan pergerakan bola saya antara dua koordinat 466.288 dan 466.152. Input ke papan pengontrol motor stepper adalah waktu, tidak ada langkah untuk memutar untuk setiap sumbu yaitu x dan y.

Papan pengontrol motor stepper yang saya gunakan adalah papan pengontrol motor stepper bot telur: http://www.sparkfun.com/products/10025

Jadi untuk berpindah di antara dua poin, haruskah saya membuat sejumlah titik arah antara dua poin yaitu 288 dan 152 (katakanlah 260 240 230 ... 150) dan perbaiki gerakan bola saya?

Algoritma pemrosesan gambar saya tidak cukup cepat untuk melacak bola sehingga bola hanya akan berputar dan jatuh ke dalam lubang.

Beberapa menyarankan agar saya menggunakan templat standar seperti yang ditunjukkan dalam video berikut dan mengoreksi gerakan bola saya untuk penyimpangan di jalur:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

Saya juga menemukan alat pengolah gambar di mana mereka memecahkan masalah yang sama menggunakan poin cara untuk gerakan bola. Melihat terlalu banyak solusi untuk masalah yang sama, saya benar-benar bingung untuk menyelesaikan masalah. Saya sadar bahwa saya harus mengimplementasikan kontroler PID. Tetapi bagaimana saya harus menyelesaikan masalah secara bertahap? Saya macet dan hanya frustrasi dalam menemukan headstart dalam menyelesaikan masalah.

Setup saya terlihat seperti ini:

gambar pengaturan

... dan inilah tangkapan layar perangkat lunak saya:

tangkapan layar

Revisi 2: Saya juga menghadapi masalah baru sekarang: Sebelumnya saya mengendalikan motor stepper melalui applet Java port serial Arduino. Saya bisa menggerakkan steppers menggunakan applet.

Saya harus mengatur ulang papan setiap kali saya mencoba berkomunikasi melalui port serial. Juga, motor stepper memberi energi sendiri dalam interval kecil ketika tidak ada perintah yang dikirim kepadanya. Ketika motor stepper memasuki mode ini, saya tidak dapat mengontrol papan saya tanpa mengatur ulang papan. Bantuan apa pun akan dihargai.

Revisi 3:

Saya membuat beberapa kemajuan di mana saya menerapkan algoritma PID. Silakan temukan video di bawah ini: http://www.youtube.com/watch?v=MEfp7RqPmqY

Sekarang saya punya masalah dengan kecepatan di mana algoritma PID diimplementasikan. Sebenarnya pemrosesan gambar saya menyelesaikan siklus dalam 200 ms, mengidentifikasi bola dan mengirim perintah ke papan pengontrol motor stepper. Meskipun port serial saya dikirim perintah untuk berganti arah, stepper saya terus berputar ke arah yang sama. Anda dapat menemukan perilaku aneh di video di atas.

Pikir saya adalah bahwa saya harus membatasi nilai PID dengan langit-langit di mana jika nilai PID yang dihitung lebih besar dari 100, saya hanya harus mengirim 100. Saya berharap untuk mendengar pendapat Anda tentang ini.

Cara saya mengimplementasikan kontroler PID adalah saya mengidentifikasi titik awal templat menggunakan algoritme pencocokan templat dan mengidentifikasi bola menggunakan algoritme pencocokan templat lain. Sekarang, saya membuat bola bergerak ke titik tengah dari template titik awal. Bagaimana saya membuatnya mengikuti garis lurus dengan algoritma PID?

Revisi 4:

Lintasan gumpalan terisolasi

Saya telah mengisolasi lintasan tetapi saya tidak dapat menemukan fungsi yang benar untuk mencetak koordinat piksel yang benar dari titik awal. Adakah pikiran?

Sai
sumber
1
Re PS: Lalu, cukup kirim tautan ke gambar dan saya yakin seseorang akan datang dan menggantinya dengan gambar itu sendiri ...
Majenko
@Matt - Diperbaiki! Namun, saya lebih suka bahwa pengguna menyediakan teks untuk pergi dengan gambar, bukan hanya tautan ke gambar. Saya tidak yakin di mana @Sai menginginkannya, saya hanya meletakkannya di bagian bawah.
Kevin Vermeer
Wow .... Apakah steppers itu memiliki torsi yang cukup untuk menggerakkan papan dengan kecepatan apa pun? Saya berharap ada beberapa pengurangan gigi di sana di suatu tempat.
Connor Wolf
@ Palsu - Steppers seharusnya tidak memiliki masalah dengan ini. Papan tidak banyak menimbang dan beratnya seimbang. Saya memiliki jam dinding dengan panjang tangan 40cm dan dikendalikan oleh mekanisme kecil yang sama dengan yang lain, itu juga stepper. (Mekanisme 5cmx5cm terlihat sangat kecil dibandingkan dengan diameter 80cm jam)
stevenvh
@ Palsu: Steve benar. Saya tidak punya masalah dengan stepper. Ini semua tentang algoritma PID
Sai

Jawaban:

2

Pertama, karena steppers hebat dalam penentuan posisi (tidak perlu umpan balik posisi), Anda tentu harus membatasi gerakan mereka seperti yang Anda katakan sendiri. Saya tidak yakin bagaimana poros motor direkayasa saat ini, tetapi jika itu diperbaiki ke motor, membiarkannya terus berputar akan berisiko merusak peralatan.

Selanjutnya, keterlambatan transport 200 ms pada sensor Anda mungkin akan terlalu lambat, jika tidak, Anda akan perlu banyak memperlambatnya untuk memperlambat bola itu sendiri. Mirip dengan apa yang dikatakan Rocket Surgeon , Anda harus menyederhanakan algoritma pemrosesan gambar untuk menghitung jalur hanya sekali , dan kemudian dengan cepat menghitung hanya posisi bola di setiap frame. Jika Anda ingin melewati langkah ini dengan cepat, cari bola merah dan bukan yang ini, dan kemudian periksa hanya komponen merah di gambar RGB Anda, sampai Anda menemukan algoritma yang lebih baik.

Untuk kontrol PID, mulailah dengan fakta bahwa Anda benar-benar membutuhkan dua pengontrol PID yang terpisah, satu untuk motor timur-barat, yang lain untuk yang utara-selatan. Jika Anda memiliki dua motor yang tepat, parameternya harus sama.

Agar pengontrol PID dapat bertindak, perlu diketahui kesalahannya : perbedaan antara posisi yang diinginkan, dan posisi bola yang sebenarnya. Komponen X dan Y dari offset ini akan menjadi input untuk dua pengontrol PID (satu untuk setiap motor). Untuk mendapatkan kesalahan, Anda harus memiliki posisi yang diinginkan di jalur Anda terlebih dahulu: lintasan .

Untuk mendapatkan lintasan, Anda perlu memproses gambar dan mendapatkan jalur , serta titik awal dan akhir. Saya tidak yakin apakah algoritme Anda dapat membedakan jalur dari bagian papan lainnya sekarang, tetapi jika tidak, perhatikan bahwa ini adalah algoritme tersendiri yang harus ditangani sebelum melanjutkan. Sekali lagi, Anda dapat melewati bagian ini dengan memasukkan titik persimpangan secara manual, jika Anda ingin melihat beberapa hasil dengan cepat. Bagaimanapun, Anda harus dapat menentukan kecepatan setpoint, dan minta perangkat lunak Anda memindahkan posisi koordinat yang diinginkan melewati jalur, dari awal hingga akhir. Tentunya, Anda akan mulai dengan kecepatan yang diinginkan rendah.

Jadi, sebelum memulai dengan kontrol, Anda harus memeriksa daftar periksa berikut terlebih dahulu:

  • Sederhanakan algoritma pemrosesan gambar Anda untuk mendapatkan respons yang lebih cepat
  • Buat algoritma yang membuat lintasan di atas jalur Anda menggunakan kecepatan yang telah ditentukan
  • Di setiap bingkai:
    • Hitung perbedaan antara lintasan dan posisi bola
    • Lewati komponen delta-X ke PID timur-barat, teruskan delta-Y ke PID utara-selatan

Mungkin ternyata lebih baik untuk membuat lintasan satu segmen pada satu waktu , dan melanjutkan dengan segmen berikutnya ketika bola itu mengakhiri yang sebelumnya. Jika tidak, Anda harus berhati-hati agar bola tidak melampaui lintasan yang diinginkan (yang mungkin sulit dicapai)

Groo
sumber
1

Jika Anda memiliki posisi tetap untuk kamera dan pembacaan mometary untuk kedua sumbu, maka Anda tidak perlu mengenali jalur, lubang, dan dinding dalam bingkai. Itu dapat dilakukan satu-shot selama waktu setup. Dalam run-time Anda hanya perlu menemukan lokasi yang tepat dari bola logam mengkilap tunggal.

Untuk menemukan bola, Anda dapat menggunakan 1 titik IR LED dan filter narrowband pada kamera. Algoritma harus menghitung pixel paling terang dan menerjemahkan X, Y menjadi X nyata, Y dengan mempertimbangkan langkah-langkah akun seperti:

  • temukan pixel paling terang
  • gunakan sudut untuk kedua sumbu (membaca dari servo) untuk memulihkan jarak dari kamera
  • gunakan cap waktu untuk membaca posisi sumbu
  • terapkan interpolasi melalui waktu untuk membaca posisi jika diperlukan
  • gunakan distorsi lensa yang diketahui
  • terjemahkan dunia X, Y piksel ke sudut refleksi dari bola sempurna untuk menemukan pusat bola sejati di dunia X, Y
  • waktu delta untuk memulihkan waktu bingkai yang sebenarnya
  • interpolasi dalam waktu posisi di papan pesawat X, Y jika diperlukan
  • kirim hasil X, Y (t) ke algoritma PID
  • kirim umpan kedua sasaran X, Y (t) dari lintasan generator / urutan
  • biarkan PID untuk memutuskan output
  • mengeksekusi output (langkah terakhir dapat dilakukan secara paralel)

Seharusnya tidak intensif secara komputasi dan sebagian besar tergantung pada beberapa nilai absolut.

Biasanya, CPU kecil harus melakukannya dengan kecepatan framerate.


sumber
Saya tidak yakin bahwa saya memahami solusi Anda. Saya menemukan solusi Anda menarik. Bagaimana cara memastikan bahwa bola saya mengikuti jalur yang benar? Haruskah saya memastikan bahwa saya memiliki seperangkat waypoint untuk diikuti?
Sai
Iya. Perangkat lunak kontrol gerak harus selalu memiliki "generator lintasan", yang merupakan rutin menghasilkan urutan terbatas X, Y (t) yang ideal untuk setiap langkah waktu tertentu. Urutan ini diumpankan ke input pertama loop kontrol, input kedua loop kontrol adalah urutan posisi nyata. Kontrol rutin harus menghitung kesalahan posisi / kecepatan / akselerasi dan memperkuat / menjumlahkan semua kesalahan sesuai dengan PID dan menghasilkan sinyal koreksi yang dihasilkan.