Optimalisasi Pengikut Garis

9

Saya sedang mengerjakan pembuatan robot pengikut garis dan ingin mengoptimalkan kinerjanya. Disarankan agar saya menggunakan algoritma PID. Saya membaca banyak tentang PID tetapi sedikit bingung tentang hal berikut:

Saya telah menghitung error_value menggunakan Tetapi mengenai perubahan dalam kecepatan motor saya bingung apa yang harus digunakan selama perbandingan perbedaan (yaitu currentposition - setpoint) atau nilai error. Itu yang harus saya gunakankpproportional+...

if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }

atau

if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }

Juga apakah ada rentang yang ditentukan untuk nilai konstanta , dan ? Saya menggunakan robot roda diferensial untuk pengikut garis saya.kpkikd

Saya juga akan senang jika seseorang menyarankan saya algoritma optimasi canggih lainnya untuk meningkatkan robot pengikut garis.

meteor
sumber
Saya tidak yakin apa terminologi yang Anda gunakan, tetapi terminologi sistem kontrol normal "perbedaan" Anda adalah nilai kesalahan, dan (sedekat yang saya tahu) "kesalahan_value" Anda adalah perintah kontrol.
TimWescott
Halo, variabel , misalnya, adalah keuntungan proporsional Anda. Apakah Anda terbiasa dengan teori kontrol? Kp
leCrazyEngineer
@leCrazyEngineer Saya tidak ingat sebagian besar dari pertanyaan ini seperti 3 tahun yang lalu. Saya juga tidak tahu tentang teori kontrol. Mungkin orang yang menjawab akan memiliki petunjuk.
meteor

Jawaban:

8

Saat menggunakan PID loop untuk mengarahkan menggunakan garis berikut, maka titik setel Anda akan selalu sama. Anda akan selalu ingin garis berada di posisi yang sama sehubungan dengan robot, misalnya di tengah sensor Anda.

Jadi jika sensor garis Anda mengeluarkan nilai dari -1 hingga 1 dengan 0 menjadi pusat sensor, maka Anda ingin set point Anda menjadi nol (dan sensor membaca kembali dan perbedaannya akan sama). Jika sensor garis Anda menghasilkan nilai 0 hingga 10, maka Anda ingin set point Anda menjadi 5 (dan sensor Anda membaca kembali dan perbedaannya akan berbeda).

Karena Anda menyetir dengan mengatur roda untuk berputar pada kecepatan yang berbeda, maka untuk mengikuti garis dengan lancar pada kecepatan konstan, Anda mungkin ingin menyesuaikan kecepatan untuk kedua roda berdasarkan kesalahan. Misalnya, jika Anda perlu belok kiri untuk tetap di jalur, Anda akan memperlambat roda kiri dan mempercepat roda kanan. Semakin Anda perlu berputar, semakin banyak yang Anda butuhkan untuk memperlambat roda bagian dalam dan semakin banyak yang Anda butuhkan untuk mempercepat roda bagian luar.

Pertimbangkan situasi di mana Anda perlu mengubah radian ke kiri untuk memperbaiki kesalahan dan kecepatan Anda saat ini adalah :θeS0

Kemudi Diferensial

Jadi roda kiri Anda perlu melakukan perjalanan di dan roda kanan Anda perlu melakukan perjalanan di .SL=rθSR=(r+b)θ

Untuk mempertahankan kecepatan keseluruhan yang sama , Anda perlu , sehingga roda kiri perlu melakukan perjalanan di sedangkan roda kanan perlu melakukan perjalanan di .S0S0=(r+b/2)θSL=S0(b/2)θSR=S0+(b/2)θ

Karena kesalahan Anda cenderung ke nol, kecepatan setiap motor juga akan cenderung ke satu sama lain. Ketika kesalahan tumbuh, perbedaan kecepatan akan tumbuh juga.

