Kinematics
แขนกลที่ใช้สำหรับคลาสโปรเจคนี้คือ โมเดลสำเร็จรูปของ Arctos robotics เนื่องจากมีการส่งกำลังหลายรูปแบบจึงเหมาะสมแก่การป็นสื่อการเรียนรู้ ขนาดของระยะแต่ละข้อต่ออ้างอิงจาก Datasheet และ URDF file ของหุ่นยนต์ arctos

ตัวหุ่นจะสามารถเคลื่อนที่ได้ทั้งแบบ joint space และ task space สามารถกำหนดจุดให้เคลื่อนที่ไปตามจุดๆนั้นและการกำหนดให้เคลื่อนที่ในแกนใดแกนหนึ่ง(jog) และการกำหนดจุดในการเคลื่อนที่แบบ task space เมื่อมีการตรวจพบว่าเส้นทางตัดกับพื้นที่ของฐานจะมีการสร้างทางอ้อมดังรูป
Joint space move

Task space move
เป็นการเคลื่อนที่โดยอิงจากตำแหน่งมุมของข้อต่อหรือมอเตอร์เป็นหลัก เช่นข้อต่อที่1 เคลื่อนจาก0ไปที่100 องศา ทำให้เราสามารถสั่งมอเตอร์และใช้ PD controlจะกว่าจะถึงตำแหน่งมุมหรือมอเตอร์ที่ต้องการได้เลย โดยที่ Kpจะขึ้นอยู่กับ %ความเร็วที่ส่งมาจาก web ui


เป็นการเคลื่อนที่โดยอิงจากตำแหน่งของปลายแขนหรือส่วนใดส่วนหนึ่งให้เคลื่อนที่ไปตามแนวแกนxyz และมี orientation roll pitch yawเป็นหลัก เช่นปลายแขน เคลื่อนจากx=0ไปที่x=0.3m โดยที่มี roll pitch yaw = [0 ,90, 0] องศา ทำให้การทำงานของมุมข้อต่อและมุมมอเตอร์แต่ละส่วนมีความซับซ้อนขึ้นอย่างมาก เพื่อความต่อเนื่องในการทำงานจึงเลือกใช้วิธี inverse jacobianแทน

Development/ Progression
Version1 อัพโหลดURDF จากนั้นทดลองทำ forwardและInverse kinematicเบื้องต้นซึ่งยังไม่ตรงกับแกนเนื่องจากยังมีการตั้งแกนไม่ตรงกับ DH table


Version2 มีการปรับให้แขนค่อยๆเคลื่อนไปยังตำแหน่งเป้าหมายแทนการเคลื่อนไปอยู่ตำแหน่งนั้นๆทันที ยังไม่มีการปรับแก้แกนหมุนให้ตรงกับ DH table

Version3 เพิ่มPD control ให้กับแกนหมุนทุกแกน เพื่อให้มีการค่อยๆเร่งความเร็วตอนเริ่มต้นและค่อยๆลดความเร็วตอนที่ใกล้ถึงจุดหมาย

Version4 เพิ่มระบบให้รองรับการบันทึกตำแหน่ง และเคลื่อนที่ไปตามsequenceของตำแหน่งเป้าหมายด้วย json format และมีการเพิ่มรางสไลด์เข้ามาในกรณีที่มีการใช้รางสไลด์ร่วมด้วย
ทดสอบการบันทึกตำแหน่ง

ทดสอบการเพิ่มรางสไลด์เข้ามาในการบันทึกตำแหน่ง

Version5 แก้ไขแกนข้อต่อของหุ่นยนต์ให้ตรงกันกับ DH table โดยให้แกน Z เป็นแกนหมุนจากที่เดิมเป็นแกนx และเพิ่มหน้า UIชั่วคราวเพื่อใช้ในการทดสอบการเคลื่อนที่

Version6 ทดลองการ Jogผ่านการกดปุ่มค้างแทนการหมุนและบันทึกมุมล่าสุดเอาไว้ในไฟล์สำหรับจดจำตำแหน่งล่าสุดก่อนที่จะปิดโปรแกรม


ทดลองการทำงานร่วมกับ task sequence บน Web ui


ทดลองการ move jog ผ่านweb ui ทั่งแบบ joint space และ task space พบว่าเกิดปัญหาแกนเกิดอาการกระตุกเมื่อสั่งเคลื่อนที่ด้วย task space และตอนที่เกิดการเปลี่ยนแกนฉับพลันตอนที่เข้าใกล้ฐานมากเกินไป

