Gerakan servo halus untuk robot merangkak

11

Saya membuat robot crawler kecil beberapa waktu lalu yang memiliki dua kaki dengan dua derajat kebebasan masing-masing, jadi 4 RC servos total. Sementara saya memprogram gerakan kaki saya perhatikan bahwa mereka bergerak agak kaku. Masuk akal bahwa pengontrol internal servo RC akan memiliki respons yang sangat cepat terhadap perintah posisi, tetapi saya ingin perayap saya bergerak dengan cara yang tampak sedikit lebih mulus dan seperti kehidupan.

Solusi saya adalah menciptakan fungsi kubik waktu yang menggambarkan jalur servos, dan kemudian mengatur posisinya dalam peningkatan waktu yang kecil, menghasilkan gerakan yang lebih halus. Pada dasarnya apa yang saya lakukan adalah memecahkan untuk koefisien dalam persamaan kubik dengan menggunakan interval waktu, mulai dan posisi servo berakhir, dan mulai dan berakhir tarif servo harus bergerak (yang hanya turunan dari posisi):ai

Memecahkan , , , dan :a0a 2 a 3a1a2a3

r a t e ( t ) = p o s i t i o n ' ( t ) = a 1 + 2 a 2 t + 3 a 3 t

position(t)=a0+a1t+a2t2+a3t3
rate(t)=position(t)=a1+2a2t+3a3t2

Diberikan: , , ,p o s i t i o n ( t f ) r a t e ( 0 ) r a t e ( t f )position(0)position(tf)rate(0)rate(tf)

Saya mengatur laju servo antara sepasang gerakan menjadi nol jika gerakan berada di arah yang berlawanan, dan positif atau negatif jika masing-masing pergerakan berada dalam arah positif atau negatif.

Ini bekerja cukup baik, tetapi solusi ini terbatas dalam beberapa cara. Untuk satu, sulit untuk memutuskan apa sebenarnya tingkat antara gerakan yang bergerak ke arah yang sama seharusnya. Saya menggunakan rata-rata lereng di depan dan di belakang posisi tertentu di antara gerakan, tetapi tidak jelas bagi saya yang optimal. Kedua, kurva kubik dapat membawa servo ke posisi di luar kisaran posisi di awal dan akhir gerakan, yang mungkin tidak diinginkan. Misalnya, pada titik tertentu selama interval waktu, kurva dapat menyebabkan servo melampaui posisi kedua, atau di bawah posisi pertama. Ketiga, pembuatan kurva di sini tidak mempertimbangkan tingkat maksimum yang dapat diubah servo, sehingga kurva dapat membuat servo bergerak pada kecepatan yang tidak realistis. Dengan itu,

Mengabaikan kekhawatiran terakhir, masalah ini dapat diselesaikan dengan meningkatkan derajat polinomial dan menambahkan kendala untuk dipecahkan untuk koefisien, tapi saya sekarang mulai bertanya-tanya ...

Apakah ada cara yang lebih baik dari ini untuk membuat gerakan servo halus dan tampak lebih seperti hidup?

Robz
sumber
Kode seharusnya relatif lurus ke depan. Bisakah Anda berbicara lebih banyak tentang mengapa itu terlibat?
DaemonMaker
1
Anda benar, kodenya cukup lurus ke depan, meskipun metode yang dihasilkan untuk mengontrol servos lebih kompleks dari sebelumnya. Saya telah mengedit pertanyaan saya untuk memasukkan deskripsi keterbatasan metode ini.
Robz
NURBS , non-seragam B-splines rasional, mungkin melakukan pekerjaan
James Waldby - jwpat7
@ jwpat7 terima kasih atas masukan Anda, tapi saya tidak berpikir NURBS akan bekerja karena kurva tersebut tidak dijamin mengenai poin yang diberikan
Robz
Kp

Jawaban:

6

Pembuatan Profil Gerakan

Di masa lalu, saya telah menggunakan generator profil gerak untuk menyelesaikan masalah ini. Untuk menggunakannya Anda perlu posisi target yang diinginkan (set point), kecepatan maksimum, dan nilai percepatan yang terkait dengan motor Anda. Ia bekerja dengan mengintegrasikan kurva kecepatan trapesium untuk mendapatkan profil posisi yang halus. S-curve dapat digunakan jika gerakan harus lebih halus. Referensi ke artikel yang menjelaskan tentang profil Gerak .

Set Point Pre-filtering

Selain dari rute profil gerakan, Anda dapat mencoba penyaringan perintah low-pass ke servos. Jenis pemfilteran setpoint ini akan memperlambat respons Anda, tetapi juga akan memperlancar responsnya dan mudah diterapkan. Frekuensi cut-off harus dipilih sehingga mendukung bandwidth sistem Anda (sehingga tidak menyaring gerakan yang diinginkan). Implementasi filter low-pass sederhana di C

ddevaz
sumber
+1: pasti menghasilkan profil gerak.
Guy Sirton
2

Saya pikir pertanyaannya mengacu pada perangkat semacam ini: servo RC

Biasanya itu bukan kinerja yang sangat tinggi sehingga mereka tidak akan dapat melacak profil gerak yang dihasilkan dengan sangat baik. Sebagian besar sistem kontrol motor komersial menggunakan kurva S untuk gerakan titik ke titik (lihat jawaban @ ddevaz) yang melakukan profil sepotong-sepotong di mana setiap segmen menggunakan persamaan yang berbeda. Masalah Anda adalah bahwa agar motor Anda melacak profil yang dihasilkan, Anda mungkin akan memiliki profil yang sangat "lambat". Kalau tidak, profil yang Anda coba dan perintahkan perangkat untuk diikuti akan memiliki kesalahan posisi besar vs posisi aktual perangkat.

Idealnya Anda akan menginginkan semacam umpan balik yang dapat Anda lihat saat Anda menjalankan gerakan sehingga Anda dapat melihat seberapa baik perangkat melacak perintah. Dari perspektif yang lebih praktis, jika Anda menginginkan gerakan yang jauh lebih baik, Anda mungkin memerlukan motor yang berbeda dan kontrol motor yang berbeda.

Guy Sirton
sumber