การปรับจูน Quadcopter PID


13

ในการต่อเนื่องของคำถามที่ฉันถามที่นี่: ความไม่แน่นอนของ 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' (มอเตอร์สองตัวที่ควบคุมการหมุน):

การป้อนข้อมูลแบบม้วน vs Motor PWM

สำหรับอินพุท / เอาท์พุท:

อินพุต: ค่า roll และ pitch (เป็นองศา) ดังที่ได้จากการรวมกันของ accelerometer + gyro

เอาต์พุต:ค่า PWM สำหรับมอเตอร์จัดส่งโดยใช้ฟังก์ชั่น motor.write () ของไลบรารี Servo


มติ

ฉันแก้ไขปัญหาแล้ว นี่คือวิธี:

  1. ปมของปัญหาโกหกในแบบที่ฉันใช้งานโปรแกรม Arduino ฉันใช้ฟังก์ชั่น write () เพื่ออัปเดตมุมเซอร์โวซึ่งเกิดขึ้นเพื่อยอมรับขั้นตอนจำนวนเต็มเพียงอย่างเดียวในการโต้แย้ง ฉันเปลี่ยนมันเป็นไมโครวินาที () และนั่นทำให้คอปเตอร์มั่นคงขึ้นอย่างมาก

  2. ฉันเพิ่ม RPM ในมอเตอร์เครื่องหนึ่งในขณะที่รักษาอีกค่าไว้อย่างมั่นคง ฉันเปลี่ยนสิ่งนี้เพื่อเพิ่ม RPM ในมอเตอร์เดียวขณะที่ลดมอเตอร์ตรงข้าม มันคงไม่เอาแรงผลักในแนวนอนทั้งหมดซึ่งอาจช่วยฉันได้เมื่อฉันพยายามจะยึดความสูงในแนวดิ่งกับสิ่งนี้

  3. ฉันผลัก RPM ขึ้นไปสู่ขีด จำกัด สูงสุดซึ่งเป็นสาเหตุที่ quadcopter สูญเสียการควบคุมอย่างเต็มที่ ไม่มีที่ว่างให้ RPM เพิ่มขึ้นเมื่อรู้สึกว่าเอียง

  4. ฉันสังเกตว่ามอเตอร์ตัวใดตัวหนึ่งอ่อนแอกว่ามอเตอร์ตัวอื่นฉันไม่รู้ว่าทำไม ฉันฮาร์ดโค้ดออฟเซ็ตลงในมอเตอร์อินพุต PWM

ขอบคุณสำหรับการสนับสนุน


รหัสแหล่งที่มา:

หากคุณสนใจนี่คือซอร์สโค้ดของการใช้ PID แบบเปลือยเปล่าของฉัน: ซอร์สโค้ด PID

โปรดทดสอบในฮาร์ดแวร์ของคุณ ยินดีที่จะมีส่วนร่วมในโครงการ


1
อินพุตคืออะไรและเอาต์พุตของลูปคืออะไร
Guy Sirton

@GuySirton: อัปเดตคำถามของฉัน
metsburg

อะไรคือส่วนแบนในคำสั่งมอเตอร์ของคุณ? ดูเหมือนว่าบางสิ่งจะอิ่มตัว คุณหมุนการเปลี่ยนแปลงเช่นฟังก์ชั่นต่อเนื่อง แต่คำสั่งของคุณดูฉับพลันมาก ทำไมทั้งคำสั่ง PWM ของมอเตอร์จึงลอยขึ้นมาในขณะที่อินพุตม้วนของคุณอยู่ในช่วงที่เหมือนกัน เวลาประมาณโดยประมาณคืออะไร?
Guy Sirton

1
เหตุผลที่คุณสูญเสียการควบคุมหลังจาก 30 วินาทีอาจเกี่ยวข้องกับคำสั่งทั้งสองของคุณลอยขึ้น ฉันคิดว่าคุณพยายามควบคุมความแตกต่างระหว่างคำสั่ง แต่คุณไม่สามารถปล่อยให้มันลอยขึ้นมาได้
Guy Sirton

