โมดูล 1/5 · สัปดาห์ 1–3 · 27 ชม.

หุ่นยนต์และระบบอัตโนมัติ

UAT 308 ระบบอัตโนมัติและหุ่นยนต์

เวลาเรียนประมาณ 90 นาทีร่าง รอตรวจปรับปรุงล่าสุด 28 กันยายน 2569

บทเรียน

เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ

  1. อธิบายองค์ประกอบของหุ่นยนต์เคลื่อนที่ ได้แก่ เซนเซอร์ แอคชูเอเตอร์ ตัวควบคุม และการสื่อสาร
  2. ใช้เมทริกซ์การแปลงแบบเอกพันธ์ต่อกรอบพิกัดของหุ่นยนต์ เซนเซอร์ และแผนที่
  3. คำนวณผลของรัศมีล้อที่คลาดเคลื่อนต่อ odometry ของหุ่นยนต์ขับเคลื่อนสองล้อ
  4. อธิบายกรอบ map, odom และ base_link ตามแนวปฏิบัติของ ROS

ความรู้พื้นฐานที่ควรมี: UAT 314 โมดูล 2 (หุ่นยนต์และจลนศาสตร์) · UAT 202 (ระบบอัตโนมัติเบื้องต้น)

ทำไมต้องรู้

UAT 314 และ UAT 202 วางภาพรวมของระบบอัตโนมัติ PLC แขนกลสองข้อต่อ และหุ่นยนต์สองล้อ วิชานี้เป็นวิชาปฏิบัติที่ลงมือสร้างระบบหุ่นยนต์ให้ทำงานร่วมกับโดรน กรณีที่ใช้ตลอดวิชาคือ โซลาร์ฟาร์ม ที่มีรถหุ่นยนต์ภาคพื้น (UGV) วิ่งตามแถวแผง ใช้กล้องความร้อนหาจุดร้อนบนแผง และพาโดรนไปปล่อยสำรวจมุมสูง หน่วยความรู้เรื่อง Robotics & Autonomous Systems ของคลังความรู้โดรนกล่าวถึงระบบปฏิบัติการหุ่นยนต์และการประสานหลายระบบ ส่วนหน่วยความรู้เรื่องระบบอัตโนมัติอุตสาหกรรมและ PLC อธิบายแอคชูเอเตอร์และลอจิกควบคุม โมดูลแรกเริ่มจากเรื่องที่หุ่นยนต์ทุกตัวต้องทำให้ถูกก่อนเรื่องอื่น คือรู้ว่า อะไรอยู่ที่ไหน ในกรอบพิกัดใด

องค์ประกอบของหุ่นยนต์เคลื่อนที่

ตำราของ Siegwart และคณะแบ่งงานของหุ่นยนต์เคลื่อนที่เป็น การรับรู้ (เซนเซอร์) การระบุตำแหน่ง การวางแผน และการควบคุมการเคลื่อนที่ (แอคชูเอเตอร์) รถ UGV ในโซลาร์ฟาร์มมี encoder ที่ล้อ IMU GNSS กล้องความร้อน และ LiDAR ขับด้วยมอเตอร์ไฟฟ้ากระแสตรงสองตัว ตัวควบคุมคือคอมพิวเตอร์บนรถที่รัน ROS 2 และสื่อสารกับศูนย์ควบคุมผ่านเครือข่ายไร้สาย ข้อมูลจากเซนเซอร์แต่ละตัวอยู่ใน กรอบพิกัดของตัวเอง จึงต้องแปลงให้อยู่ในกรอบเดียวกันก่อนนำมาใช้ร่วมกัน

การแปลงแบบเอกพันธ์และต้นไม้กรอบพิกัด

ตำแหน่งและทิศของกรอบหนึ่งเทียบกับอีกกรอบเขียนเป็นเมทริกซ์ 3×3 ใน 2 มิติ (4×4 ใน 3 มิติ) ที่รวมการหมุนและการเลื่อนไว้ด้วยกัน การต่อกรอบทำได้ด้วยการคูณเมทริกซ์ตามลำดับจากกรอบใหญ่ไปกรอบเล็ก REP 103 กำหนดหน่วย SI และแกนของตัวหุ่นยนต์ให้ x ชี้ไปข้างหน้า y ชี้ไปทางซ้าย z ชี้ขึ้น ไลบรารี tf ของ ROS (Foote, 2013) เก็บความสัมพันธ์ของกรอบเป็นต้นไม้และคำนวณการแปลงให้อัตโนมัติ