แก้ปัญหาด้วยการสร้าง Psuedo-inverse jacobian ผ่านการทำ damped least squares เพื่อให้เกิดการหน่วงความเร็วเมื่อเกิด singularity

Version7 สำหรับปัญหาการชนฐาน แก้ด้วยการตรวจสอบว่าตำแหน่งเป้าหมายอยู่ในรัศมีของฐานหรือไม่ ถ้าอยู่ให้ขึ้นเตือนและยกเลิกคำสั่งทันทำ แต่ถ้าไม่ให้ตรวจสอบว่าเส้นทางผ่านพื้นที่ฐานไหม ถ้าผ่านให้สร้างเส้นทางสำหรับการอ้อมรอบฐาน สำหรับการmove jog จะไม่สามารถผ่านพื้นที่ฐานได้เลย

Result
ทดลองสั่งเคลื่อนไปที่ตำแหน่ง x=0.5 y=0 z=0.5 roll =0 pitch=0 yaw =0 ด้วยการเคลื่อนที่แบบ joint space ผลลัพธ์ที่ได้คือคือ แกนx=0.487 y=0 เนื่องจากไม่มีการขยับของแกน 1 z=0.51

ผลลัพท์ที่ได้จากการแสดงตำแหน่งใน rviz มีความคลาดเคลื่อนจากความจริงเฉลี่ย7.7 mm.

ทดลองสั่งเคลื่อนไปที่ตำแหน่ง x=0.5 y=0 z=0.5 roll =0 pitch=0 yaw =0 ด้วยการเคลื่อนที่แบบ task space ผลลัพท์ที่ได้เมื่อเทียบกับใน rviz พบว่าไม่สามารถเคลื่อนที่ให้ตรงตาม ที่คำนวณไว้ได้เนื่องจากความเร็วของ task spaceจาก jacobian และความเร็วมอเตอร์ในส่วนของ motion control ไม่สัมพันธ์กัน อีกทั้งด้วยข้อจำกัดด้านเวลาจึงไม่สามารถแก้ไขได้อย่างทันเวลา

Task Planning
Task planning ที่ใช้ในหุ่นยนต์จะเป็นรูปแบบของ Strip โดยใช้เป็นตัวอย่างการให้หุ่นยนต์เข้าไปหยิบจับแก้วโดยการใช้ state ละ operationดังนี้


ซึ่งจะเริ่มทำงานเมื่อมีการกำหนด Initial state และ Goal state จากนั้นจะมีการใช้ BFS(Breadth first search)ในการค้นหาเส้นทางที่สั้นที่สุดและ list operation ที่ต้องใช้เพื่อให้ไปถึง goal state และตัวหุ่นจะต้องทำการส่งcurrent stateของตัวเองให้กลับระบบกล้อง เพื่อให้ครบเงื่อนไขในการไป operation ต่อไป โดยที่กล้องจะส่ง Action การทำงานมา นอกจากนี้ยังมีเงื่อนไข safety state ที่ส่งมาจากกล้องและ machine stateที่คอยบอกว่าหุ่นกำลังทำงานอยู่หรือไม่เป็นเงื่อนไขในการทำงานอื่นๆอีกด้วย