@GuySirton: พวกเขาไม่ได้ลอยขึ้นมาฉันเพิ่มมันขึ้นมาจากศูนย์เพื่อให้มันถึงสถานะคงที่โดยเฉพาะภายใน 3/4 วินาที อย่างไรก็ตามฉันคิดว่าคุณพูดถูก "เหตุผลที่คุณสูญเสียการควบคุมหลังจาก 30 วินาทีอาจเกี่ยวข้องกับคำสั่งทั้งสองของคุณลอยขึ้นมา" หากฉันไม่ใช้การเพิ่มทีละน้อยนี้หากฉันแก้ไขอินพุต PWM ของฉันที่ระดับหนึ่ง (ต่ำกว่าอินพุตสูงสุดที่แสดงด้านบน) ปัญหาการสูญเสียการควบคุมหลังจาก 30 วินาทีจะหายไป
metsburg

คำตอบ:


6
  1. ดูเหมือนว่าการได้สัดส่วนของคุณสูงเกินไป
  2. ดูเหมือนว่าคุณจะเพิ่มรอบต่อนาทีของมอเตอร์หนึ่งตัวในขณะที่ล็อคอีกอันหนึ่งเพื่อให้ระบบหมุน นี่ไม่ใช่กลยุทธ์การควบคุมที่ดีเนื่องจากในที่สุดสิ่งเหล่านี้จะอิ่มตัวและคุณจะสูญเสียการควบคุม เมื่อเวลาเพิ่มความสามารถในการควบคุมระบบก็ลดลงเช่นกัน ดังนั้นคุณต้องมีระบบที่ดีกว่า
  3. หากคุณจัดการกับ # 1 และ # 2 คุณจะมีระบบที่เสถียรกว่า แต่คุณอาจไม่พอใจกับแบนด์วิดท์ควบคุม เพื่อจัดการกับสิ่งที่คุณต้องทำให้ระบบของคุณแข็งซึ่งรวมถึงการกำจัดความล่าช้าใด ๆ ในด้านเซ็นเซอร์ของสิ่งต่าง ๆ และในด้านการควบคุมของสิ่งต่าง ๆ

3

ฉันจะเริ่มต้นด้วยการอ่านคำถามนี้: อะไรคือกลยุทธ์ที่ดีสำหรับการปรับแต่ง PID ลูป?

ถ้าฉันต้องเดาฉันจะบอกว่าคุณมีปัญหาในการสร้างตัวกรองอภินันทนาการของคุณ เมื่อมอเตอร์ quadcopter ดับคุณควรเอียงเฟรมไปมาและดูว่าค่า roll / pitch ที่รายงานนั้นแม่นยำจริงหรือไม่

สำหรับฉันดูเหมือนว่ามีความล่าช้าระหว่างอินพุตจาก accelerometer กับเอาท์พุตของตัวกรองของคุณ - การสั่นอาจอธิบายได้จากการตอบสนองช้าต่อข้อมูลอินพุต การพลิกกลับในที่สุดดูเหมือนจะเป็นข้อผิดพลาดในการรวมที่อาจเกิดขึ้นเมื่อเวลาผ่านไป - กล่าวอีกนัยหนึ่งในขณะที่ quadcopter ของคุณอยู่ด้านข้าง

(อัปเดต) เกี่ยวกับกราฟของคุณความจริงที่ว่าความเร็วมอเตอร์ของคุณเพิ่มขึ้นอย่างต่อเนื่อง (แทนที่จะรักษาสมดุล) หมายความว่าคุณมีข้อผิดพลาดที่ใดที่หนึ่ง บางทีคำอินทิกรัลของคุณกำลังเพิ่มขึ้นอย่างไม่ จำกัด และคุณควรระบุค่าสูงสุดที่สมเหตุสมผลสำหรับคำนั้น


