ระบบหุ่นยนต์หลายตัว
UAT 308 ระบบอัตโนมัติและหุ่นยนต์
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- จำแนกปัญหาการจัดสรรงานหุ่นยนต์หลายตัวตามอนุกรมวิธานของ Gerkey และ Matarić
- จัดสรรงานด้วยการประมูลทีละงานและเทียบกับคำตอบดีที่สุด
- คำนวณจุดและเวลานัดพบระหว่างโดรนกับรถ UGV ที่กำลังวิ่ง
- ออกแบบการบูรณาการ UGV กับโดรนให้ทนต่อการสื่อสารขาดหาย
ทำไมต้องรู้
โซลาร์ฟาร์มขนาดใหญ่ใช้รถ 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% เพราะแต่ละรอบเลือกงานที่ถูกที่สุดตอนนั้นโดยไม่มองงานที่เหลือ ในงานจริงที่มีจุดตรวจหลายร้อยจุด การค้นทุกทางเป็นไปไม่ได้ ความต่างระดับนี้มักยอมรับได้แลกกับความเร็วและความยืดหยุ่น
นัดพบโดรนกับรถที่กำลังวิ่ง
รถ 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 เป็นส่วนเผื่อ ระบบจริงต้องส่งแผนความเร็วของรถให้โดรนอย่างต่อเนื่อง และถ้ารถเปลี่ยนความเร็วหรือการสื่อสารขาด ต้องมีจุดนัดพบสำรองที่รถจอดรอ
บูรณาการให้ทนต่อการสื่อสารขาด
ระบบหลายหุ่นยนต์ในพื้นที่กว้างมักเจอการสื่อสารขาดช่วง การออกแบบที่ดีให้หุ่นยนต์แต่ละตัวมีงานที่ทำต่อได้เองเมื่อขาดการติดต่อ กำหนดจุดรวมพลและเวลาที่ต้องกลับ ใช้เครือข่ายสองระดับ เช่น Wi-Fi สำหรับข้อมูลใหญ่และ LoRa สำหรับตำแหน่งและสถานะ และให้ศูนย์ควบคุมเห็นสถานะล่าสุดพร้อมอายุของข้อมูลเสมอ
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ภารกิจร่วม UGV และโดรน
- กำหนดจุดตรวจ 8 จุดในสนาม ให้รถสองคันประมูลงานตามตัวอย่างที่ 1 เทียบระยะรวมกับการแบ่งด้วยมือ
- เพิ่มงานใหม่กลางภารกิจ ให้ประมูลเฉพาะงานนั้น แล้วบันทึกการเปลี่ยนเส้นทาง
- จำลองโดรนใน SITL กลับมาลงบนเป้าบนรถที่วิ่งช้า ๆ ใช้ตัวอย่างที่ 2 คำนวณจุดนัดพบ
- ตัดการสื่อสารของรถหนึ่งคันกลางภารกิจ ตรวจว่ารถทำงานต่อหรือกลับจุดรวมพลตามที่ออกแบบ
- เขียนรายงานสรุปสถาปัตยกรรมระบบ ปัญหาที่พบ และข้อเสนอปรับปรุง
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ใช้การจับคู่หนึ่งต่อหนึ่ง กับงานที่หุ่นยนต์ต้องทำหลายจุดต่อเนื่อง
- คิดว่าการประมูลได้คำตอบดีที่สุดเสมอ
- ให้โดรนบินไล่ตำแหน่งปัจจุบันของรถ แทนการคำนวณจุดนัดพบ
- ไม่มีจุดนัดพบสำรอง เมื่อสื่อสารขาดหรือรถเปลี่ยนแผน
- ไม่แสดงอายุของข้อมูล บนหน้าจอศูนย์ควบคุม
สรุป
- อนุกรมวิธาน ST/MT, SR/MR และ IA/TA ช่วยเลือกวิธีจัดสรรงาน
- การประมูลทีละงานใช้ต้นทุนเพิ่มเป็นราคา กระจายการคำนวณได้ แต่ไม่รับประกันคำตอบดีที่สุด
- จุดนัดพบกับรถที่วิ่งหาได้จากสมการกำลังสอง และเร็วกว่าการบินไล่ตาม
- ระบบหลายหุ่นยนต์ต้องทำงานต่อได้อย่างปลอดภัยเมื่อสื่อสารขาด
แบบฝึกตรวจความเข้าใจ
- งานที่รถแต่ละคันต้องไล่ตรวจหลายจุดเป็นลำดับจัดอยู่ในกลุ่มใดตามอนุกรมวิธาน
- วิธีใดให้คำตอบดีที่สุดของการจับคู่หุ่นยนต์หนึ่งตัวต่องานหนึ่งงาน
- เส้นทางเดิมยาว 120 m ถ้าแทรกงานใหม่แล้วยาว 150 m ราคาประมูลเท่าใด
- รถวิ่ง 5 m/s โดรนบิน 10 m/s ทำไมโดรนควรบินไปจุดนัดพบแทนการไล่ตาม
- การประมูลได้ 213.8 m ส่วนคำตอบดีที่สุด 200.2 m การประมูลแย่กว่ากี่เปอร์เซ็นต์
เฉลย
- ST-SR-TA
- วิธีฮังกาเรียน (Kuhn, 1955)
- m
- การไล่ตามเล็งตำแหน่งที่รถกำลังจะพ้นไป ทำให้เส้นทางโค้งและยาวกว่า
สรุปสูตรสำคัญ
| ราคาประมูล (ต้นทุนเพิ่ม) | |
| สมการนัดพบ |
แหล่งอ้างอิงหลัก
- 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
- 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
- Kuhn, H. W. (1955). The Hungarian method for the assignment problem. Naval Research Logistics Quarterly, 2(1–2), 83–97. link
- 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 ประจำโมดูล
การประสานโดรนหลายลำ
เนื้อหาเจาะลึก: การประสานฝูงโดรน (Swarm Drone) ผ่านโครงข่ายสื่อสาร LoRa Mesh Network
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz