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:
... dan inilah tangkapan layar perangkat lunak saya:
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:
Saya telah mengisolasi lintasan tetapi saya tidak dapat menemukan fungsi yang benar untuk mencetak koordinat piksel yang benar dari titik awal. Adakah pikiran?
Jawaban:
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:
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)
sumber
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:
Seharusnya tidak intensif secara komputasi dan sebagian besar tergantung pada beberapa nilai absolut.
Biasanya, CPU kecil harus melakukannya dengan kecepatan framerate.
sumber