ติดตั้ง FC GNSS และเซนเซอร์
UAT 302 การติดตั้งและประกอบรวมระบบอากาศยานไร้คนขับ
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- ประมาณสนามแม่เหล็กรบกวนจากสายกำลัง และกำหนดระยะติดตั้งเข็มทิศ
- ตั้งค่าทิศทางการติดตั้งของบอร์ดและเข็มทิศให้ตรงกับการติดตั้งจริง
- คำนวณผลของระยะห่างเสาอากาศ GNSS จาก IMU และตั้งค่าชดเชย
- ตรวจระดับการสั่นของตัวควบคุมการบินตามเกณฑ์ของ ArduPilot
ทำไมต้องรู้
ตัวควบคุมการบินรู้ท่าทางและทิศของอากาศยานจากเซนเซอร์ ถ้าติดตั้งผิดทิศ ผิดตำแหน่ง หรือใกล้แหล่งรบกวน โดรนจะบินผิดทั้งที่ทุกชิ้นส่วนปกติ อาการคลาสสิกคือโดรนบินวนเป็นวงก้นหอยในโหมดคงตำแหน่ง (toilet bowl) เพราะเข็มทิศถูกรบกวน UAT 205 เรียนหลักการของเซนเซอร์และการสอบเทียบไปแล้ว โมดูลนี้เน้น การติดตั้งและตั้งค่า หน่วยความรู้เรื่อง IMU และแมกนีโตมิเตอร์ของคลังความรู้โดรนย้ำเรื่อง bias สัญญาณรบกวน และการสั่นสะเทือน
เข็มทิศกับสายกำลัง
กระแสในสายไฟสร้างสนามแม่เหล็ก สายตรงยาวที่มีกระแส สร้างสนาม ที่ระยะ (OpenStax University Physics) โดย N/A² (CODATA 2022) ถ้าสายไปและกลับวางชิดกันห่าง สนามของทั้งสองหักล้างกันเกือบหมด เหลือราว เมื่อ มากกว่า มาก เข็มทิศวัดสนามแนวราบของโลก ซึ่งที่กรุงเทพฯ ต้นปี 2569 มีค่าราว 41,168 nT (41.2 µT) มุมเอียง 16.3° ลง และมุมเบี่ยงเบน 0.68° ตะวันตก ตามแบบจำลอง WMM2025 ผ่านบริการของ British Geological Survey
ตัวอย่างที่ 1 ติดเข็มทิศห่างสายแบตเตอรี่เท่าใด
สายแบตเตอรี่มีกระแสขณะลอยตัว 30 A ทีมต้องการให้สนามรบกวนไม่เกิน 5% ของสนามแนวราบของโลก
import math
MU0 = 1.25663706127e-6 # N/A² (CODATA 2022)
H_EARTH = 41_168e-9 # T แนวราบ กรุงเทพฯ 2026 (WMM2025)
I = 30.0 # A
def b_single(i, r):
return MU0 * i / (2 * math.pi * r)
def b_pair(i, s, r): # สายไปกลับห่าง s ใช้ได้เมื่อ r >> s
return MU0 * i * s / (2 * math.pi * r ** 2)
print(f"single wire at 5 cm: {b_single(I, 0.05) * 1e6:.1f} uT ({b_single(I, 0.05) / H_EARTH:.1f} x Earth's horizontal field)")
for s in (0.005, 0.02):
for r in (0.10, 0.20):
b = b_pair(I, s, r)
err = math.degrees(math.atan(b / H_EARTH))
print(f"pair {s * 1000:.0f} mm apart at {r * 100:.0f} cm: {b * 1e6:5.2f} uT = {b / H_EARTH:5.1%} of H, heading error up to {err:.1f} deg")
r_min = math.sqrt(MU0 * I * s / (2 * math.pi * 0.05 * H_EARTH))
print(f" distance for 5% of H with pair {s * 1000:.0f} mm apart: {r_min * 100:.0f} cm")
single wire at 5 cm: 120.0 uT (2.9 x Earth's horizontal field)
pair 5 mm apart at 10 cm: 3.00 uT = 7.3% of H, heading error up to 4.2 deg
pair 5 mm apart at 20 cm: 0.75 uT = 1.8% of H, heading error up to 1.0 deg
distance for 5% of H with pair 5 mm apart: 12 cm
pair 20 mm apart at 10 cm: 12.00 uT = 29.1% of H, heading error up to 16.3 deg
pair 20 mm apart at 20 cm: 3.00 uT = 7.3% of H, heading error up to 4.2 deg
distance for 5% of H with pair 20 mm apart: 24 cm
สายเส้นเดียวที่ระยะ 5 cm สร้างสนามแรงกว่าสนามโลกเกือบสามเท่า เข็มทิศจึงใช้ไม่ได้เลย การวางสายไปกลับชิดกันหรือพันเกลียวลดสนามลงมาก แต่ถ้าสายแยกห่าง 2 cm ต้องติดเข็มทิศไกลขึ้นเป็นสองเท่า นี่คือเหตุผลที่โดรนส่วนใหญ่ติด GNSS กับเข็มทิศบนเสาสูง ArduPilot มีการทดสอบ compassmot ซึ่งวัดสนามรบกวนเทียบกับกระแสจริง ค่าต่ำกว่า 30% ยอมรับได้ 31–60% ก้ำกึ่ง และเกิน 60% ต้องย้ายตำแหน่งหรือใช้เข็มทิศภายนอก
ทิศทางการติดตั้ง
ถ้าต้องติดตัวควบคุมการบินหมุนไปจากแนวหัวเครื่อง ต้องบอกซอฟต์แวร์ ใน ArduPilot ใช้ AHRS_ORIENTATION ซึ่งหมุนค่าของ IMU และเข็มทิศภายในตามมุมติดตั้ง แล้วต้องทำ level ใหม่และรีบูต เข็มทิศภายนอกตั้งแยกด้วย COMPASS_ORIENT ส่วน PX4 ใช้ SENS_BOARD_ROT การตรวจที่ได้ผลคือเอียงโดรนด้วยมือแล้วดูว่าท่าทางบนหน้าจอ GCS เอียงไปทางเดียวกันทุกแกน และหันโดรนแล้วดูว่าทิศหัวเครื่องเปลี่ยนถูกทาง
ตำแหน่งเสาอากาศ GNSS
GNSS บอกตำแหน่งของ เสาอากาศ ไม่ใช่ของ IMU ถ้าเสาอากาศอยู่ห่าง IMU เมื่อโดรนเอียงหรือหมุน ตำแหน่งที่วัดได้จะขยับไปทั้งที่ตัวโดรนไม่ได้เคลื่อนที่ ArduPilot ให้ใส่ระยะนี้ใน GPS1_POS_X/Y/Z หน่วยเมตร แกน X ไปหน้า Y ไปขวา Z ลงล่าง วัดจาก IMU (หรือจาก CG ถ้าตั้งตำแหน่ง IMU ไว้) ส่วน PX4 รุ่นใหม่ใช้ SENS_GPS0_OFFX/Y/Z แทน EKF2_GPS_POS_X/Y/Z ของรุ่นก่อน ตรวจชื่อพารามิเตอร์กับเอกสารของรุ่นเฟิร์มแวร์ที่ใช้จริงเสมอ
ตัวอย่างที่ 2 ผลของระยะห่างเสาอากาศ
เสาอากาศอยู่หน้า IMU 0.12 m และสูงกว่า 0.10 m (แกน Z ชี้ลง จึงเป็น −0.10)
import math
X, Z = 0.12, -0.10 # m, GPS1_POS_X และ GPS1_POS_Z
for roll in (10, 25):
shift = abs(Z) * math.sin(math.radians(roll))
print(f"roll {roll} deg: antenna moves sideways {shift * 100:.1f} cm while the IMU stays put")
yaw_rate = math.radians(60) # rad/s
print(f"yaw at 60 deg/s: antenna velocity {yaw_rate * X:.3f} m/s from rotation alone")
print(f"set GPS1_POS_X = {X}, GPS1_POS_Y = 0, GPS1_POS_Z = {Z}")
roll 10 deg: antenna moves sideways 1.7 cm while the IMU stays put
roll 25 deg: antenna moves sideways 4.2 cm while the IMU stays put
yaw at 60 deg/s: antenna velocity 0.126 m/s from rotation alone
set GPS1_POS_X = 0.12, GPS1_POS_Y = 0, GPS1_POS_Z = -0.1
ตำแหน่งขยับหลายเซนติเมตรเมื่อเอียง และความเร็วที่วัดได้คลาดเกือบ 0.13 m/s เมื่อหมุนหัวเร็ว สำหรับ GNSS ทั่วไปที่คลาดเคลื่อนระดับเมตรอาจไม่เห็นผล แต่สำหรับ RTK ระดับเซนติเมตรมีผลชัดเจน จึงต้องวัดและใส่ค่าชดเชยทุกครั้ง
ตรวจการสั่นของตัวควบคุมการบิน
เอกสาร ArduPilot เรื่องการวัดการสั่นกำหนดว่า ค่าการสั่นต่ำกว่า 30 m/s² ถือว่าปกติ 30–60 m/s² อาจเกิดปัญหา และเกิน 60 m/s² มักทำให้การคงตำแหน่งและความสูงผิดพลาด ตัวนับ clipping (แอกเซเลอโรมิเตอร์อิ่มตัวที่ 16 g) ควรเป็นศูนย์หรือน้อยมาก วิธีติดตั้งที่แนะนำคือวางบอร์ดบนโฟมหรือเจลที่มุม เพื่อตัดการสั่นความถี่สูงแต่ยังให้บอร์ดตามการเคลื่อนที่ช้าของโครงได้
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ติดตั้งและตรวจเซนเซอร์
- วัดระยะจากเข็มทิศถึงสายกำลังที่ใกล้ที่สุด ประมาณสนามรบกวนด้วยตัวอย่างที่ 1
- ติดตั้งตัวควบคุมการบินบนฐานกันสั่น ตั้ง
AHRS_ORIENTATIONและCOMPASS_ORIENTแล้วตรวจด้วยการเอียงและหมุน - วัดระยะเสาอากาศ GNSS ตั้ง
GPS1_POS_X/Y/Zตามตัวอย่างที่ 2 - สอบเทียบเข็มทิศ แล้วทำ compassmot ภายใต้การกำกับของอาจารย์ บันทึกผลเป็นเปอร์เซ็นต์
- บินลอยตัว อ่านค่าการสั่นและ clipping จาก log เทียบเกณฑ์ของ ArduPilot
ข้อผิดพลาดที่พบบ่อย
ระวัง
- เดินสายกำลังผ่านใต้เข็มทิศ หรือแยกสายไปกลับห่างกัน
- ติดบอร์ดหมุนแล้วไม่ตั้ง orientation
- ไม่ใส่ระยะเสาอากาศ GNSS เมื่อใช้ RTK
- ใช้ชื่อพารามิเตอร์จากบทความเก่า กับเฟิร์มแวร์รุ่นใหม่
- ยึดบอร์ดแข็งกับโครงที่สั่นมาก
สรุป
- สนามจากสายกำลังลดลงตามระยะ และลดลงมากเมื่อวางสายไปกลับชิดกัน ควรต่ำกว่าส่วนเล็ก ๆ ของสนามแนวราบของโลก (ราว 41 µT ที่กรุงเทพฯ)
- ตั้งทิศการติดตั้งด้วย
AHRS_ORIENTATIONและCOMPASS_ORIENTแล้วตรวจด้วยการเอียงจริง - ระยะเสาอากาศ GNSS จาก IMU ใส่ใน
GPS1_POS_X/Y/Zสำคัญมากกับ RTK - การสั่นต่ำกว่า 30 m/s² และ clipping ใกล้ศูนย์คือเกณฑ์ของ ArduPilot
แบบฝึกตรวจความเข้าใจ
- สายเส้นเดียวกระแส 20 A ที่ระยะ 10 cm สร้างสนามเท่าใด
- สนามรบกวน 4 µT ตั้งฉากกับสนามแนวราบ 41 µT ทำให้ทิศหัวเครื่องคลาดได้ราวกี่องศา
- compassmot ได้ 45% ควรทำอย่างไร
- เสาอากาศอยู่สูงกว่า IMU 0.1 m ค่า
GPS1_POS_Zควรเป็นบวกหรือลบ - ค่าการสั่น 45 m/s² อยู่ในช่วงใดตามเกณฑ์ของ ArduPilot
เฉลย
- µT
- อยู่ในช่วงก้ำกึ่ง ควรย้ายเข็มทิศให้ห่างแหล่งรบกวนหรือจัดสายใหม่ แล้วทดสอบซ้ำ
- ลบ เพราะแกน Z ชี้ลง
- 30–60 m/s² อาจเกิดปัญหา ควรปรับฐานกันสั่นหรือแก้ต้นเหตุ
สรุปสูตรสำคัญ
| สนามแม่เหล็กจากสายตรงยาว | |
| สนามจากสายคู่ไฟไปกลับ (r ≫ s) | |
| ความคลาดเคลื่อนทิศหัวเครื่อง |
แหล่งอ้างอิงหลัก
- Ling, S. J., Sanny, J., & Moebs, W. (2016). University physics volume 2. OpenStax. link
- National Institute of Standards and Technology. CODATA value: vacuum magnetic permeability (CODATA 2022). link
- British Geological Survey. Geomagnetism web service: World Magnetic Model WMM2025 and IGRF-14. link
- ArduPilot Dev Team. Advanced compass setup (CompassMot). ArduPilot Copter documentation. link
- ArduPilot Dev Team. Sensor position offset compensation. ArduPilot Copter documentation. link
- ArduPilot Dev Team. Parameter list (Copter stable V4.6.3). ArduPilot Copter documentation. link
- PX4 Autopilot. Parameter reference. PX4 user guide (main). link
- ArduPilot Dev Team. Measuring vibration. ArduPilot Copter documentation. link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
สถาปัตยกรรม PX4 และ ArduPilot
IMU ไจโรสโคป แอกเซเลอโรมิเตอร์ และแมกนีโตมิเตอร์
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz