Bagaimana saya bisa menggunakan perpustakaan PID Arduino untuk menggerakkan robot dalam garis lurus?

19

Saya ingin membuat robot berbasis Arduino dengan 2 roda, quadrature encoders pada setiap roda, chip driver H-bridge (atau pengontrol motor) dan kastor. Saya ingin menggunakan perpustakaan PID untuk memastikan kecepatan sebanding dengan jarak yang harus ditempuh.

Pada level konseptual, (dengan asumsi motor tidak merespons secara identik ke level PWM) bagaimana saya bisa mengimplementasikan kontrol PID sehingga ia bergerak dalam garis lurus dan dengan kecepatan yang sebanding dengan jarak yang tersisa untuk menempuh perjalanan?

Robert
sumber
Pertanyaan ini juga ada di sini, karena secara khusus berbasis di sekitar perpustakaan PID Arduino .
Anindo Ghosh

Jawaban:

18

Spesifik

Melihat Contoh Dasar PID saya pikir Anda hanya perlu instantiate dua salinan kontroler PID, satu untuk setiap roda, encoder dan PWM:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Kemudian, dalam loop()padanan Anda, Anda baru saja membaca kedua encoders, meneruskan setiap nilai encoder ke yang relevan PIDdan akhirnya menuliskan kedua nilai PWM.

Untuk saat ini SetpointLeftdan SetpointRightbenar-benar dapat menunjuk pada nilai yang sama, tetapi mendefinisikannya secara terpisah seperti ini memungkinkan Anda untuk menambahkan kemampuan untuk mengubahnya nanti.

Konsep

Meskipun ini bisa digunakan untuk kasing dasar, apakah cukup tergantung pada seberapa akurat garis lurus yang Anda butuhkan.

Perhitungan yang salah

Mengingat Anda memiliki encoders pada setiap roda, jika Anda menjalankan dua loop PID dan membandingkan kesalahan masing-masing roda berikut , maka Anda berpotensi dapat menghitung kesalahan abbe maksimum Anda jarak, dengan asumsi roda Anda tidak tergelincir. Jika kesalahan itu lebih kecil dari kebutuhan Anda, maka perhitungan mati adalah yang Anda butuhkan.

Namun, jika roda Anda cenderung tergelincir, maka Anda mungkin telah menyembunyikan kesalahan berikut yang tidak dapat dideteksi oleh sistem kontrol Anda dan Anda akan memerlukan beberapa cara untuk mendeteksi slip atau menghitung posisi secara independen dari pembuat enkoder Anda dan kemudian menggunakan perangkat lunak tingkat yang lebih tinggi untuk memperbaiki menuntut posisi / kecepatan roda untuk mempertahankan garis lurus.

Penentuan posisi relatif

Seperti yang disarankan John , Anda mungkin bisa menggunakan accelerometer untuk menentukan posisi, tetapi mengingat ketepatan dan efek akumulasi kesalahan dari waktu ke waktu, Anda mungkin lebih baik menggunakan data accelerometer untuk mendeteksi dan memperbaiki selip roda.

Dalam robotika seluler, teknik penyaringan Kalman biasanya digunakan untuk memadukan data dari berbagai sumber, seperti akselerometer dan penyandian roda untuk menentukan posisi saat ini dengan lebih baik.

Namun apa pun yang Anda lakukan dengan penentuan posisi relatif, lama kelamaan posisi yang Anda yakini akan menjauh dari posisi fisik Anda yang sebenarnya.

Penentuan posisi absolut

Satu-satunya cara untuk mengatasi ini adalah memiliki titik referensi di luar kerangka referensi kendaraan Anda.

Sebuah roomba misalnya biasanya menggunakan perhitungan mati untuk bergerak di sekitar ruangan, tetapi setiap kali itu perlu berlabuh, itu mencari seberkas cahaya infra merah yang dikirim oleh dock pengisian daya. Saat roomba bergerak secara acak melalui balok itu, ia mendeteksi, mengunci balok dan mengikutinya kembali ke sumbernya. Dalam kombinasi dengan sensor benjolan, sensor ini dapat memposisikan dirinya secara akurat pada kontak pengisian daya.

Untuk robot Anda, itu mungkin memiliki posisi rumah, di mana ia dapat kembali ke dan mendeteksi bahwa itu di lokasi yang diketahui. Pada titik itu ia tahu persis di mana itu dan dapat melaporkan seberapa jauh posisi yang dihitung itu dari posisi aktualnya.

Pilihan lain, jika Anda membutuhkan robot Anda untuk bepergian dalam garis lurus lebih dari ratusan meter adalah dengan beralih ke teknik yang berbeda, seperti menambahkan perisai GPS Arduino .

Kombinasi teknik

Pada akhirnya, tergantung pada persyaratan akurasi Anda, Anda mungkin perlu menggunakan kombinasi teknik ini.

Jika sorotan pemandu dimungkinkan, Anda mungkin dapat melakukan apa yang Anda inginkan dengan sangat sederhana dengan teknik mengikuti garis yang tidak terlihat . Jika Anda perlu bergerak dalam garis lurus sewenang-wenang di area terbatas, maka seperti roomba Anda mungkin dapat menggunakan sepasang balok pemandu (pada sudut kanan satu sama lain) untuk memungkinkan Anda memperbaiki posisi disintesis Anda dalam satu sumbu Cartesian setiap kali robot melewati salah satu balok.

Ada banyak opsi di sini, dan apa yang Anda pilih akan tergantung pada apa yang Anda butuhkan.

Mark Booth
sumber
1

Jika Anda tidak menggunakan poros tunggal untuk menggerakkan kedua roda, satu-satunya solusi yang dapat saya lihat adalah menambahkan akselerometer 3-sumbu atau sensor lain untuk mendeteksi orientasi robot, dan sesuaikan sinyalnya dengan masing-masing motor.


sumber
0

Seperti yang dikatakan di atas, Anda memulai dengan menyuruh setiap roda untuk bergerak dengan kecepatan yang sama dan kemudian PID memastikan mereka berlari dengan kecepatan itu. Tapi ini TIDAK akan sempurna. Anda harus terus memeriksa dan memperbaiki kesalahan (1) membaca secara berkala dan membandingkan jumlah enkoder roda dua dan membuat satu roda berjalan sedikit lebih cepat jika diperlukan untuk mendapatkan jumlah yang sama. dan (2) pembuat enkode TIDAK PERNAH sempurna, Anda membutuhkan akselerometer dan kompas.

Anda melihat filter Kalman. jika Anda ingin menggabungkan data encoder, kompas dan accelerometer untuk memberi Anda tajuk.

pengguna3150208
sumber
0

Tautan ini memberikan contoh yang baik tanpa dua perhitungan PID. Anda juga dapat menerapkan imu / kompas untuk mengukur jalur lurus

acs
sumber