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

ระบบหุ่นยนต์หลายตัว

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

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

บทเรียน

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

  1. จำแนกปัญหาการจัดสรรงานหุ่นยนต์หลายตัวตามอนุกรมวิธานของ Gerkey และ Matarić
  2. จัดสรรงานด้วยการประมูลทีละงานและเทียบกับคำตอบดีที่สุด
  3. คำนวณจุดและเวลานัดพบระหว่างโดรนกับรถ UGV ที่กำลังวิ่ง
  4. ออกแบบการบูรณาการ UGV กับโดรนให้ทนต่อการสื่อสารขาดหาย

ความรู้พื้นฐานที่ควรมี: UAT 308 โมดูล 1–4 · UAT 366 โมดูล 4 (โดรนหลายลำ)

ทำไมต้องรู้

โซลาร์ฟาร์มขนาดใหญ่ใช้รถ UGV หลายคันและโดรนหลายลำทำงานพร้อมกัน UAT 366 จัดสรรงานให้โดรนในคลังสินค้าและตรวจระยะใกล้สุดระหว่างลำ หน่วยความรู้เรื่องการประสานโดรนหลายลำของคลังความรู้โดรนกล่าวถึง task allocation, formation control และการหลีกเลี่ยงการชน ส่วนหน่วยความรู้เชิงลึกเรื่องการประสานฝูงโดรนผ่าน LoRa Mesh อธิบายข้อจำกัดของเครือข่ายในพื้นที่ไร้สัญญาณ บทความทบทวนของ Chung และคณะ (2018) สรุปงานวิจัยฝูงหุ่นยนต์อากาศ โมดูลนี้ปิดวิชาด้วยสองคำถาม คือ ใครทำงานไหน และ โดรนกลับมาพบรถที่ไหน

อนุกรมวิธานของการจัดสรรงาน

Gerkey และ Matarić (2004) จำแนกปัญหาด้วยสามแกน หุ่นยนต์ทำได้ทีละงานหรือหลายงานพร้อมกัน (ST/MT) งานต้องใช้หุ่นยนต์ตัวเดียวหรือหลายตัว (SR/MR) และจัดสรรครั้งเดียวทันทีหรือวางแผนต่อเนื่องตามเวลา (IA/TA) งานจับคู่หุ่นยนต์หนึ่งตัวกับงานหนึ่งงาน (ST-SR-IA) แก้ได้คำตอบดีที่สุดด้วยวิธีฮังกาเรียน (Kuhn, 1955) แต่งานตรวจแผงที่รถแต่ละคันต้องไล่ทำหลายจุดเป็นลำดับเป็นแบบ ST-SR-TA ซึ่งยากกว่ามาก จึงนิยมวิธีประมูล

ประมูลทีละงาน

Koenig และคณะ (2006) ศึกษา การประมูลทีละงาน (sequential single-item auction) ทุกรอบหุ่นยนต์ทุกตัวเสนอราคาสำหรับงานที่ยังว่าง ราคาคือระยะทางที่เพิ่มขึ้นถ้าแทรกงานนั้นเข้าเส้นทางของตัวเองในตำแหน่งที่ดีที่สุด ผู้เสนอต่ำสุดได้งานไป แล้วเริ่มรอบใหม่ วิธีนี้กระจายการคำนวณได้ ใช้การสื่อสารน้อย และรับงานใหม่ระหว่างทำงานได้ แต่ไม่รับประกันคำตอบดีที่สุด

ตัวอย่างที่ 1 รถสองคัน จุดตรวจห้าจุด

รถ UGV-1 อยู่ที่ (0, 0) m รถ UGV-2 อยู่ที่ (100, 0) m มีจุดตรวจแผง A ถึง E ต้องการให้ระยะทางรวมของทั้งสองคันน้อยที่สุด (ไม่ต้องกลับจุดเริ่ม) (ข้อมูลจำลอง)

import itertools
import numpy as np

robots = {"UGV-1": np.array([0.0, 0.0]), "UGV-2": np.array([100.0, 0.0])}
tasks = {"A": (10, 40), "B": (30, 80), "C": (60, 20), "D": (90, 70), "E": (50, 60)}
tasks = {k: np.array(v, float) for k, v in tasks.items()}

def route_cost(start, order):
    pts = [start] + [tasks[t] for t in order]
    return sum(np.linalg.norm(pts[i+1] - pts[i]) for i in range(len(pts) - 1))

def best_insert(start, order, t):
    best = None
    for k in range(len(order) + 1):
        new = order[:k] + [t] + order[k:]
        c = route_cost(start, new)
        if best is None or c < best[0]:
            best = (c, new)
    return best

routes = {r: [] for r in robots}
left = list(tasks)
while left:                       # ประมูลทีละงาน: ผู้เสนอต้นทุนเพิ่มต่ำสุดชนะ
    bids = []
    for r in robots:
        base = route_cost(robots[r], routes[r])
        for t in left:
            c, new = best_insert(robots[r], routes[r], t)
            bids.append((c - base, r, t, new))
    bid, r, t, new = min(bids)
    routes[r] = new
    left.remove(t)
