Pertama, kita perlu mendefinisikan optimal . Karena Anda tidak mengatakan apa yang Anda anggap optimal, kebanyakan orang memilih ekspresi kuadratik. Sebagai contoh, anggaplah sudut sendi Anda saat ini diberikan oleh vektor . Kami dapat mempertimbangkan meminimalkan pergerakan yang diperlukan - dengan kesalahan , Anda dapat menentukan fungsi biaya untuk beberapa matriks . Kami biasanya menggunakan matriks diagonal, tetapi matriks positif-pasti akan melakukan.α⃗ J= → x TQ → x Qx⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
Dalam contoh yang disederhanakan dengan dua sudut sambungan, jika sambungan memiliki motor yang lebih murah (mungkin lebih dekat ke end-effector), kita mungkin memiliki fungsi biayaa
b aJ=[xaxb][1002][xaxb] , yaitu. pergerakan sendi dua kali lebih mahal dari sambungan .ba
Sekarang, persamaan kinematik adalah rumus matriks, dan dalam notasi Denavit-Hartenberg mungkin:
( x , y , z )∏ Tsaya= ⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥ , di mana sisi kanan mewakili posisi dan orientasi (saat ini ditetapkan sebagai rotasi nol), mengingat sudut sambungan.(x,y,z)
Karena kita tidak peduli dengan orientasi, dan hanya posisi, kita dapat memotong 3 kolom pertama dari matriks transformasi terakhir, dan baris terakhir dari matriks transformasi pertama. Kami dapat mengekspresikan rumus ini secara setara sebagai:
⎡⎣⎢100010001000⎤⎦⎥∏ Tsaya⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥= ⎡⎣⎢xyz⎤⎦⎥
Mengalikan sisi kiri, kita mendapatkan tiga persamaan. Jika parameternya linier, itu akan mudah dipecahkan. Ini adalah kasus jika semua aktuator adalah aktuator linier. Dalam hal ini, masalahnya sebenarnya adalah program kuadratik . Kita dapat mengatur ulang sisi kiri untuk mendapatkan persamaan:
KKx⃗ = ⎡⎣⎢xyz⎤⎦⎥ , untuk beberapa matriks .K
Program kuadratik adalah masalah yang dapat diekspresikan dalam bentuk:
Minimalkan J= 12x⃗ TQ x⃗ + c⃗ Tx⃗
Tunduk pada , E → x = → dA x⃗ ≤ b⃗ Ex⃗ = d⃗
Untuk mengatasi ini, ada sejumlah algoritma yang dapat Anda gunakan, misalnya, titik interior, set aktif, .... Temukan saja perpustakaan yang cocok, dan itu akan menyelesaikannya untuk Anda.
Sistem persamaan non-linear lebih sulit dipecahkan. Ini disebut pemrograman non-linear , tetapi ini adalah apa yang Anda miliki jika Anda memiliki sambungan berputar.
Pada dasarnya, di tempat persamaan matriks, Anda memiliki fungsi nonlinier.
Minimalkan dengan , (atur ulang jika perlu untuk membuat RHS dari batasan nol)→ h ( x ) = 0 → g ( x ) ≤ 0f( x )h⃗ ( x ) = 0g⃗ ( x ) ≤ 0
Algoritma yang digunakan untuk menyelesaikan ini bahkan lebih kompleks, tetapi mencakup Interior-point, Sequential quadratic programming (SQP), Active-set, algoritma reflektif wilayah kepercayaan. Jelas, penjelasan tentang bagaimana algoritma ini bekerja sangat panjang, dan saya akan meninggalkannya di luar cakupan jawaban ini. Cukuplah untuk mengatakan, jumlah konten pada algoritma yang digunakan hanya untuk pemrograman kuadrat bisa menjadi keseluruhan saja dengan sendirinya.
Anda hanya perlu mencari pustaka untuk memecahkan masalah, akan butuh waktu lama untuk membuat kode implementasi yang efisien, dan implementasi yang efisien dapat menangani 100 (atau lebih) variabel pada satu waktu. Misalnya, jika Anda menggunakan MATLAB, maka ada dokumentasi tentang cara menggunakan fungsi fmincon dari Kotak Alat Pengoptimalan.
Untuk menyelesaikannya secara online, Anda mungkin ingin C ++ atau implementasi asli lainnya, misalnya, NLopt. Perhatikan bahwa ini mungkin bukan sesuatu yang dapat diselesaikan dengan cepat oleh mikrokontroler, dan banyak perpustakaan mungkin memiliki dependensi lain yang tidak mudah digunakan pada mikrokontroler (karena ditujukan untuk komputer).
Jika Anda tidak khawatir tentang efisiensi, dan hanya menginginkan sesuatu yang dapat Anda kode sendiri, maka dengan asumsi ada fungsi yang dapat Anda panggil untuk memecahkan masalah kinematik terbalik , Anda cukup melakukan metode gradient descent. Misalnya, secara sewenang-wenang memilih orientasi awal yang acak, menyelesaikan masalah terbalik, lalu memeriksa fungsi biaya. Kemudian Anda dapat menggunakan analisis gangguan untuk memeriksa bagaimana Anda harus memvariasikan orientasinya. Misalnya, jika Anda memeriksa orientasi serupa di sekitar orientasi Anda saat ini (mis. 8 poin dalam kotak kubik), Anda bisa mendapatkan perkiraan urutan kedua tentang bagaimana fungsi biaya bervariasi di setiap arah.
Dengan menggunakan perkiraan urutan kedua (dikenal sebagai matriks Hessian karena multivariat - 3-dimensi untuk orientasi), Anda dapat menemukan zero-crossing dari gradien fungsi biaya (mis. Minima lokal yang diprediksi).
Dengan orientasi yang diprediksi baru, cukup masukkan kembali solver solver, dan ulangi sampai keakuratannya memadai.
Perhatikan bahwa ini mungkin tidak akan seefisien, karena masalah kinematik terbalik itu sendiri harus diselesaikan secara berulang (jadi Anda berulang kali menggunakan fungsi yang membutuhkan waktu untuk diselesaikan). Juga, kode yang terlibat mungkin kurang dari algoritma optimisasi lengkap, tetapi masih cukup besar, dan bukan investasi waktu yang tidak signifikan.
Menggunakan salah satu metode (penyelesaian secara formal sebagai program nonlinear atau menggunakan iteratif menggunakan fungsi untuk memecahkan masalah terbalik), solusi mungkin tidak optimal jika ada beberapa minimum lokal. Dalam hal ini, Anda dapat mencoba menemukan minimum global dengan menggunakan berbagai pendekatan. Bahkan dengan pemecah pemrograman non-linear, Anda akan diharapkan untuk menaburnya dengan nilai awal (mis., Sudut sendi). Anda dapat berulang kali menjalankan metode mana pun dengan seed yang dihasilkan dengan berbagai cara:
- restart acak (dihasilkan secara acak)
- berbasis grid
atau metode khusus lainnya.
Namun perlu dicatat bahwa jika ada banyak minimum, tidak ada cara yang baik untuk menjamin bahwa Anda akan menemukan minimum global. Anda hanya dapat meningkatkan peluang Anda.