ตัวอย่างที่ 1 จุดร้อนบนแผงอยู่ตรงไหนของแผนที่

รถอยู่ที่ (12, 5) m บนแผนที่ หันหัว 30° กล้องความร้อนติดด้านขวาของรถ ห่างจุดกลาง (0.20, −0.25) m หันออกทางขวา (−90°) กล้องเห็นจุดร้อนที่ (4.0, 0.5) m ในกรอบกล้อง (ข้อมูลจำลอง)

import numpy as np

def se2(x, y, deg):
    t = np.radians(deg)
    return np.array([[np.cos(t), -np.sin(t), x],
                     [np.sin(t),  np.cos(t), y],
                     [0, 0, 1]])

T_map_base = se2(12.0, 5.0, 30)       # หุ่นยนต์บนแผนที่ หันหัว 30°
T_base_cam = se2(0.20, -0.25, -90)    # กล้องติดด้านขวา หันออกขวา
p_cam = np.array([4.0, 0.5, 1])       # จุดร้อนบนแผงที่กล้องเห็น

p_map = T_map_base @ T_base_cam @ p_cam
print(f"hotspot on map: ({p_map[0]:.2f}, {p_map[1]:.2f}) m")

wrong = T_base_cam @ T_map_base @ p_cam
print(f"wrong multiplication order: ({wrong[0]:.2f}, {wrong[1]:.2f}) m")

goal = np.linalg.inv(T_map_base) @ np.array([20.0, 9.0, 1])
print(f"goal in robot frame: x = {goal[0]:.2f} m, y = {goal[1]:.2f} m")
hotspot on map: (14.73, 1.67) m
wrong multiplication order: (7.63, -15.46) m
goal in robot frame: x = 8.93 m, y = -0.54 m

ลำดับการคูณต้องไล่จากแผนที่ไปหารถไปหากล้อง ถ้าสลับลำดับ ผลจะผิดไปหลายเมตรจนส่งช่างไปผิดแผง ส่วนการหาเป้าหมายในกรอบรถใช้เมทริกซ์ผกผัน ค่า y ติดลบหมายถึงเป้าหมายอยู่ทางขวาของรถ

มุมมองจากด้านบน รถหุ่นยนต์สี่เหลี่ยมสีฟ้าหันหัวเฉียงขึ้นขวา มีแกน x สีชมพูและแกน y สีเขียวของกรอบ base_link และกรอบกล้องที่ติดด้านขวาหันออกขวา เส้นประจากกล้องลากไปยังวงกลมสีชมพูคือจุดร้อนที่พิกัด 14.73, 1.67 บนแถวแผงโซลาร์ด้านล่าง มุมซ้ายล่างแสดงทิศแกน map
ภาพที่ 1 กรอบพิกัดของหุ่นยนต์ กล้อง และจุดร้อนบนแผนที่

REP 105 กำหนดกรอบหลักของหุ่นยนต์เคลื่อนที่ไว้สามกรอบ base_link ติดกับตัวรถ odom เป็นกรอบที่ตำแหน่งเปลี่ยนต่อเนื่องไม่กระโดด แต่ลอยสะสมตามระยะทาง เหมาะกับการควบคุมระยะสั้น ส่วน map เป็นกรอบที่ตำแหน่งไม่ลอยในระยะยาว แต่อาจกระโดดได้เมื่อระบบระบุตำแหน่งปรับแก้ เช่นเมื่อได้ GNSS หรือจับคู่กับแผนที่ได้ แยกกรอบแบบนี้ทำให้ตัวควบคุมล้อไม่สะดุดเมื่อตำแหน่งบนแผนที่ถูกแก้

odometry และความคลาดเคลื่อนเชิงระบบ