Anda bahkan mungkin memerlukan roda bagian dalam Anda untuk berputar ke belakang jika sensor Anda memberi tahu Anda bahwa garis melengkung lebih kencang daripada jarak antara roda Anda. Ini adalah komplikasi yang dapat Anda lakukan selangkah demi selangkah karena kendali Anda semakin canggih.

Juga, karena kesalahan Anda akan memiliki nilai positif dan negatif (untuk mewakili kontinum dari skala kiri ... terlalu jauh ke kiri ... di telepon ... terlalu jauh ke kanan ... di luar skala maka Anda harus tidak perlu bertanya ifapakah kesalahannya positif atau negatif, Anda hanya perlu menghitung nilai baru berdasarkan nilai kesalahan, karena nilai positif dan nilai negatif harus memiliki efek berlawanan dan simetris pada motor.

Perhatikan bahwa untuk mengikuti baris, Anda mungkin bisa lolos hanya dengan istilah gain proporsional (yaitu membiarkan syarat lainnya nol). Menerapkan istilah Derivatif mungkin memungkinkan Anda untuk menaikkan jangka keuntungan proporsional lebih tinggi untuk mendapatkan sistem yang lebih responsif, tetapi istilah integral tidak mungkin membantu. Fakta bahwa jika robot Anda bergerak ke arah yang salah, kesalahannya akan semakin besar berarti gerakan fisik robot Anda akan bertindak seperti istilah integral.

Nilai spesifik P, D, dan I akan ditentukan oleh daya tanggap sistem Anda. Untuk saran umum tentang menyetel parameter PID, lihat jawaban saya dan lainnya tentang Apa strategi yang baik untuk menyetel loop PID?

Mark Booth
sumber
menurut Anda "Anda harus menghitung nilai baru berdasarkan nilai kesalahan, karena nilai positif dan nilai negatif harus memiliki efek berlawanan dan simetris pada motor." tetapi bagaimana cara menentukan motor mana yang harus mendapatkan efek kesalahan?
meteor
@AnkitShah Mereka berdua melakukannya. Semoga pembaruan saya akan menjelaskannya sedikit lebih baik.
Mark Booth
Terima kasih @Mark Booth yang benar-benar menjelaskan semuanya. Saya tidak punya cukup perwakilan. di situs untuk meningkatkan jawaban Anda tetapi benar-benar bagus dijelaskan.
meteor
Senang saya bisa membantu @AnkitShah - Jika Anda mengedit pertanyaan Anda untuk menghapus beberapa ambiguitas (seperti apakah Anda menggunakan kemudi diferensial atau ackermann) maka Anda akan mendapatkan upvote dari setidaknya saya dan mungkin orang lain juga. Seharusnya tidak butuh waktu lama untuk mendapatkan 15 rep jika Anda mendengarkan saran yang dibuat orang.
Mark Booth
Terima kasih @ Mark ada algoritma lain yang membantu mengurangi kesalahan dan membuat bot bergerak lebih lancar dan mengikuti garis?
meteor
3

Anda mungkin ingin memeriksa pertanyaan ini tentang cara menyetel PID .

Sepertinya Anda membingungkan peran errordalam perhitungan ini. Persamaan PID mengambil pengukuran kesalahan (posisi aktual - posisi yang diinginkan) dan menentukan berapa banyak "respons" harus diperintahkan dalam pengontrol (mis. Berapa banyak gaya).

Jadi, alih-alih mengatakan if (error_value > 0) { }, Anda harus mengatakan sesuatu seperti response = get_PID_calculation(error_value). Bergantung pada konstruksi kendaraan spesifik Anda, respons itu akan dikirim ke motor penggerak sebagai jumlah throttle, kemudi sesuai sudut yang diinginkan, atau beberapa input kontrol lainnya.

Ian
sumber
Ini adalah tautan ke kode Arduino saya apa yang Anda sarankan. www1.datafilehost.com/d/5dcbdd4e
meteor
Itu tergantung, apa yang dilakukan robot itu?
Ian