ฉันอัปเดตคำถามของฉันด้วยค่าการหมุนเมื่อเอียงไปมา ฉันแก้ไขการพลิกกลับในที่สุดโดยลดอินพุต PWM สูงสุดของฉัน ดูเหมือนว่าค่าการแก้ไขจะไม่ทำงานที่ RPM ที่สูงมาก ฉันสามารถหมุนอุปกรณ์ด้วยมือได้อย่างง่ายดายเมื่อทำงานที่ RPM สูง ที่ RPM ที่ต่ำกว่าฉันรู้สึกถึงแรงต้านที่มากและ Quadcopter ดูเหมือนจะแกว่งกลับไปที่ตำแหน่งเดิม (ซึ่งฉันเดาได้ดี) ดังนั้น 'พลิกกลับ' ปัญหาอาจแก้ไขได้ด้วยการลด RPM (ไม่รู้ว่าเสียงพึมพำจะถอดออกทั้งหมดหรือไม่หวังว่ามันจะเป็นเช่นนั้น) ปัญหาความผันผวนยังคงอยู่
metsburg

35±90

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

ฉันรู้ว่ากราฟนั้นทำให้เข้าใจผิดขออภัยสำหรับสิ่งนั้น ฉันจะลองและอัปเดตกราฟด้วยกราฟที่แม่นยำยิ่งขึ้น ที่จริงแล้วตั้งแต่ฉันวางแผนข้อมูลจากพอร์ตอนุกรมเมื่อฉันสร้างกราฟนี้บอร์ด Arduino ก็ถูกผูกไว้กับแล็ปท็อป หลังจากการแกว่งเล็กน้อยฉันต้องเข้าไปแทรกแซงและชะลอการสั่นด้วยตนเอง นั่นเป็นเหตุผลที่คุณเห็นมันนั่งลงที่ - 5 องศาในขณะที่ในความเป็นจริงมันอยู่ที่ 90 องศา ฉันจะพยายามอัปเดตกราฟที่แม่นยำยิ่งขึ้นในภายหลัง
metsburg

อีกสิ่งหนึ่งที่ฉันเห็นจากกราฟก็คือแรงขับที่รวมกันของคุณเพิ่มขึ้นเสมอ ดูเหมือนว่าผิด
เอียน

1

อาจมีหลายสิ่งที่เกิดขึ้นที่นี่ ...

1) มุมรายงานของคุณถูกต้องหรือไม่? มีเสียงดัง? คุณสามารถตรวจสอบได้อย่างง่ายดายโดยการเอียงรูปสี่เหลี่ยมของคุณด้วยตนเองและตรวจสอบค่าที่ออกมา

2) การติดตั้ง PID ของคุณเองมีข้อผิดพลาด คุณสามารถใช้การดำเนินการที่เชื่อถือได้เพื่อตรวจสอบรหัสของคุณ

3) อุปกรณ์ประกอบฉากมอเตอร์ติดตั้งผิดวิธีรอบ

4) ...


1) ฉันเอียงและตรวจสอบมุมที่รายงานเกือบถูกต้อง แต่มีเสียงดังแน่นอน 2) มีโอกาสมาก ... ที่จริงแล้วฉันคิดว่ามันสรุปได้ทั้งหมด: P 3) ไม่น่าจะมากสองตามเข็มนาฬิกาสองทวนเข็มนาฬิกาสอง ... ฉันได้ตรวจสอบอุปกรณ์ประกอบฉากหลายครั้ง + ฉันคิดว่าข้อผิดพลาดประเภทนี้จะ ส่งผลให้เกิดข้อผิดพลาดในทางที่อยู่นอกเหนือการควบคุม 4) ....
metsburg

4) ... การปรับ PID ผิดอาจทำให้สิ่งเลวร้ายยิ่งกว่าถ้าคุณไม่มี PID เลย!
dm76

ใช่ฉันเห็นแล้ว พรุ่งนี้ฉันจะทำงานต่อไป แผนแรกของฉันคือการใช้ห้องสมุด PID ที่เชื่อถือได้และอย่างที่สองคือเปลี่ยนเอาท์พุทของ PID จากสัญญาณ PWM ไปเป็น roll.pitch
metsburg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.