auction = sum(route_cost(robots[r], routes[r]) for r in robots)
print("auction:", {r: "".join(o) for r, o in routes.items()}, f"total {auction:.1f} m")

best = None                        # ค้นทุกทางเพื่อหาคำตอบดีที่สุด
for mask in itertools.product([0, 1], repeat=len(tasks)):
    groups = [[t for t, m in zip(tasks, mask) if m == g] for g in (0, 1)]
    total = 0
    for r, g in zip(robots, groups):
        total += min(route_cost(robots[r], list(p)) for p in itertools.permutations(g))
    if best is None or total < best:
        best = total
print(f"optimal total {best:.1f} m  auction is {100*(auction/best - 1):.1f}% worse")
auction: {'UGV-1': 'A', 'UGV-2': 'CDEB'} total 213.8 m
optimal total 200.2 m  auction is 6.8% worse

การประมูลให้ UGV-1 ทำเพียงจุด A ส่วน UGV-2 วิ่งอ้อมทำสี่จุด รวม 213.8 m คำตอบดีที่สุดจากการค้นทุกทางคือ UGV-1 ทำ A, B, E, D และ UGV-2 ทำเพียง C รวม 200.2 m การประมูลแย่กว่าราว 7% เพราะแต่ละรอบเลือกงานที่ถูกที่สุดตอนนั้นโดยไม่มองงานที่เหลือ ในงานจริงที่มีจุดตรวจหลายร้อยจุด การค้นทุกทางเป็นไปไม่ได้ ความต่างระดับนี้มักยอมรับได้แลกกับความเร็วและความยืดหยุ่น

สองแผนภาพเทียบกัน ซ้ายคือผลประมูลรวม 213.8 เมตร รถ UGV-1 สีฟ้าวิ่งไปจุด A จุดเดียว รถ UGV-2 สีส้มวิ่งไป C, D, E, B ขวาคือคำตอบดีที่สุด 200.2 เมตร UGV-1 วิ่งไป A, B, E, D และ UGV-2 วิ่งไป C จุดเดียว
ภาพที่ 1 เส้นทางจากการประมูลเทียบกับคำตอบดีที่สุด

นัดพบโดรนกับรถที่กำลังวิ่ง

รถ UGV ที่พาโดรนไปปล่อยไม่จำเป็นต้องจอดรอ โดรนควรบินไปยังจุดที่รถจะอยู่ในอนาคต ถ้ารถวิ่งตรงตามแนว x ด้วยความเร็ว และโดรนเริ่มที่ บินด้วย จุดนัดพบเร็วที่สุดหาได้จากการที่ระยะบินเท่ากับ พอดี ซึ่งเป็นสมการกำลังสองของ ถ้าโดรนบินไล่ตามตำแหน่งปัจจุบันของรถไปเรื่อย ๆ จะเสียเวลามากกว่า

ตัวอย่างที่ 2 โดรนกลับมาลงบนรถที่วิ่งตามถนนในฟาร์ม

รถวิ่ง 5 m/s ตามถนนแนว x เริ่มจาก x = 0 โดรนอยู่ที่ (300, 400) m บิน 10 m/s เหลือเวลาบิน 120 s (ข้อมูลจำลอง)

import numpy as np

vg, va = 5.0, 10.0                 # ความเร็วรถ UGV และโดรน m/s
drone = np.array([300.0, 400.0])   # ตำแหน่งโดรนเมื่อเริ่มกลับ m
battery_s = 120.0                  # เวลาบินที่เหลือ s

# รถวิ่งตามแนว x จาก 0: หาเวลา t ที่ |(vg t, 0) - drone| = va t
a = va**2 - vg**2
b = 2 * vg * drone[0]
c = -(drone @ drone)
t_meet = (-b + np.sqrt(b**2 - 4*a*c)) / (2*a)
print(f"earliest meeting t = {t_meet:.1f} s at x = {vg*t_meet:.1f} m")

p, t = drone.copy(), 0.0           # เทียบ: โดรนบินไล่ตำแหน่งปัจจุบันของรถ
while True:
    car = np.array([vg * t, 0.0])
    d = car - p
    if np.linalg.norm(d) < va * 0.1:
        break
    p += d / np.linalg.norm(d) * va * 0.1
    t += 0.1
print(f"pursuit t = {t:.1f} s")
print(f"battery left at meeting {battery_s - t_meet:.0f} s")
earliest meeting t = 41.1 s at x = 205.5 m
pursuit t = 46.6 s
battery left at meeting 79 s

การบินตัดหน้าไปยังจุดนัดพบใช้เวลา 41.1 s เร็วกว่าการไล่ตาม 5.5 s และเหลือแบตเตอรี่ 79 s เป็นส่วนเผื่อ ระบบจริงต้องส่งแผนความเร็วของรถให้โดรนอย่างต่อเนื่อง และถ้ารถเปลี่ยนความเร็วหรือการสื่อสารขาด ต้องมีจุดนัดพบสำรองที่รถจอดรอ