odometry คือการประมาณตำแหน่งจากจำนวนรอบล้อ หุ่นยนต์ขับเคลื่อนสองล้อหันเมื่อสองล้อวิ่งได้ระยะต่างกัน ถ้ารัศมีล้อที่ซอฟต์แวร์ใช้ไม่ตรงกับของจริง ความผิดพลาดจะสะสมไปทางเดียวเสมอ Borenstein และ Feng (1996) ระบุสาเหตุหลักสองอย่างคือ เส้นผ่านศูนย์กลางล้อไม่เท่ากัน และระยะห่างล้อที่ไม่แน่นอน และเสนอวิธีทดสอบ UMBmark ที่ให้หุ่นยนต์เดินเส้นทางสี่เหลี่ยมจัตุรัสทั้งตามและทวนเข็มนาฬิกาเพื่อแยกสองสาเหตุนี้ออกจากกัน

ตัวอย่างที่ 2 ล้อขวาใหญ่กว่าเพียง 0.1%

ระยะห่างล้อ 0.50 m ซอฟต์แวร์ใช้รัศมี 0.100 m แต่ล้อขวาจริงสึกไม่เท่ากันจนรัศมี 0.1001 m รถสั่งให้วิ่งตรงตามแถวแผง 50 m (ข้อมูลจำลอง)

import numpy as np

b = 0.50            # ระยะห่างล้อ m
r_nom = 0.100       # รัศมีล้อที่ซอฟต์แวร์ใช้ m
r_right = 0.1001    # ล้อขวาจริงใหญ่กว่า 0.1%
dist = 50.0         # ระยะที่ซอฟต์แวร์คิดว่าวิ่งตรง m

rev = dist / (2 * np.pi * r_nom)          # จำนวนรอบเท่ากันทั้งสองล้อ
d_left = rev * 2 * np.pi * r_nom
d_right = rev * 2 * np.pi * r_right
dtheta = (d_right - d_left) / b
R = b * (d_right + d_left) / (2 * (d_right - d_left))
lateral = R * (1 - np.cos(dtheta))
print(f"actual heading change {np.degrees(dtheta):.2f} deg")
print(f"actual turn radius {R:.0f} m")
print(f"sideways offset at the end {lateral:.2f} m")
actual heading change 5.73 deg
actual turn radius 500 m
sideways offset at the end 2.50 m

ความต่างเพียง 0.1 มิลลิเมตรทำให้รถเบนออกจากแนวแผงราว 2.5 m ภายในหนึ่งแถว ซึ่งมากพอจะชนแผงข้างเคียง odometry จึงใช้ได้เฉพาะระยะสั้น และต้องสอบเทียบรัศมีล้อกับระยะห่างล้อเป็นระยะ พร้อมใช้ GNSS หรือการจับคู่กับแผนที่ช่วยแก้

กราฟระยะข้างเทียบกับระยะไปข้างหน้า 0 ถึง 50 เมตร เส้นประสีฟ้าตรงที่ศูนย์คือทางที่ซอฟต์แวร์คิด เส้นสีชมพูโค้งขึ้นจนห่าง 2.50 เมตรที่ปลายทางคือทางจริงเมื่อล้อขวาใหญ่กว่า 0.1 เปอร์เซ็นต์
ภาพที่ 2 odometry เบี่ยงจากรัศมีล้อต่างกัน 0.1%

ปฏิบัติการประจำโมดูล

ปฏิบัติการ: กรอบพิกัดและการสอบเทียบ odometry

  1. วัดตำแหน่งติดตั้งของ LiDAR และกล้องบนรถหุ่นยนต์ฝึก เขียนเป็นเมทริกซ์การแปลงเทียบกับ base_link
  2. วางกรวยที่ตำแหน่งรู้ค่า ให้ LiDAR วัด แล้วใช้ตัวอย่างที่ 1 แปลงเป็นพิกัดบนแผนที่ เทียบกับตลับเมตร
  3. สั่งรถวิ่งตรง 10 m ห้าเที่ยว วัดระยะเบนด้านข้างจริง แล้วประมาณความต่างของรัศมีล้อย้อนกลับด้วยตัวอย่างที่ 2
  4. ทำการทดสอบเส้นทางสี่เหลี่ยมตามและทวนเข็มนาฬิกา บันทึกตำแหน่งปลายทางเทียบจุดเริ่ม
  5. สรุปค่ารัศมีล้อและระยะห่างล้อที่ปรับแล้ว และผลก่อนหลังปรับ

