İki geniş yaklaşım vardır:
- uç efektör pozu verilen analitik çözümler, eklem koordinatlarını doğrudan hesaplar. Genel olarak çözüm benzersiz değildir, bu nedenle bir dizi olası ortak koordinat hesaplayabilirsiniz. Bazıları, robotun ortamındaki (veya kendisindeki) şeylere çarpmasına neden olabilir veya göreviniz belirli bir çözümü seçmenize yardımcı olabilir, yani. dirseğin yukarı (veya aşağı) veya robotun kolunun gövdesinin soluna (veya sağına) sahip olmasını tercih edebilirsiniz. Genel olarak, analitik bir çözüm elde edilmesinde kısıtlamalar vardır, 6 eksenli robotlar için küresel bir bilek (tüm eksenlerin kesiştiği) varsayılır. Birçok farklı robot türü için analitik çözümler on yıllar boyunca hesaplanmıştır ve muhtemelen robotunuz için bir çözüm sunan bir kağıt bulabilirsiniz.
- diğer cevaplarda açıklandığı gibi sayısal çözümler, ileri kinematikler doğru çözümü verene kadar eklem koordinatlarını ayarlamak için bir optimizasyon yaklaşımı kullanır. Yine, bu konuda büyük bir literatür ve birçok yazılım var.
MATLAB için Robotik Araç Kutumu kullanarak Denavit-Hartenberg parametrelerini kullanarak iyi bilinen 6 eksenli bir robot modeli oluşturuyorum
>> mdl_puma560
>> p560
p560 =
Puma 560 [Unimation]:: 6 axis, RRRRRR, stdDH, fastRNE
- viscous friction; params of 8/95;
+---+-----------+-----------+-----------+-----------+-----------+
| j | theta | d | a | alpha | offset |
+---+-----------+-----------+-----------+-----------+-----------+
| 1| q1| 0| 0| 1.5708| 0|
| 2| q2| 0| 0.4318| 0| 0|
| 3| q3| 0.15005| 0.0203| -1.5708| 0|
| 4| q4| 0.4318| 0| 1.5708| 0|
| 5| q5| 0| 0| -1.5708| 0|
| 6| q6| 0| 0| 0| 0|
+---+-----------+-----------+-----------+-----------+-----------+
o zaman rastgele bir ortak koordinat seçin
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
sonra ileri kinematiği hesaplar
>> T = p560.fkine(q)
T =
-0.9065 0.0311 -0.4210 -0.02271
0.2451 0.8507 -0.4649 -0.2367
0.3437 -0.5247 -0.7788 0.3547
0 0 0 1
Şimdi 6 eklemli ve küresel bir bileğe sahip bir robot için yayınlanmış bir analitik çözüm kullanarak ters kinematiği hesaplayabiliriz
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
ve voila, orijinal ortak koordinatlarımız var.
Sayısal çözüm
>> p560.ikine(T)
Warning: ikine: rejected-step limit 100 exceeded (pose 1), final err 0.63042
> In SerialLink/ikine (line 244)
Warning: failed to converge: try a different initial value of joint coordinates
> In SerialLink/ikine (line 273)
ans =
[]
başarısız olmuştur ve bu genellikle iyi bir başlangıç çözümüne ihtiyaç duydukları için yaygın bir sorundur. Hadi deneyelim
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
Şimdi bir cevap veriyor ama analitik çözümden farklı. TK sorununa birden fazla çözüm olduğu için sorun değil. İleri kinematiği hesaplayarak çözümümüzün doğru olduğunu doğrulayabiliriz
>> p560.fkine(ans)
ans =
-0.9065 0.0311 -0.4210 -0.02271
0.2451 0.8507 -0.4649 -0.2367
0.3437 -0.5247 -0.7788 0.3547
0 0 0 1
ve bunun başladığımız dönüşümle aynı olup olmadığını kontrol etmek (ki bu).
Diğer kaynaklar: