มีสองแนวทางกว้าง ๆ :
- โซลูชันการวิเคราะห์ที่ได้รับจากการวางตัวก่อให้เกิดผลโดยตรงคำนวณพิกัดร่วมโดยตรง โดยทั่วไปการแก้ปัญหาจะไม่ซ้ำกันดังนั้นคุณสามารถคำนวณชุดของพิกัดร่วมที่เป็นไปได้ บางคนอาจทำให้หุ่นยนต์ชนกับสิ่งต่าง ๆ ในสภาพแวดล้อม (หรือตัวมันเอง) หรืองานของคุณอาจช่วยให้คุณเลือกวิธีแก้ปัญหาเฉพาะเช่น คุณอาจต้องการข้อศอกขึ้น (หรือลง) หรือหุ่นยนต์ให้แขนไปทางซ้าย (หรือขวา) ของลำตัว โดยทั่วไปมีข้อ จำกัด ในการได้รับโซลูชันการวิเคราะห์สำหรับหุ่นยนต์ 6 แกนจะใช้ข้อมือทรงกลม (แกนตัดทั้งหมด) โซลูชันการวิเคราะห์สำหรับหุ่นยนต์หลายประเภทได้รับการคำนวณมานานหลายทศวรรษและคุณอาจพบกระดาษที่ให้คำตอบสำหรับหุ่นยนต์ของคุณ
- วิธีแก้ปัญหาตัวเลขดังที่อธิบายไว้ในคำตอบอื่น ๆ ใช้วิธีการปรับให้เหมาะสมเพื่อปรับค่าพิกัดร่วมจนกระทั่งจลศาสตร์การเคลื่อนที่ไปข้างหน้าให้ทางออกที่ถูกต้อง มีวรรณกรรมมากมายเกี่ยวกับเรื่องนี้และซอฟต์แวร์จำนวนมาก
ใช้ Robotics Toolbox ของฉันสำหรับ MATLAB ฉันสร้างแบบจำลองของหุ่นยนต์ 6 แกนที่รู้จักกันดีโดยใช้พารามิเตอร์ Denavit-Hartenberg
>> 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|
+---+-----------+-----------+-----------+-----------+-----------+
จากนั้นเลือกการประสานงานการสุ่มร่วมกัน
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
จากนั้นคำนวณจลศาสตร์การเคลื่อนที่ไปข้างหน้า
>> 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
ตอนนี้เราสามารถคำนวณจลศาสตร์ผกผันโดยใช้โซลูชันวิเคราะห์ที่เผยแพร่สำหรับหุ่นยนต์ที่มีข้อต่อ 6 ข้อและข้อมือทรงกลม
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
และ voila เรามีพิกัดร่วมดั้งเดิม
วิธีแก้ปัญหาเชิงตัวเลข
>> 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 =
[]
ล้มเหลวและนี่เป็นปัญหาที่พบบ่อยเนื่องจากโดยทั่วไปแล้วพวกเขาต้องการวิธีแก้ปัญหาเบื้องต้นที่ดี มาลองกัน
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
ซึ่งตอนนี้ให้คำตอบ แต่มันแตกต่างจากโซลูชันการวิเคราะห์ ไม่เป็นไรเพราะมีหลายวิธีในการแก้ไขปัญหา IK เราสามารถตรวจสอบได้ว่าโซลูชันของเรานั้นถูกต้องโดยการคำนวณจลศาสตร์การเคลื่อนที่ไปข้างหน้า
>> 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
และตรวจสอบว่ามันเหมือนกับการแปลงที่เราเริ่มต้นด้วย (ซึ่งก็คือ)
แหล่งข้อมูลอื่น ๆ :