ข้อผิดพลาดที่พบบ่อย

ระวัง

  • คูณเมทริกซ์ผิดลำดับ หรือใช้เมทริกซ์ผกผันผิดทิศ
  • ปนหน่วยองศากับเรเดียน ในการคำนวณการหมุน
  • วัดตำแหน่งติดตั้งเซนเซอร์คร่าว ๆ แล้วคิดว่าไม่สำคัญ
  • เชื่อ odometry ในระยะไกล โดยไม่มีแหล่งแก้ตำแหน่ง
  • ใช้กรอบ map ป้อนตัวควบคุมล้อโดยตรง จนรถกระตุกเมื่อตำแหน่งถูกแก้

สรุป

  • หุ่นยนต์เคลื่อนที่ประกอบด้วยการรับรู้ การระบุตำแหน่ง การวางแผน และการควบคุม
  • การแปลงแบบเอกพันธ์รวมการหมุนกับการเลื่อน และต่อกรอบได้ด้วยการคูณตามลำดับ
  • REP 105 แยก map, odom และ base_link ตามคุณสมบัติความต่อเนื่องและการลอย
  • odometry สะสมความคลาดเคลื่อนเชิงระบบ ต้องสอบเทียบและใช้แหล่งอื่นช่วยแก้

แบบฝึกตรวจความเข้าใจ

  1. ตามแนวปฏิบัติ REP 103 แกน y ของตัวหุ่นยนต์ชี้ไปทางใด
  2. กรอบใดตำแหน่งต่อเนื่องแต่ลอยสะสม และกรอบใดไม่ลอยแต่อาจกระโดด
  3. ล้อขวาวิ่งได้ 10.02 m ล้อซ้าย 10.00 m ระยะห่างล้อ 0.5 m หุ่นยนต์หันไปกี่เรเดียน
  4. ถ้าเป้าหมายในกรอบรถมีค่า y เป็นลบ เป้าหมายอยู่ทางใดของรถ
  5. การทดสอบ UMBmark ให้หุ่นยนต์เดินทั้งตามและทวนเข็มนาฬิกาเพื่ออะไร
เฉลย
  1. ชี้ไปทางซ้าย
  2. odom ต่อเนื่องแต่ลอย ส่วน map ไม่ลอยแต่อาจกระโดด
  3. rad
  4. ทางขวา
  5. เพื่อแยกผลของล้อที่ไม่เท่ากันออกจากผลของระยะห่างล้อที่ไม่แน่นอน

สรุปสูตรสำคัญ

การแปลงแบบเอกพันธ์ใน 2 มิติ
ต่อกรอบพิกัด
มุมหันจากระยะล้อ

แหล่งอ้างอิงหลัก

  1. Siegwart, R., Nourbakhsh, I. R., & Scaramuzza, D. (2011). Introduction to autonomous mobile robots (2nd ed.). MIT Press. link
  2. ROS Enhancement Proposals. REP 105: Coordinate frames for mobile platforms. link
  3. Foote, T., & Purvis, M. (2010). REP 103: Standard units of measure and coordinate conventions. ROS Enhancement Proposals. link
  4. Foote, T. (2013). tf: The transform library. In 2013 IEEE Conference on Technologies for Practical Robot Applications (TePRA) (pp. 1–6). IEEE. link
  5. Borenstein, J., & Feng, L. (1996). Measurement and correction of systematic odometry errors in mobile robots. IEEE Transactions on Robotics and Automation, 12(6), 869–880. link

อ่านเพิ่มเติม

ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล

ในชั้นเรียน / ภาคสนาม

ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย

หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz

แบบทดสอบประจำโมดูล

แบบทดสอบนี้ใช้ตรวจความเข้าใจ (formative) ไม่ใช่การสอบเก็บคะแนน

โดเมนความรู้: ระบบอัตโนมัติ หุ่นยนต์ และฝูงโดรน · การสื่อสาร เครือข่าย และ IoT