สรุปและข้อเสนอแนะในการพัฒนาต่อในอนาคต
ผลการทดสอบการทำงานด้านระบบควบคุมและกลไก (Kinematics & Control)สรุปได้ดังนี้
- การวางแผนเส้นทาง: Task Planning สามารถค้นหาเส้นทางที่สั้นที่สุดได้รวดเร็วถึง 0.1 ms
- ปัญหาที่พบ: ชิ้นส่วนเกียร์ (Herringbone planetary gear) มีความคลาดเคลื่อนจากการพิมพ์ 3D ทำให้เฟืองขัดข้อง นอกจากนี้ความเร็วในการสั่งงานแบบ Task Space ยังไม่สัมพันธ์กับความเร็วจริงของมอเตอร์ ส่งผลให้การเคลื่อนที่ไม่เป็นไปตามทฤษฎีทั้งหมด
ข้อเสนอแนะในการพัฒนาต่อในอนาคต
- ปรับปรุงความแม่นยำชิ้นส่วน: ควรใช้วัสดุหรือกระบวนการผลิตที่มีความแม่นยำสูงขึ้นสำหรับชิ้นส่วนส่งกำลัง เพื่อแก้ปัญหาเฟืองขัดข้อง
- อัปเกรดบอร์ดประมวลผล (Edge Device): เนื่องจาก Jetson Nano ที่ใช้งานอยู่เป็นรุ่นเก่าและมีข้อจำกัดด้านการประมวลผล ทำให้ต้องลดเฟรมเรทลงแม้สเปคกล้องจะรองรับก็ตาม
- ใช้งาน Closed-Loop Control: นำค่าที่อ่านได้จากเซนเซอร์แม่เหล็ก (AS5600) มาเป็น Feedback ตรวจสอบความเร็วจริงของมอเตอร์
สิ่งที่ได้เรียนรู้
ด้านกลไกและการประกอบฮาร์ดแวร์ (Mechanics & Hardware)
- ความสำคัญของความแม่นยำ (Tolerance): การใช้เครื่องพิมพ์ 3D ทำชิ้นส่วนขับเคลื่อนอย่างเกียร์ Herringbone ทำให้เห็นว่า ถ้าค่าออฟเซต (Offset) เคลื่อนไปแค่มิลลิเมตรเดียว ก็ทำให้ฟันเฟืองขัดกัน (Jam) จนมอเตอร์หมุนไม่ไปเลย การประกอบฮาร์ดแวร์จึงต้องอาศัยความละเอียดและเผื่อระยะ (Tolerance) ให้ดี
- การเลือกเกียร์มาใช้งาน โดยเกียร์ที่ใช้ในหุ่นของเราจะมีอยู่ 4 ชนิด คือ 1.Planetary Gear 2.Cycloidal Gear 3.Belt reduction 4.Differential Gear โดยแต่ละชนิดก็จะมีคุณสมบัติที่ต่างกัน เช่น planetary gear เหมาะกับการทดรอบสูงในพื้นที่จำกัด ,Cycloidal gear เหมาะกับงานหมุนที่รับแรงกระแทกหนักแต่ยังคงความราบรื่นและเสถียร, Belt reduction เหมาะแก่การส่งกำลังและทดรอบระยะไกล และ Differential gear โดยทั่วไปใช้ในการแบ่งกำลังในกรณีที่การหมุน2ฝั่งไม่เท่ากัน แต่สำหรับงานนี้ใช้สำหรับควบคุม2แกนโดยที่มอเตอร์ไม่ต้องไปอยู่ที่ปลายแขนและไม่ต้องมีกลไกลที่ซับซ้อน
ด้านระบบควบคุมและจลนศาสตร์ (Control & Kinematics)
- ได้มีการใช้ทฤษฏี Forward kinematic,Inverse kinematic และ Jacobian ร่วมกันในการใช้งานจริงเป็นครั้งแรก ทำให้ทราบว่า ทฤษฎีกับการทำงานจริงไม่เหมือนกันเสมอไป: การควบคุมหุ่นยนต์แบบ Task Space ตอนคำนวณสมการ Jacobian ในคอมพิวเตอร์ทุกอย่างดูถูกต้อง แต่พอสั่งงานฮาร์ดแวร์จริง ความเร็วที่คำนวณได้กลับไม่สัมพันธ์กับความเร็วมอเตอร์ ทำให้รู้ว่าแค่ระบบ Open-loop ยังไม่พอสำหรับการใช้งานจริง และควรต้องมี Feedback จากเซนเซอร์วัดมุม (เช่น AS5600 Magnetic Encoder) มาช่วยทำ Closed-loop control เพื่อให้การเคลื่อนที่แม่นยำขึ้น แม้ว่าจะมีพื้นฐานในด้าน Forward Kinematic และ inverse kinematic แต่การทำงานจริงมีสิ่งที่ซับซ้อนกว่านั้นเช่นความคลาดเคลื่อน เป็นต้น ทำให้จำเป็นจะต้องมีเซนเซอร์มาช่วยยืนยันความถูกต้อง และควรใช้อ้างอิงและนำมาทดสอบกับ simulation ด้วย
- การอ่านค่าจาก sensor โดยตรงโดยไม่ผ่าน filter ส่งผลให้ค่าที่ได้ออกมามีสัญญาณรบกวน ซึ่งทำให้ระบบควบคุมเกิดอาการสั่นตามมา หลังจากประยุกตร์ใช้ low pass filter อาการสั่นที่เกิดขึ้นลดลงอย่างมีนัยยะสำคัญ
ด้านการทำ Task Planning
- ได้รู้จักการใช้เงื่อนไขการทำงาน อย่างเช่น State, safety state และ machine state เพื่อเป็น initial state สำหรับการรับการทำงานต่างๆ เพื่อป้องการไม่ให้เกิดการทำงานที่เราไม่ต้องการ หรือเกิดอุบัติเหตุ
- ได้ทดลองการทำ BFS หรือ Action planning เพื่อให้ระบบสามารถค้นหาaction ที่ไปให้ถึงสถานะเป้าหมายได้เร็วที่สุด
