ออโตไพลอตและโหมดการบิน
UAT 206 ระบบควบคุมและออโตไพลอตเบื้องต้น
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- อธิบายโครงควบคุมแบบซ้อนของ PX4 และ ArduPilot สำหรับมัลติคอปเตอร์
- ระบุพารามิเตอร์หลักของแต่ละลูปควบคุม
- เชื่อมโหมดการบินกับลูปควบคุมที่ทำงานในแต่ละโหมด
- เปรียบเทียบไฟล์พารามิเตอร์และตรวจการเปลี่ยนแปลงก่อนเขียนลงเครื่อง
ทำไมต้องรู้
ออโตไพลอตมีพารามิเตอร์นับพันตัว และโหมดการบินหลายสิบโหมด การรู้ว่าโหมดใดใช้ลูปใด และพารามิเตอร์ใดคุมลูปไหน ทำให้แก้ปัญหาได้ถูกจุด เช่น โดรนแกว่งทุกโหมดแปลว่าลูปในมีปัญหา แต่ถ้าแกว่งเฉพาะโหมด Position ให้ดูลูปตำแหน่งและความเร็ว
โครงควบคุมแบบซ้อน
PX4 อธิบายไว้ในหน้า Controller Diagrams ว่าใช้ การควบคุมแบบซ้อน (cascaded control) มาตรฐาน
- ตำแหน่ง ตัวควบคุม P แปลงค่าผิดพลาดตำแหน่งเป็นความเร็วที่ต้องการ (
MPC_XY_P,MPC_Z_P) - ความเร็ว ตัวควบคุม PID แปลงเป็นความเร่งหรือแรงขับที่ต้องการ (
MPC_XY_VEL_P_ACCฯลฯ) มี anti-windup แบบ clamping - ท่าทาง ตัวควบคุม P แบบ quaternion แปลงเป็นอัตราหมุนที่ต้องการ (
MC_ROLL_Pฯลฯ) - อัตราหมุน ตัวควบคุม PID พร้อมตัวกรองอนุพันธ์ แปลงเป็นคำสั่งมอเตอร์ (
MC_ROLLRATE_P/I/D/K)
ArduPilot ใช้หลักเดียวกัน ตัวควบคุม P ของมุม (ใช้ square-root controller) ส่งต่อให้ PID ของอัตราหมุน พารามิเตอร์คือ ATC_ANG_RLL_P และ ATC_RAT_RLL_P/I/D พร้อมตัวกรอง ATC_RAT_RLL_FLTT, FLTE, FLTD และทำงานที่ 400 Hz บน Pixhawk
Åström และ Murray (2021) ข้อ 15.4 อธิบายว่าการควบคุมแบบซ้อนออกแบบทีละลูป เริ่มจากลูปใน ลูปในที่ตอบสนองแน่นช่วยลดผลของสิ่งรบกวนและทำให้ออกแบบลูปนอกง่ายขึ้น และเมื่อลูปในอิ่มตัว ต้องบอกให้ anti-windup ของลูปนอกรู้ด้วย
โหมดการบินกับลูปที่ทำงาน
โหมดการบินกำหนดว่านักบินหรือระบบอัตโนมัติสั่งที่ลูปใด ยิ่งอัตโนมัติมาก ลูปนอกก็ทำงานมากขึ้น
- Stabilized (PX4) / Stabilize (ArduPilot) นักบินสั่งมุมเอียงและคันเร่งโดยตรง ใช้เฉพาะลูปท่าทางและอัตราหมุน
- Altitude / Alt Hold เพิ่มลูปความสูง คันเร่งกลางคือคงความสูง
- Position / Loiter เพิ่มลูปตำแหน่งแนวราบ ปล่อยคันบังคับแล้วโดรนอยู่กับที่
- Mission, Return / Auto, RTL ระบบสร้างเส้นทางเองและใช้ทุกลูป
คู่มือ ArduPilot แนะนำให้ผู้เริ่มฝึกไล่จาก Stabilize ไป Alt Hold, Loiter, RTL และ Auto ส่วน PX4 แบ่งโหมดเป็นกลุ่มโหมดบังคับด้วยมือ เช่น Position, Altitude, Stabilized, Acro และกลุ่มอัตโนมัติ เช่น Hold, Return, Mission, Takeoff, Land, Offboard
ตัวอย่างที่ 1 โหมดใดใช้ลูปใด
ตารางอย่างง่ายช่วยแยกปัญหา ถ้าอาการเกิดในทุกโหมด สาเหตุน่าจะอยู่ในลูปที่ทุกโหมดใช้ร่วมกัน
LOOPS = ["rate", "attitude", "altitude", "horizontal position", "path"]
MODES = {
"Stabilized / Stabilize": 2,
"Altitude / Alt Hold": 3,
"Position / Loiter": 4,
"Mission / Auto": 5,
}
for mode, n in MODES.items():
print(f"{mode:<24} active loops: {', '.join(LOOPS[:n])}")
symptom_modes = ["Position / Loiter", "Mission / Auto"] # โหมดที่โดรนส่ายไปมา
common = set(LOOPS)
for m in symptom_modes:
common &= set(LOOPS[:MODES[m]])
fine = set(LOOPS[:MODES["Altitude / Alt Hold"]]) # โหมดที่บินปกติ
print("suspect loops:", sorted(common - fine))
Stabilized / Stabilize active loops: rate, attitude
Altitude / Alt Hold active loops: rate, attitude, altitude
Position / Loiter active loops: rate, attitude, altitude, horizontal position
Mission / Auto active loops: rate, attitude, altitude, horizontal position, path
suspect loops: ['horizontal position']
ถ้าโดรนส่ายเฉพาะใน Position และ Mission แต่ Altitude ปกติ ลูปที่ต้องสงสัยคือตำแหน่งแนวราบ ไม่ใช่ลูปอัตราหมุน
จัดการไฟล์พารามิเตอร์
ก่อนเปลี่ยนค่า ให้บันทึกไฟล์พารามิเตอร์เดิมเสมอ Mission Planner มีปุ่ม Save to file, Load from File และ Compare Params ที่เทียบค่าบนเครื่องกับไฟล์ แล้วเลือกได้ว่าจะเปลี่ยนค่าใด ซึ่งยังต้องกด Write Params จึงจะเขียนลงเครื่องจริง QGroundControl ก็บันทึกและโหลดไฟล์พารามิเตอร์ได้เช่นกัน
ตัวอย่างที่ 2 ตรวจการเปลี่ยนแปลงระหว่างไฟล์พารามิเตอร์สองชุด
ไฟล์รูปแบบ NAME,VALUE ของ ArduPilot ค่าก่อนและหลังเป็นค่าสมมติ
before = """ATC_RAT_RLL_P,0.135
ATC_RAT_RLL_I,0.135
ATC_RAT_RLL_D,0.0036
ATC_RAT_RLL_FLTD,20
ATC_ANG_RLL_P,4.5
INS_GYRO_FILTER,20"""
after = """ATC_RAT_RLL_P,0.19
ATC_RAT_RLL_I,0.19
ATC_RAT_RLL_D,0.004
ATC_RAT_RLL_FLTD,20
ATC_ANG_RLL_P,6.0
INS_GYRO_FILTER,40"""
LIMIT = 30.0 # % เปลี่ยนเกินนี้ให้ทบทวนก่อนบิน
def parse(text):
return {name: float(value) for name, value in (line.split(",") for line in text.splitlines())}
old, new = parse(before), parse(after)
for name in sorted(old.keys() | new.keys()):
a, b = old.get(name), new.get(name)
if a == b:
continue
pct = (b - a) / a * 100
flag = "REVIEW" if abs(pct) > LIMIT else ""
print(f"{name:<18} {a:>8g} -> {b:<8g} {pct:+6.1f}% {flag}")
ATC_ANG_RLL_P 4.5 -> 6 +33.3% REVIEW
ATC_RAT_RLL_D 0.0036 -> 0.004 +11.1%
ATC_RAT_RLL_I 0.135 -> 0.19 +40.7% REVIEW
ATC_RAT_RLL_P 0.135 -> 0.19 +40.7% REVIEW
INS_GYRO_FILTER 20 -> 40 +100.0% REVIEW
การเปลี่ยนเกินเกณฑ์หลายค่าพร้อมกันทำให้ไม่รู้ว่าค่าใดทำให้อาการเปลี่ยน ควรเปลี่ยนทีละค่าหรือทีละกลุ่ม แล้วบินทดสอบใน SITL ก่อน
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: สำรวจพารามิเตอร์และโหมดใน SITL
- เปิด SITL ของ PX4 หรือ ArduPilot เชื่อม QGroundControl หรือ Mission Planner แล้วบันทึกไฟล์พารามิเตอร์เริ่มต้น
- หาพารามิเตอร์ของทุกลูปในภาพที่ 1 ในโปรแกรม จดค่าเริ่มต้นและหน่วย
- บินในแต่ละโหมด สังเกตว่าคันบังคับแต่ละแกนหมายถึงอะไรในแต่ละโหมด
- เปลี่ยนค่า P ของลูปอัตราหมุนขึ้นทีละ 20% บันทึกไฟล์ แล้วใช้โค้ดตัวอย่างที่ 2 เทียบ
- ใช้ Compare Params หรือเทียบไฟล์ด้วยมือก่อนโหลดค่าเดิมกลับ
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ไม่บันทึกไฟล์พารามิเตอร์เดิมก่อนแก้
- คัดลอกพารามิเตอร์ข้ามรุ่นเฟิร์มแวร์หรือข้ามโดรน
- เปลี่ยนหลายค่าพร้อมกัน
- แก้ลูปนอกเมื่อปัญหาอยู่ลูปใน
- สลับโหมดในอากาศโดยไม่รู้ว่าคันบังคับจะมีความหมายใหม่
สรุป
- PX4 ใช้ cascade ตำแหน่ง P → ความเร็ว PID → ท่าทาง P → อัตราหมุน PID ส่วน ArduPilot ใช้มุม P → อัตราหมุน PID
- ออกแบบและจูนจากลูปในออกไปลูปนอก
- โหมดการบินต่างกันที่ลูปที่ทำงาน ใช้แยกหาสาเหตุของอาการได้
- บันทึก เปรียบเทียบ และเปลี่ยนพารามิเตอร์ทีละน้อย
แบบฝึกตรวจความเข้าใจ
- ในโครงของ PX4 ตัวควบคุมความเร็วส่งอะไรให้ลูปถัดไป
- โหมด Alt Hold ของ ArduPilot เพิ่มลูปใดจาก Stabilize
- โดรนสั่นในทุกโหมด ควรสงสัยลูปใดก่อน
- พารามิเตอร์เปลี่ยนจาก 0.135 เป็น 0.19 คิดเป็นกี่เปอร์เซ็นต์
- Compare Params ใน Mission Planner เขียนค่าลงเครื่องทันทีหรือไม่
เฉลย
- ความเร่งหรือแรงขับที่ต้องการ ซึ่งแปลงเป็นท่าทางและแรงขับ
- ลูปความสูง
- ลูปอัตราหมุนหรือท่าทาง เพราะทุกโหมดใช้ร่วมกัน
- ไม่ ต้องกด Write Params ก่อน
สรุปสูตรสำคัญ
| การเปลี่ยนสัมพัทธ์ของพารามิเตอร์ |
แหล่งอ้างอิงหลัก
- PX4 Autopilot. Controller diagrams. PX4 user guide (main). link
- ArduPilot Dev Team. Copter attitude control. ArduPilot developer documentation. link
- PX4 Autopilot. Flight modes (multicopter). PX4 guide (main). link
- ArduPilot Dev Team. Flight modes. ArduPilot Copter documentation. link
- ArduPilot Dev Team. Tuning process instructions. ArduPilot Copter documentation. link
- ArduPilot Dev Team. Mission Planner configuration and tuning. Mission Planner documentation. link
- Åström, K. J., & Murray, R. M. (2021). Feedback systems: An introduction for scientists and engineers (2nd ed.). Princeton University Press. link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz