ในการต่อเนื่องของคำถามที่ฉันถามที่นี่: ความไม่แน่นอนของ Quadcopter ด้วยการออกตัวง่าย ๆ ในโหมดอัตโนมัติ ... ฉันต้องการถามคำถามสองสามข้อเกี่ยวกับการใช้ PID พื้นฐานสำหรับ quadrotor ที่ควบคุมโดยโมดูล APM 2.6 (ฉันใช้เฟรมจาก 3DRobotics)
ฉันถอดระบบควบคุมทั้งหมดออกเป็นสองบล็อก PID หนึ่งอันสำหรับควบคุมการหมุนและอีกอันสำหรับควบคุมระดับเสียง (หันเหและทุกอย่างอื่น ... ฉันจะคิดถึงพวกเขาในภายหลัง)
ฉันกำลังทดสอบการตั้งค่านี้บนอุปกรณ์ซึ่งประกอบด้วยลำแสงหมุนได้อย่างอิสระซึ่งฉันได้ผูกแขนสองแขนของควอดโรเตอร์ไว้ อีกสองคนมีอิสระที่จะย้าย ดังนั้นฉันกำลังทดสอบอิสระหนึ่งระดับ (ม้วนหรือระดับเสียง) ในแต่ละครั้ง
ตรวจสอบภาพด้านล่าง: ที่นี่ A, B ทำเครื่องหมายลำแสงหมุนได้อย่างอิสระซึ่งติดตั้งไว้
ด้วยการปรับพารามิเตอร์ P และ D อย่างระมัดระวังฉันสามารถจัดการเที่ยวบินต่อเนื่องได้ประมาณ 30 วินาที
แต่โดย 'ยั่งยืน' ฉันหมายถึงการทดสอบอย่างง่าย ๆ ซึ่งเสียงพึมพำไม่ได้โค่นล้มไปด้านใดด้านหนึ่ง เที่ยวบินที่มั่นคงบนโขดหินยังคงไม่มีใครเห็นและเที่ยวบินมากกว่า 30 วินาทีนั้นดูค่อนข้างยาก มันสั่นคลอนตั้งแต่ต้น เมื่อถึงเวลา 20-25 วินาทีมันก็เริ่มเอียงไปด้านใดด้านหนึ่ง ภายใน 30 วินาทีจะมีการเอียงไปข้างหนึ่งโดยให้ระยะขอบที่ยอมรับไม่ได้ ในไม่ช้าฉันก็พบว่ามันวางตัวคว่ำ
สำหรับรหัส PID ฉันกำลังคำนวณข้อผิดพลาดตามสัดส่วนจาก 'ตัวกรองอภินันทนาการ' ของข้อมูล gyro + accelerometer คำสำคัญถูกกำหนดเป็นศูนย์ เทอม P มาถึง 0.39 และเทอม D อยู่ที่ 0.0012 (ฉันไม่ได้ใช้ไลบรารี Arduino PID โดยเจตนาเพียงต้องการให้ PID ของฉันถูกนำไปใช้ที่นี่)
ตรวจสอบวิดีโอนี้หากคุณต้องการดูวิธีการทำงาน
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Yeh การตั้งค่านั้นค่อนข้างเก่า! ฉันเห็นด้วย. :)]
โปรดแจ้งให้เราทราบว่าฉันสามารถทำอะไรได้บ้างเพื่อปรับปรุงเสถียรภาพในขั้นตอนนี้
@Ian: จากการทดสอบมากมายที่ฉันทำกับการตั้งค่าของฉันฉันทำพล็อตกราฟสำหรับการทดสอบบางอย่างโดยใช้การอ่านจากจอมอนิเตอร์แบบอนุกรม นี่คือตัวอย่างการอ่านค่าของ vs vs 'Motor1 & Motor2 - PWM input' (มอเตอร์สองตัวที่ควบคุมการหมุน):
สำหรับอินพุท / เอาท์พุท:
อินพุต: ค่า roll และ pitch (เป็นองศา) ดังที่ได้จากการรวมกันของ accelerometer + gyro
เอาต์พุต:ค่า PWM สำหรับมอเตอร์จัดส่งโดยใช้ฟังก์ชั่น motor.write () ของไลบรารี Servo
มติ
ฉันแก้ไขปัญหาแล้ว นี่คือวิธี:
ปมของปัญหาโกหกในแบบที่ฉันใช้งานโปรแกรม Arduino ฉันใช้ฟังก์ชั่น write () เพื่ออัปเดตมุมเซอร์โวซึ่งเกิดขึ้นเพื่อยอมรับขั้นตอนจำนวนเต็มเพียงอย่างเดียวในการโต้แย้ง ฉันเปลี่ยนมันเป็นไมโครวินาที () และนั่นทำให้คอปเตอร์มั่นคงขึ้นอย่างมาก
ฉันเพิ่ม RPM ในมอเตอร์เครื่องหนึ่งในขณะที่รักษาอีกค่าไว้อย่างมั่นคง ฉันเปลี่ยนสิ่งนี้เพื่อเพิ่ม RPM ในมอเตอร์เดียวขณะที่ลดมอเตอร์ตรงข้าม มันคงไม่เอาแรงผลักในแนวนอนทั้งหมดซึ่งอาจช่วยฉันได้เมื่อฉันพยายามจะยึดความสูงในแนวดิ่งกับสิ่งนี้
ฉันผลัก RPM ขึ้นไปสู่ขีด จำกัด สูงสุดซึ่งเป็นสาเหตุที่ quadcopter สูญเสียการควบคุมอย่างเต็มที่ ไม่มีที่ว่างให้ RPM เพิ่มขึ้นเมื่อรู้สึกว่าเอียง
ฉันสังเกตว่ามอเตอร์ตัวใดตัวหนึ่งอ่อนแอกว่ามอเตอร์ตัวอื่นฉันไม่รู้ว่าทำไม ฉันฮาร์ดโค้ดออฟเซ็ตลงในมอเตอร์อินพุต PWM
ขอบคุณสำหรับการสนับสนุน
รหัสแหล่งที่มา:
หากคุณสนใจนี่คือซอร์สโค้ดของการใช้ PID แบบเปลือยเปล่าของฉัน: ซอร์สโค้ด PID
โปรดทดสอบในฮาร์ดแวร์ของคุณ ยินดีที่จะมีส่วนร่วมในโครงการ