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 PID
dan akhirnya menuliskan kedua nilai PWM.
Untuk saat ini SetpointLeft
dan SetpointRight
benar-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.
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.