İlk olarak, optimal tanımlamamız gerekir . En uygun olduğunu düşündüğünüzü söylemediğiniz için, çoğu insan ikinci dereceden bir ifade seçer. Örneğin, mevcut eklem açılarınızın vektörü tarafından verildiğini varsayalım . Bir hata ile - Biz gerekli hareketi en aza indirerek düşünülebilir , bir maliyet fonksiyonu tanımlayabilir matrisi için . Normalde diyagonal bir matris kullanırız, ancak herhangi bir pozitif-kesin matris kullanır.α⃗ x⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
İki eklem açısına sahip basitleştirilmiş bir örnekte, eklem daha ucuz bir motora (belki de son efektöre daha yakın) sahipse , maliyet fonksiyonuna sahip olabiliriza
J=[xaxb][1002][xaxb] , yani. eklem hareketi eklem gibi maliyetli iki katı .ba
Şimdi, kinematik denklem bir matris formülüdür ve Denavit-Hartenberg gösteriminde şunlar olabilir:
∏Ti=⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥ ; burada sağ taraf konumu ve yönlendirmeyi temsil eder (şu anda sıfır dönüş olarak ayarlanmıştır), eklem açıları göz önüne alındığında.(x,y,z)
Yönelim ve yalnızca konum umurumda olmadığından, son dönüşüm matrisinin ilk 3 sütununu ve ilk dönüşüm matrisinin son satırını kesebiliriz. Bu formülü aynı şekilde şu şekilde ifade edebiliriz:
⎡⎣⎢100010001000⎤⎦⎥∏Ti⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢xyz⎤⎦⎥
Sol tarafı çarparak üç denklem elde ederiz. Parametreler doğrusal olsaydı, çözmek basit olurdu. Bu, tüm aktüatörlerin doğrusal aktüatör olması durumunda geçerlidir. Bu durumda, sorun aslında ikinci dereceden bir programdır . Denklemi almak için sol tarafı yeniden düzenleyebiliriz:
Kx⃗ =⎡⎣⎢xyz⎤⎦⎥Bazı matrisi için .K
İkinci dereceden bir program, şu şekilde ifade edilebilen bir sorundur:
MinimizeJ=12x⃗ TQx⃗ +c⃗ Tx⃗
Tabi ,Ax⃗ ≤b⃗ Ex⃗ =d⃗
Bunu çözmek için, örneğin iç nokta, aktif küme, ... gibi kullanabileceğiniz birkaç algoritma vardır. Sadece uygun bir kütüphane bulun ve sizin için çözecektir.
Doğrusal olmayan bir denklem sisteminin çözülmesi daha zordur. Buna doğrusal olmayan programlama denir , ancak dönen eklemleriniz varsa sahip olduğunuz şeydir.
Temel olarak, matris denklemleri yerine, doğrusal olmayan fonksiyonlarınız vardır.
, tabi değerini en aza indirin kısıtlamaların RHS'sini sıfır yapmak için gerekirse yeniden düzenleyin)f(x)h⃗ (x)=0g⃗ (x)≤0
Bunu çözmek için kullanılan algoritmalar daha da karmaşıktır, ancak İç nokta, Sıralı karesel programlama (SQP), Aktif ayar, Güven bölgesi yansıtıcı algoritmaları içerir. Açıkçası, bu algoritmaların nasıl çalıştığının açıklaması çok uzundur ve bunu bu cevabın kapsamı dışında bırakacağım. Sadece kuadratik programlama için kullanılan algoritmalardaki içerik miktarı tek başına bir ders olabilir.
Sorunu çözmek için bir kütüphane bulmalısınız, verimli bir uygulamayı kodlamak uzun zaman alacaktır ve verimli uygulamalar bir seferde 100 (veya daha fazla) değişkeni işleyebilir. Örneğin, MATLAB kullanıyorsanız , Optimizasyon Araç Kutusu'ndan fmincon işlevinin nasıl kullanılacağı ile ilgili belgeler vardır .
Çevrimiçi olarak çözmek için C ++ veya başka bir yerel uygulama, örneğin NLopt isteyebilirsiniz. Bunun bir mikrodenetleyicinin hızlı bir şekilde çözebileceği bir şey olmayabileceğini ve birçok kütüphanenin bir mikrodenetleyici üzerinde kullanımı kolay olmayan başka bağımlılıkları olabileceğini unutmayın (bir bilgisayar için tasarlandıkları için).
Verimlilik konusunda endişelenmiyorsanız ve sadece kendiniz kodlayabileceğiniz bir şey istiyorsanız, ters kinematik problemini çözmek için çağırabileceğiniz bir fonksiyon olduğunu varsayarak , bir degrade iniş yöntemi yapabilirsiniz. Örneğin, rastgele bir rastgele başlangıç yönü seçerek, ters sorunu çözün, ardından maliyet işlevini kontrol edin. Ardından, yönlendirmeyi nasıl değiştirmeniz gerektiğini kontrol etmek için pertürbasyon analizini kullanabilirsiniz. Örneğin, geçerli yönlendirmenizin etrafındaki benzer yönleri kontrol ederseniz (örn. Kübik bir ızgarada 8 nokta), maliyet işlevinin her yönde nasıl değiştiğine dair ikinci bir sipariş yaklaşımı alabilirsiniz.
İkinci derece yaklaşımı kullanarak (çok değişkenli olduğu için Hessian matrisi olarak bilinir - oryantasyon için 3 boyutlu), maliyet fonksiyonunun gradyanının sıfır geçişini (yani, tahmin edilen yerel minima) bulabilirsiniz.
Yeni öngörülen yönelim ile, ters çözücüyü tekrar yerleştirin ve doğruluk yeterli olana kadar tekrarlayın.
Bunun muhtemelen o kadar etkili olmayacağını unutmayın, çünkü ters kinematik problemin kendisi yinelemeli olarak çözülmelidir (böylece tekrar tekrar çözmek için biraz zaman alan bir işlev kullanıyorsunuz). Ayrıca, ilgili kod tam teşekküllü bir optimizasyon algoritmasından daha az olabilir, ancak yine de oldukça önemlidir ve önemsiz bir zaman yatırımı değildir.
Her iki yöntemden birini kullanarak (doğrusal olmayan bir program olarak resmi olarak çözme veya ters problemi çözmek için bir işlevi kullanarak yinelemeli olarak kullanma), birden fazla yerel minimum varsa çözüm en uygun olmayabilir. Bu durumda, çeşitli yaklaşımları kullanarak küresel minimi bulmaya çalışabilirsiniz. Doğrusal olmayan bir programlama çözücüsünde bile, başlangıç değerleriyle (örneğin eklem açıları) tohumlamanız beklenir. Her iki yöntemi de çeşitli şekillerde üretilen tohumla tekrar tekrar çalıştırabilirsiniz:
- rastgele yeniden başlatma (rastgele oluşturulur)
- Izgara esaslı
veya diğer özel yöntemler.
Bununla birlikte, eğer çok sayıda minima varsa, küresel minimi bulacağınızı garanti etmenin iyi bir yolu olmadığını unutmayın. Sadece şansınızı artırabilirsiniz.