Pendekatan menggunakan PID untuk mendapatkan robot diferensial mengemudi lurus

13

Pertimbangkan robot penggerak diferensial yang memiliki dua roda bermotor dengan enkoder yang terpasang pada masing-masingnya untuk mendapatkan umpan balik. Misalkan ada fungsi untuk setiap motor DC yang mengambil float dari -1 ke 1 dan mengatur sinyal PWM untuk memberikan jumlah daya yang proporsional ke motor itu. Sayangnya, tidak semua motor dibuat sama, sehingga mengirimkan setiap motor sinyal PWM yang sama membuat robot membelok ke kiri atau kanan. Saya mencoba untuk berpikir tentang cara menggerakkan robot lurus menggunakan encoders yang terpasang pada setiap motor sebagai input ke loop PID.

Inilah cara saya akan melakukannya: Saya akan mengambil perbedaan antara penyandi kiri dan kanan, mengikat kesalahan antara beberapa rentang, menormalkannya menjadi dari [-1, 1], dan kemudian memetakannya ke kekuatan motor 0 hingga 1. Jadi jika I dan D adalah nol, dan kita mendapatkan kesalahan 1 (jadi motor kiri telah berubah lebih dari motor kanan), maka motor kiri akan diatur ke 0, dan motor kanan diatur ke 1 (menyebabkan hard kiri).

Apakah ada masalah dengan ini? Apa pendekatan yang lebih baik?

Robz
sumber

Jawaban:

5

Apakah ada masalah dengan ini?

Masalah utama dengan ini adalah bahwa sementara solusi yang Anda usulkan akan segera memperbaiki ketidaksesuaian antara kinerja motor, itu tidak akan memperbaiki kesalahan akumulasi, apalagi kesalahan yang lebih kompleks pada posisi seperti kesalahan Abbe (lihat nanti).

Apa pendekatan yang lebih baik?

Ada beberapa hal yang dapat Anda lakukan, tergantung pada apa toleransi Anda terhadap kesalahan dan berapa banyak upaya yang ingin Anda lakukan untuk memperbaikinya.

Langkah pertama adalah membuat sepasang loop PID, satu untuk setiap roda, memberikan keduanya posisi permintaan yang sama. Seperti yang saya sarankan dalam jawaban saya untuk pertanyaan yang sama , jika Anda menjaga kedua roda dalam batas kesalahan yang sangat ketat di mana Anda meminta mereka, maka akan memakan waktu cukup lama untuk mengakumulasi kesalahan yang cukup untuk menyebabkan belokan yang terlihat.

Juga akan lebih mudah untuk menyetel dua loop PID tingkat Motor yang independen secara nominal daripada menyetel satu sistem gabungan kompleks yang saling tergantung. Agar dapat bertahan dari perubahan kontrol level yang lebih tinggi, Anda benar-benar membutuhkan setiap motor untuk berperilaku sedekat mungkin dengan motor lain sebanyak mungkin, dan itu benar-benar memerlukan loop servo terpisah.

Namun ada beberapa komplikasi lebih lanjut, dan itu tergantung pada keakuratan yang Anda butuhkan dan berapa banyak usaha yang Anda siapkan untuk mengoreksi mereka untuk solusi yang Anda pilih. Mungkin Dead Reckoning sudah cukup, atau Anda mungkin perlu menambahkan penentuan posisi Relatif atau Absolute ke robot Anda.

Satu masalah adalah bahwa bahkan jika roda kiri dan kanan Anda sama-sama memindahkan 1000 jumlah enkoder, Anda mungkin masih berakhir di posisi yang berbeda pada dua putaran yang berbeda.

Sebagai contoh, katakan Anda memiliki kesalahan berikut maksimum 10 hitungan encoder, dan motor Anda berjalan pada kecepatan katakanlah 10 jumlah encoder per iterasi PID loop. Motor kiri Anda mungkin bergerak 5,10,10,10 ... 10,5 sedangkan motor kanan Anda mungkin memiliki profil 4,11,10,10 ... 10,5 dan bahkan ada sedikit perbedaan dalam percepatan pada awalnya. dari langkah tersebut dapat menyebabkan robot melesat ke arah yang salah. Tidak hanya itu tetapi semakin jauh Anda bergerak ke arah itu, semakin besar kesalahan akan menjadi absolut. Inilah yang kita bicarakan ketika kita berbicara tentang kesalahan Abbe , dan tanpa model kinematik yang kompleks atau semacam referensi eksternal, Anda tidak akan pernah dapat memperbaikinya.

Untuk informasi lebih lanjut, lihat jawaban saya untuk pertanyaan serupa tetapi tidak cukup duplikat: Bagaimana saya bisa menggunakan perpustakaan PID Arduino untuk menggerakkan robot dalam garis lurus? dan jawaban saya untuk optimasi Line Follower juga terkait

Mark Booth
sumber
2

Saya memiliki bot dengan 2 roda yang digerakkan secara independen.

Saya memilih untuk menggunakan gyro agar tetap mengarah ke arah yang diinginkan, menabrak selip dan bahkan mengambilnya dan memutarnya adalah konsekuensi kecil karena itu hanya akan memperbaiki itu menuju.

Saya menggunakan PID tunggal, yang menambah / mengurangi koreksi pada kecepatan arus yang diinginkan untuk masing-masing 2 motor sesuai dengan kesalahan dalam pos saat ini (arah) seperti yang ditentukan oleh gyro.

Misalnya saya mengatur kecepatan ke 50% dan menuju ke 20degrees. ini biasanya akan menggerakkan kedua motor pada daya 50%. tetapi ketika tajuk lepas, PID akan melakukan penyesuaian dengan menambahkan daya pada satu motor dan melepaskan daya dari yang lain, sehingga Anda mungkin berakhir dengan pembagian daya 45% / 55% di antara motor saat pid mengoreksi tajuk.

Gyro memiliki masalah, meskipun dengan kalibrasi waktu yang dihabiskan, saya masih menemukan bahwa gryo saya memiliki sekitar 1 derajat per menit. Mungkin karena bumi berputar 15 derajat per jam, ini juga harus dipertimbangkan dalam jangka panjang.

Seperti yang dinyatakan sebelumnya encoders pada roda adalah ide bagus untuk benar-benar mengetahui seberapa jauh Anda telah bepergian.

Robert Sutton
sumber
Saya akan senang melihat kode Anda untuk ini. Saya memulai jalur yang sama dengan gyro / accelerometer / magnetometer tapi saya masih pada tahap awal hanya mencoba untuk masuk akal dari pembacaan dari sensor ini.
Ron Smith
Berikut ini tautan ke kode saya, saya khawatir ini mungkin tidak mudah dimengerti. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton