โมดูล 4/5 · สัปดาห์ 10–12 · 27 ชม.

ออโตไพลอตและโหมดการบิน

UAT 206 ระบบควบคุมและออโตไพลอตเบื้องต้น

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

บทเรียน

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

  1. อธิบายโครงควบคุมแบบซ้อนของ PX4 และ ArduPilot สำหรับมัลติคอปเตอร์
  2. ระบุพารามิเตอร์หลักของแต่ละลูปควบคุม
  3. เชื่อมโหมดการบินกับลูปควบคุมที่ทำงานในแต่ละโหมด
  4. เปรียบเทียบไฟล์พารามิเตอร์และตรวจการเปลี่ยนแปลงก่อนเขียนลงเครื่อง

ความรู้พื้นฐานที่ควรมี: UAT 206 โมดูล 1–3 · UAT 311 โมดูล 3 (สถาปัตยกรรมออโตไพลอตเบื้องต้น)

ทำไมต้องรู้

ออโตไพลอตมีพารามิเตอร์นับพันตัว และโหมดการบินหลายสิบโหมด การรู้ว่าโหมดใดใช้ลูปใด และพารามิเตอร์ใดคุมลูปไหน ทำให้แก้ปัญหาได้ถูกจุด เช่น โดรนแกว่งทุกโหมดแปลว่าลูปในมีปัญหา แต่ถ้าแกว่งเฉพาะโหมด Position ให้ดูลูปตำแหน่งและความเร็ว

โครงควบคุมแบบซ้อน

PX4 อธิบายไว้ในหน้า Controller Diagrams ว่าใช้ การควบคุมแบบซ้อน (cascaded control) มาตรฐาน

  1. ตำแหน่ง ตัวควบคุม P แปลงค่าผิดพลาดตำแหน่งเป็นความเร็วที่ต้องการ (MPC_XY_P, MPC_Z_P)
  2. ความเร็ว ตัวควบคุม PID แปลงเป็นความเร่งหรือแรงขับที่ต้องการ (MPC_XY_VEL_P_ACC ฯลฯ) มี anti-windup แบบ clamping
  3. ท่าทาง ตัวควบคุม P แบบ quaternion แปลงเป็นอัตราหมุนที่ต้องการ (MC_ROLL_P ฯลฯ)
  4. อัตราหมุน ตัวควบคุม 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 ของลูปนอกรู้ด้วย

ห้ากล่องเรียงจากซ้ายไปขวา ตำแหน่ง P ความเร็ว PID ท่าทาง P อัตราหมุน PID และมอเตอร์ ใต้ลูกศรระหว่างกล่องเขียนว่า ความเร็วที่ต้องการ แรงขับและท่าทาง อัตราหมุนที่ต้องการ และคำสั่งมอเตอร์ ด้านบนสองกล่องแรกเขียนว่าช้ากว่า ลูปนอก ด้านบนกล่องท่าทางและอัตราหมุนเขียนว่าเร็วกว่า ลูปใน
ภาพที่ 1 โครงควบคุมแบบซ้อนของ PX4 สำหรับมัลติคอปเตอร์

โหมดการบินกับลูปที่ทำงาน

โหมดการบินกำหนดว่านักบินหรือระบบอัตโนมัติสั่งที่ลูปใด ยิ่งอัตโนมัติมาก ลูปนอกก็ทำงานมากขึ้น

  • 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

สี่แถบซ้อนเป็นขั้นบันได แถบล่างสุดสีเขียว Stabilized หรือ Stabilize ใช้ท่าทางและอัตราหมุน ถัดขึ้นไปสีฟ้า Altitude หรือ Alt Hold บวกความสูง ถัดขึ้นไปสีม่วง Position หรือ Loiter บวกตำแหน่งแนวราบ บนสุดสีทอง Mission, Return หรือ Auto, RTL บวกเส้นทางอัตโนมัติ ลูกศรแนวตั้งด้านซ้ายชี้ขึ้นเขียนว่าอัตโนมัติมากขึ้น
ภาพที่ 2 โหมดการบินเรียงตามลูปควบคุมที่ทำงาน

ตัวอย่างที่ 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

  1. เปิด SITL ของ PX4 หรือ ArduPilot เชื่อม QGroundControl หรือ Mission Planner แล้วบันทึกไฟล์พารามิเตอร์เริ่มต้น
  2. หาพารามิเตอร์ของทุกลูปในภาพที่ 1 ในโปรแกรม จดค่าเริ่มต้นและหน่วย
  3. บินในแต่ละโหมด สังเกตว่าคันบังคับแต่ละแกนหมายถึงอะไรในแต่ละโหมด
  4. เปลี่ยนค่า P ของลูปอัตราหมุนขึ้นทีละ 20% บันทึกไฟล์ แล้วใช้โค้ดตัวอย่างที่ 2 เทียบ
  5. ใช้ Compare Params หรือเทียบไฟล์ด้วยมือก่อนโหลดค่าเดิมกลับ

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

ระวัง

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

สรุป

  • PX4 ใช้ cascade ตำแหน่ง P → ความเร็ว PID → ท่าทาง P → อัตราหมุน PID ส่วน ArduPilot ใช้มุม P → อัตราหมุน PID
  • ออกแบบและจูนจากลูปในออกไปลูปนอก
  • โหมดการบินต่างกันที่ลูปที่ทำงาน ใช้แยกหาสาเหตุของอาการได้
  • บันทึก เปรียบเทียบ และเปลี่ยนพารามิเตอร์ทีละน้อย

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

  1. ในโครงของ PX4 ตัวควบคุมความเร็วส่งอะไรให้ลูปถัดไป
  2. โหมด Alt Hold ของ ArduPilot เพิ่มลูปใดจาก Stabilize
  3. โดรนสั่นในทุกโหมด ควรสงสัยลูปใดก่อน
  4. พารามิเตอร์เปลี่ยนจาก 0.135 เป็น 0.19 คิดเป็นกี่เปอร์เซ็นต์
  5. Compare Params ใน Mission Planner เขียนค่าลงเครื่องทันทีหรือไม่
เฉลย
  1. ความเร่งหรือแรงขับที่ต้องการ ซึ่งแปลงเป็นท่าทางและแรงขับ
  2. ลูปความสูง
  3. ลูปอัตราหมุนหรือท่าทาง เพราะทุกโหมดใช้ร่วมกัน
  4. ไม่ ต้องกด Write Params ก่อน

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

การเปลี่ยนสัมพัทธ์ของพารามิเตอร์

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

  1. PX4 Autopilot. Controller diagrams. PX4 user guide (main). link
  2. ArduPilot Dev Team. Copter attitude control. ArduPilot developer documentation. link
  3. PX4 Autopilot. Flight modes (multicopter). PX4 guide (main). link
  4. ArduPilot Dev Team. Flight modes. ArduPilot Copter documentation. link
  5. ArduPilot Dev Team. Tuning process instructions. ArduPilot Copter documentation. link
  6. ArduPilot Dev Team. Mission Planner configuration and tuning. Mission Planner documentation. link
  7. Å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

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

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

โดเมนความรู้: การควบคุม ออโตไพลอต และการนำทาง · การวางแผนภารกิจ การบิน และการจำลอง