โดรนหลายลำ
UAT 366 ระบบอากาศยานไร้คนขับอัตโนมัติภายในอาคารและระบบอากาศยานไร้คนขับหลายลำ
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- จัดสรรงานให้โดรนหลายลำด้วยการค้นทุกทาง และเทียบกับวิธี greedy
- คำนวณระยะใกล้สุดระหว่างเส้นทางสองลำระหว่างจุดบันทึก
- อธิบาย downwash หลักของ Boids และ ORCA ในการบินหลายลำ
- ประมาณแบนด์วิดท์การสื่อสารของฝูงโดรน
ทำไมต้องรู้
โดรนลำเดียวนับสต็อกทั้งคลังไม่ทันในหนึ่งคืน สามลำทำได้เร็วขึ้น แต่เกิดคำถามใหม่ ลำใดทำงานใด เส้นทางตัดกันหรือไม่ ลมจากใบพัดลำบนรบกวนลำล่างหรือไม่ และเครือข่ายรับข้อมูลทุกลำไหวหรือไม่ บทความทบทวนของ Chung และคณะ (2018) สรุปว่าการประสานหลายลำต้องจัดการทั้งการจัดสรรงาน การวางเส้นทาง และการสื่อสารไปพร้อมกัน
จัดสรรงาน
ปัญหาจับคู่โดรน ลำกับงาน งานให้ระยะรวมน้อยที่สุดคือ ปัญหาการจัดสรร (assignment problem) ซึ่งแก้ได้แม่นยำด้วยวิธี Hungarian (Kuhn, 1955) สำหรับจำนวนน้อยค้นทุกทางได้ ส่วนวิธี greedy ที่ให้แต่ละลำเลือกงานที่ใกล้ที่สุดตามลำดับนั้นเร็ว แต่อาจได้ผลแย่มาก
ตัวอย่างที่ 1 ค้นทุกทางเทียบ greedy
import math
from itertools import permutations
drones = [(0, 0), (0, 30), (60, 0), (60, 30)]
tasks = [(10, 25), (35, 15), (30, 5), (50, 25)]
cost = [[math.dist(d, t) for t in tasks] for d in drones]
best = min(permutations(range(4)), key=lambda p: sum(cost[i][p[i]] for i in range(4)))
used, greedy = set(), []
for i in range(4):
j = min((j for j in range(4) if j not in used), key=lambda j: cost[i][j])
used.add(j)
greedy.append(j)
for name, plan in (("optimal", best), ("greedy", greedy)):
total = sum(cost[i][plan[i]] for i in range(4))
pairs = ", ".join(f"D{i + 1}->T{plan[i] + 1}" for i in range(4))
print(f"{name:<8} {total:6.1f} m {pairs}")
optimal 81.9 m D1->T3, D2->T1, D3->T2, D4->T4
greedy 131.0 m D1->T1, D2->T2, D3->T4, D4->T3
D1 เลือกงานใกล้สุดก่อนคือ T1 ทำให้ D2 ที่อยู่ใกล้ T1 ต้องไปงานไกล ผลรวมแย่กว่าค่าที่ดีที่สุดมาก สำหรับหลายสิบลำใช้วิธี Hungarian ซึ่งให้คำตอบที่ดีที่สุดโดยไม่ต้องค้นทุกทาง
ระยะใกล้สุดระหว่างจุดบันทึก
หน่วยความรู้เรื่องเส้นทางฝูงโดรนเตือนว่า ตรวจเฉพาะจุดบันทึกอาจพลาดการเข้าใกล้กันระหว่างจุด สองลำที่สลับตำแหน่งกันห่างกัน 2 m ทั้งตอนเริ่มและตอนจบ แต่ชนกันกลางทาง
ตัวอย่างที่ 2 ระยะใกล้สุดระหว่างสองส่วนเส้นทาง
สมมติทั้งสองลำเคลื่อนเป็นเส้นตรงด้วยอัตราคงที่ในช่วงเวลาเดียวกัน
def closest(a0, a1, b0, b1, t0=0.0, dt=2.0):
r0 = [a - b for a, b in zip(a0, b0)]
dr = [(a1i - b1i) - r for a1i, b1i, r in zip(a1, b1, r0)]
dd = sum(v * v for v in dr)
u = 0.0 if dd == 0 else min(1.0, max(0.0, -sum(r * d for r, d in zip(r0, dr)) / dd))
d = sum((r + u * v) ** 2 for r, v in zip(r0, dr)) ** 0.5
return d, t0 + u * dt
cases = {
"swap on the same line": ((-1, 0, 2), (1, 0, 2), (1, 0, 2), (-1, 0, 2)),
"swap 0.5 m apart sideways": ((-1, 0, 2), (1, 0, 2), (1, 0.5, 2), (-1, 0.5, 2)),
"one above the other": ((0, 0, 2.0), (2, 0, 2.0), (0, 0, 2.4), (2, 0, 2.4)),
}
for name, (a0, a1, b0, b1) in cases.items():
d, t = closest(a0, a1, b0, b1)
print(f"{name:<26} ends {sum((a - b) ** 2 for a, b in zip(a0, b0)) ** 0.5:.1f} m apart -> "
f"min {d:.2f} m at t {t:.1f} s")
swap on the same line ends 2.0 m apart -> min 0.00 m at t 1.0 s
swap 0.5 m apart sideways ends 2.1 m apart -> min 0.50 m at t 1.0 s
one above the other ends 0.4 m apart -> min 0.40 m at t 0.0 s
กรณีที่สามห่างกันแนวดิ่ง 0.4 m ตลอดทาง ดูเหมือนปลอดภัย แต่ลำล่างอยู่ใต้ downwash ของลำบน Hönig และคณะ (2018) จึงจำลองแต่ละลำเป็นทรงรีที่ยาวในแนวดิ่งมากกว่าแนวราบ เกณฑ์ระยะแนวดิ่งจึงต้องมากกว่าแนวราบ ค่าเฉพาะต้องได้จากการทดสอบกับโดรนรุ่นที่ใช้
บินเป็นกลุ่มและหลบกันเอง
- Boids (Reynolds, 1987) จำลองฝูงนกด้วยกฎสามข้อที่แต่ละตัวทำเอง ต้นฉบับเรียกว่าหลีกเลี่ยงการชน จับคู่ความเร็ว และเข้าหาศูนย์กลางฝูง ต่อมานิยมเรียกว่า separation, alignment และ cohesion ไม่มีผู้สั่งการกลาง
- ORCA (van den Berg และคณะ, 2011) ต่อยอด velocity obstacle ให้ทุกลำรับผิดชอบการหลบคนละครึ่ง เหมาะกับหลายลำที่ตัดสินใจเอง
- Crazyswarm (Preiss และคณะ, 2017) เป็นระบบทดลองฝูงโดรนขนาดเล็กในอาคาร ปัจจุบันมี Crazyswarm2 บน ROS 2 งานของ Kushleyev และคณะ (2013) แสดงการบินหลายลำคล่องตัวในอาคาร ส่วนงานแสดงโดรนใช้ซอฟต์แวร์อย่าง Skybrush ที่วางเส้นทางล่วงหน้า
การแสดงตามแผนล่วงหน้าต่างจากฝูงที่ตัดสินใจเอง งานนับสต็อกในคลังมักใช้แบบวางแผนกลางร่วมกับการหลบหลีกเฉพาะที่
การสื่อสาร
ทุกลำส่งตำแหน่งและสถานะถี่ ๆ แบนด์วิดท์รวมเพิ่มตามจำนวนลำ
ตัวอย่างที่ 3 แบนด์วิดท์ของฝูง
MSG_BYTES, RATE_HZ, OVERHEAD = 60, 30, 1.3 # ข้อความตำแหน่ง, อัตรา, ส่วนหัวโปรโตคอล
for n in (3, 10, 50):
kbps = n * RATE_HZ * MSG_BYTES * 8 * OVERHEAD / 1000
print(f"{n:>2} drones: {kbps:6.1f} kbit/s for position updates only")
3 drones: 56.2 kbit/s for position updates only
10 drones: 187.2 kbit/s for position updates only
50 drones: 936.0 kbit/s for position updates only
ตัวเลขนี้ยังไม่รวมภาพจากกล้อง ถ้าทุกลำส่งวิดีโอ แบนด์วิดท์จะเพิ่มหลายร้อยเท่า การประมวลผลบนลำแล้วส่งเฉพาะผลจึงสำคัญในงานหลายลำ
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: สองลำในห้องปฏิบัติการ
- ใช้โค้ดตัวอย่างที่ 1 จัดสรรงานนับสต็อกให้สองถึงสามลำ เทียบกับ greedy
- วางเส้นทางของแต่ละลำ ตรวจระยะใกล้สุดทุกช่วงด้วยโค้ดตัวอย่างที่ 2 และแก้จุดที่ต่ำกว่าเกณฑ์
- ทดลองใน SITL หรือ Crazyswarm2 จำลองก่อน แล้วบินจริงสองลำที่ความเร็วต่ำ
- วัดผลของ downwash โดยให้ลำหนึ่งลอยเหนืออีกลำที่ระยะต่าง ๆ บันทึกการแกว่งของลำล่าง
- วัดแบนด์วิดท์จริงของเครือข่ายขณะบิน เทียบกับตัวอย่างที่ 3
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ใช้ greedy โดยไม่ตรวจคุณภาพ
- ตรวจระยะเฉพาะจุดบันทึก
- ใช้ระยะแนวดิ่งเท่ากับแนวราบ ทั้งที่มี downwash
- ส่งวิดีโอทุกลำผ่านเครือข่ายเดียว
- ทดสอบหลายลำครั้งแรกด้วยการบินจริง โดยไม่ผ่านการจำลอง
สรุป
- การจัดสรรงานเป็นปัญหา assignment แก้ได้แม่นยำด้วย Hungarian ส่วน greedy อาจแย่มาก
- ต้องตรวจระยะใกล้สุดระหว่างจุดบันทึก ไม่ใช่เฉพาะที่จุด
- downwash ทำให้ต้องเว้นระยะแนวดิ่งมากกว่าแนวราบ
- Boids และ ORCA ให้แต่ละลำตัดสินใจเอง แบนด์วิดท์เพิ่มตามจำนวนลำ
แบบฝึกตรวจความเข้าใจ
- โดรน 5 ลำ งาน 5 งาน มีการจับคู่ที่เป็นไปได้กี่แบบ
- ลำ A จาก (0, 0) ไป (4, 0) ลำ B จาก (4, 1) ไป (0, 1) ในเวลาเดียวกัน ระยะใกล้สุดเท่าใด
- ทำไมการตรวจเฉพาะจุดบันทึกจึงไม่พอ
- กฎสามข้อของ Boids ในชื่อที่นิยมคืออะไร
- 20 ลำ ส่งข้อความ 60 ไบต์ 30 ครั้งต่อวินาที (ไม่คิดส่วนหัว) ใช้แบนด์วิดท์เท่าใด
เฉลย
- 1 m ตอนสวนกันที่ x = 2
- สองลำอาจเข้าใกล้กันระหว่างจุดบันทึกแม้ห่างกันที่ทุกจุด
- separation, alignment และ cohesion
- bit/s = 288 kbit/s
สรุปสูตรสำคัญ
| ระยะใกล้สุดระหว่างสองลำในหนึ่งช่วง | |
| แบนด์วิดท์รวม |
แหล่งอ้างอิงหลัก
- 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
- Kushleyev, A., Mellinger, D., Powers, C., & Kumar, V. (2013). Towards a swarm of agile micro quadrotors. Autonomous Robots, 35(4), 287–300. link
- Preiss, J. A., Hönig, W., Sukhatme, G. S., & Ayanian, N. (2017). Crazyswarm: A large nano-quadcopter swarm. In 2017 IEEE International Conference on Robotics and Automation (pp. 3299–3304). IEEE. link
- Hönig, W., Preiss, J. A., Kumar, T. K. S., Sukhatme, G. S., & Ayanian, N. (2018). Trajectory planning for quadrotor swarms. IEEE Transactions on Robotics, 34(4), 856–869. link
- Reynolds, C. W. (1987). Flocks, herds and schools: A distributed behavioral model. ACM SIGGRAPH Computer Graphics, 21(4), 25–34. link
- van den Berg, J., Guy, S. J., Lin, M., & Manocha, D. (2011). Reciprocal n-body collision avoidance. In Robotics research (Springer Tracts in Advanced Robotics, Vol. 70, pp. 3–19). Springer. link
- IMRCLab. Crazyswarm2: A ROS 2 testbed for aerial robot teams [Documentation]. link
- CollMot Robotics. Skybrush Live documentation. link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการเข้มข้นในแล็บและภาคสนาม บันทึกผลลงสมุดปฏิบัติการ
หลักฐานการเรียนรู้: สมุดปฏิบัติการที่อาจารย์ลงนาม