แผนภาพมาตราส่วนเท่ากันสองแกน ถนนแนวนอนสีเทาด้านล่าง รถ UGV เริ่มที่ปลายซ้าย โดรนสีฟ้าอยู่ด้านบนที่ 300, 400 เมตร เส้นตรงสีเขียวลงสู่จุดนัดพบที่ x เท่ากับ 205.5 เมตรใช้ 41.1 วินาที เส้นประสีชมพูโค้งไล่ตามรถถึงจุดที่ไกลกว่าเล็กน้อยใช้ 46.6 วินาที
ภาพที่ 2 นัดพบโดรนกับรถ UGV ที่กำลังวิ่ง

บูรณาการให้ทนต่อการสื่อสารขาด

ระบบหลายหุ่นยนต์ในพื้นที่กว้างมักเจอการสื่อสารขาดช่วง การออกแบบที่ดีให้หุ่นยนต์แต่ละตัวมีงานที่ทำต่อได้เองเมื่อขาดการติดต่อ กำหนดจุดรวมพลและเวลาที่ต้องกลับ ใช้เครือข่ายสองระดับ เช่น Wi-Fi สำหรับข้อมูลใหญ่และ LoRa สำหรับตำแหน่งและสถานะ และให้ศูนย์ควบคุมเห็นสถานะล่าสุดพร้อมอายุของข้อมูลเสมอ

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

ปฏิบัติการ: ภารกิจร่วม UGV และโดรน

  1. กำหนดจุดตรวจ 8 จุดในสนาม ให้รถสองคันประมูลงานตามตัวอย่างที่ 1 เทียบระยะรวมกับการแบ่งด้วยมือ
  2. เพิ่มงานใหม่กลางภารกิจ ให้ประมูลเฉพาะงานนั้น แล้วบันทึกการเปลี่ยนเส้นทาง
  3. จำลองโดรนใน SITL กลับมาลงบนเป้าบนรถที่วิ่งช้า ๆ ใช้ตัวอย่างที่ 2 คำนวณจุดนัดพบ
  4. ตัดการสื่อสารของรถหนึ่งคันกลางภารกิจ ตรวจว่ารถทำงานต่อหรือกลับจุดรวมพลตามที่ออกแบบ
  5. เขียนรายงานสรุปสถาปัตยกรรมระบบ ปัญหาที่พบ และข้อเสนอปรับปรุง

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

ระวัง

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

สรุป

  • อนุกรมวิธาน ST/MT, SR/MR และ IA/TA ช่วยเลือกวิธีจัดสรรงาน
  • การประมูลทีละงานใช้ต้นทุนเพิ่มเป็นราคา กระจายการคำนวณได้ แต่ไม่รับประกันคำตอบดีที่สุด
  • จุดนัดพบกับรถที่วิ่งหาได้จากสมการกำลังสอง และเร็วกว่าการบินไล่ตาม
  • ระบบหลายหุ่นยนต์ต้องทำงานต่อได้อย่างปลอดภัยเมื่อสื่อสารขาด

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

  1. งานที่รถแต่ละคันต้องไล่ตรวจหลายจุดเป็นลำดับจัดอยู่ในกลุ่มใดตามอนุกรมวิธาน
  2. วิธีใดให้คำตอบดีที่สุดของการจับคู่หุ่นยนต์หนึ่งตัวต่องานหนึ่งงาน
  3. เส้นทางเดิมยาว 120 m ถ้าแทรกงานใหม่แล้วยาว 150 m ราคาประมูลเท่าใด
  4. รถวิ่ง 5 m/s โดรนบิน 10 m/s ทำไมโดรนควรบินไปจุดนัดพบแทนการไล่ตาม
  5. การประมูลได้ 213.8 m ส่วนคำตอบดีที่สุด 200.2 m การประมูลแย่กว่ากี่เปอร์เซ็นต์
เฉลย
  1. ST-SR-TA
  2. วิธีฮังกาเรียน (Kuhn, 1955)
  3. m
  4. การไล่ตามเล็งตำแหน่งที่รถกำลังจะพ้นไป ทำให้เส้นทางโค้งและยาวกว่า

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

ราคาประมูล (ต้นทุนเพิ่ม)
สมการนัดพบ

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

  1. Gerkey, B. P., & Matarić, M. J. (2004). A formal analysis and taxonomy of task allocation in multi-robot systems. The International Journal of Robotics Research, 23(9), 939–954. link
  2. Koenig, S., Tovey, C., Lagoudakis, M., Markakis, V., Kempe, D., Keskinocak, P., Kleywegt, A., Meyerson, A., & Jain, S. (2006). The power of sequential single-item auctions for agent coordination. In Proceedings of AAAI-06 (pp. 1625–1629). AAAI Press. link
  3. Kuhn, H. W. (1955). The Hungarian method for the assignment problem. Naval Research Logistics Quarterly, 2(1–2), 83–97. link
  4. Chung, S.-J., Paranjape, A. A., Dames, P., Shen, S., & Kumar, V. (2018). A survey on aerial swarm robotics. IEEE Transactions on Robotics, 34(4), 837–855. link

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

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

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

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

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

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

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

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