Quadcopter PID Controller สำหรับระยะทาง
ฉันกำลังพยายามใช้ตัวควบคุม PID เพื่อหยุด quadcopter ในตำแหน่งเฉพาะขณะเดินทางในแนวนอนอย่างไรก็ตามในขณะนี้มีการโอเวอร์คล็อก / ขีดล่างขึ้นอยู่กับความเร็วสูงสุด ฉันได้ลองปรับค่า P แล้วฉันและ D ด้วยตนเองโดยประสบความสำเร็จอย่าง จำกัด โดยพื้นฐานแล้วความเร็วจะต้องเปลี่ยนจาก maxSpeed ไปเป็น 0 ที่ส่วนท้ายสุดของเส้นทางการบิน
มันใช้ DJI SDK ดังนั้นอินพุตไปยังควอดคอปเตอร์จึงง่ายมากอินพุตพิทช์ของควอดคอปเตอร์อยู่ในหน่วย m / s และฉันคำนวณระยะทาง (m) ไปยังเป้าหมายในการวนซ้ำแต่ละครั้ง
ฉันเรียกใช้ลูปที่ดำเนินการทุก ๆ 0.1 วินาที รหัสหลอกบางส่วน:
kP = 0.25
kI = 0.50
kD = 90
timeStep = 0.1
maxSpeed = 10
currentError = initialDistanceToLocation - currentDistanceToLocation
derivativeError = (currentError - previousError) / timeStep
previousError = currentError
output = kP * currentError + kI * integralError + kD * derivativeError
integralError = integralError + currentError * timeStep
if >= maxSpeed {
output = maxSpeed
} else if output <= 0 {
output = 0
}
return output
มีวิธีปรับจูนคอนโทรลเลอร์ PID นี้ให้เข้ากับระบบนี้ได้อย่างน่าเชื่อถือซึ่งจะทำงานกับความเร็วสูงสุดที่แตกต่างกันได้หรือง่ายเกินไปและมีปัจจัยอื่น ๆ ที่ฉันต้องพิจารณาหรือไม่?
คำตอบ
หากคุณต้องการทำงานกับความเร็วที่สูงขึ้นคุณต้องพิจารณาตัวควบคุมความเร็วด้วย คุณยังสามารถลองผสมผสานการควบคุมความเร็วเข้ากับระบบควบคุมของคุณ ช่วยให้สามารถหยุดจุดได้อย่างราบรื่นซึ่งสามารถบรรเทาปัญหาของคุณได้ แต่ตัวควบคุม PID ทั่วไปที่มีการควบคุมตำแหน่งเพียงอย่างเดียวไม่ควรเกินมากเกินไปหากปรับแต่งอย่างถูกต้องและความเร็วสูงสุดไม่สูงเกินไป
ฉันไม่ทราบว่ารหัสเทียมของคุณสามารถนำมาเป็นตัวแทนของรหัสจริงของคุณได้ในระดับใด แต่ฉันเห็นข้อกังวลต่อไปนี้
คำอนุพันธ์
ในการใช้งานจริงคำอนุพันธ์ที่คำนวณเป็นความแตกต่าง จำกัด ขั้นตอนเดียวดังต่อไปนี้ไม่มีประโยชน์โดยสิ้นเชิง:
derivativeError = (currentError - previousError) / timeStep
มีสาเหตุหลายประการโดยส่วนใหญ่เกี่ยวข้องกับความจริงที่ว่าสัญญาณทางกายภาพเช่นเดียวกับระยะทางที่วัดได้จากเป้าหมายได้รับผลกระทบอย่างมากจากเสียงรบกวนซึ่งจะมีส่วนประกอบความถี่สูงที่ได้รับการขยายโดยการดำเนินการนี้ลดระดับลงอย่างหลีกเลี่ยงไม่ได้ ประสิทธิภาพของ PID และทำให้เกิดความไม่เสถียร
ดังนั้นคุณควรใช้เทคนิคที่ซับซ้อนกว่านี้แทนเช่นผู้สังเกตการณ์ความเร็ว (เช่นตัวประมาณค่าสถานะคาลมาน) หรือการกรองที่มีประสิทธิภาพ (เช่นการกรอง Savitzky - Golay) หรือแม้แต่เซ็นเซอร์ที่ดีกว่าที่สามารถวัดความเร็วได้ (ซึ่งหายากและค่อนข้างมาก อุปกรณ์ราคาแพงแม้ว่า)
อย่าตกใจ / กังวลเพียงแค่ปล่อยคำอนุพันธ์อย่างสบายใจ โปรดจำไว้ว่า 90% ของคอนโทรลเลอร์ PID ทั่วโลกเป็นเพียง PI 😉
ปริพันธ์
นี่คือส่วนที่มีปัญหามากที่สุด คุณไม่สามารถกำหนดเอาต์พุตคอนโทรลเลอร์ภายใน [0, maxSpeed] ได้โดยไม่ต้องบอก PID ว่าเกิดอะไรขึ้น มันจะไม่ได้ผล การทำเช่นนี้ในความเป็นจริงคุณจะกระตุ้นการสั่นที่ไม่ต้องการซึ่งตรงกับสิ่งที่คุณสังเกตเห็น
เพื่อให้ตัวควบคุมตระหนักถึงขอบเขตการทำงานคุณจะต้องพึ่งพาแผนภาพต่อต้าน windupมาตรฐาน
นี่เป็นขั้นตอนที่รู้จักกันดีในวรรณคดี คุณสามารถค้นหาได้ในพระคัมภีร์ของตัวควบคุม PID (พาร์ 3.5) รวมทั้งคุณสามารถอ่านทรัพยากร MATLAB ที่น่าสนใจนี้ได้
โดยพื้นฐานแล้วคุณต้องรวมความแตกต่างระหว่างเอาต์พุตที่กำหนดและเอาต์พุตที่แท้จริง (ดูภาพประกอบด้านล่าง)
integralError += (currentError + thresOutput - sheerOutput) * timeStep
ข้อสังเกตสุดท้าย
เมื่อคุณเล่นได้ตามจุดต่างๆข้างต้นแล้วคุณจะมีโอกาสลดการโอเวอร์ / โอเวอร์ได้มากขึ้น ดังที่กล่าวไว้เครื่องควบคุมความเร็วบริสุทธิ์กลายเป็นแนวทางที่เรียบง่าย ดังนั้นเพื่อให้มีประสิทธิภาพและแม่นยำยิ่งขึ้นในที่สุดคุณควรเล่นกับโมเดลไดนามิกของ quadcopter
หวังว่ามันจะช่วยได้