Quadcopter PID Controller สำหรับระยะทาง

Oct 17 2020

ฉันกำลังพยายามใช้ตัวควบคุม 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 นี้ให้เข้ากับระบบนี้ได้อย่างน่าเชื่อถือซึ่งจะทำงานกับความเร็วสูงสุดที่แตกต่างกันได้หรือง่ายเกินไปและมีปัจจัยอื่น ๆ ที่ฉันต้องพิจารณาหรือไม่?

คำตอบ

1 VarunVelpula Oct 17 2020 at 17:05

หากคุณต้องการทำงานกับความเร็วที่สูงขึ้นคุณต้องพิจารณาตัวควบคุมความเร็วด้วย คุณยังสามารถลองผสมผสานการควบคุมความเร็วเข้ากับระบบควบคุมของคุณ ช่วยให้สามารถหยุดจุดได้อย่างราบรื่นซึ่งสามารถบรรเทาปัญหาของคุณได้ แต่ตัวควบคุม PID ทั่วไปที่มีการควบคุมตำแหน่งเพียงอย่างเดียวไม่ควรเกินมากเกินไปหากปรับแต่งอย่างถูกต้องและความเร็วสูงสุดไม่สูงเกินไป

1 UgoPattacini Dec 28 2020 at 03:02

ฉันไม่ทราบว่ารหัสเทียมของคุณสามารถนำมาเป็นตัวแทนของรหัสจริงของคุณได้ในระดับใด แต่ฉันเห็นข้อกังวลต่อไปนี้

คำอนุพันธ์

ในการใช้งานจริงคำอนุพันธ์ที่คำนวณเป็นความแตกต่าง จำกัด ขั้นตอนเดียวดังต่อไปนี้ไม่มีประโยชน์โดยสิ้นเชิง:

derivativeError = (currentError - previousError) / timeStep

มีสาเหตุหลายประการโดยส่วนใหญ่เกี่ยวข้องกับความจริงที่ว่าสัญญาณทางกายภาพเช่นเดียวกับระยะทางที่วัดได้จากเป้าหมายได้รับผลกระทบอย่างมากจากเสียงรบกวนซึ่งจะมีส่วนประกอบความถี่สูงที่ได้รับการขยายโดยการดำเนินการนี้ลดระดับลงอย่างหลีกเลี่ยงไม่ได้ ประสิทธิภาพของ PID และทำให้เกิดความไม่เสถียร

ดังนั้นคุณควรใช้เทคนิคที่ซับซ้อนกว่านี้แทนเช่นผู้สังเกตการณ์ความเร็ว (เช่นตัวประมาณค่าสถานะคาลมาน) หรือการกรองที่มีประสิทธิภาพ (เช่นการกรอง Savitzky - Golay) หรือแม้แต่เซ็นเซอร์ที่ดีกว่าที่สามารถวัดความเร็วได้ (ซึ่งหายากและค่อนข้างมาก อุปกรณ์ราคาแพงแม้ว่า)

อย่าตกใจ / กังวลเพียงแค่ปล่อยคำอนุพันธ์อย่างสบายใจ โปรดจำไว้ว่า 90% ของคอนโทรลเลอร์ PID ทั่วโลกเป็นเพียง PI 😉

ปริพันธ์

นี่คือส่วนที่มีปัญหามากที่สุด คุณไม่สามารถกำหนดเอาต์พุตคอนโทรลเลอร์ภายใน [0, maxSpeed] ได้โดยไม่ต้องบอก PID ว่าเกิดอะไรขึ้น มันจะไม่ได้ผล การทำเช่นนี้ในความเป็นจริงคุณจะกระตุ้นการสั่นที่ไม่ต้องการซึ่งตรงกับสิ่งที่คุณสังเกตเห็น

เพื่อให้ตัวควบคุมตระหนักถึงขอบเขตการทำงานคุณจะต้องพึ่งพาแผนภาพต่อต้าน windupมาตรฐาน

นี่เป็นขั้นตอนที่รู้จักกันดีในวรรณคดี คุณสามารถค้นหาได้ในพระคัมภีร์ของตัวควบคุม PID (พาร์ 3.5) รวมทั้งคุณสามารถอ่านทรัพยากร MATLAB ที่น่าสนใจนี้ได้

โดยพื้นฐานแล้วคุณต้องรวมความแตกต่างระหว่างเอาต์พุตที่กำหนดและเอาต์พุตที่แท้จริง (ดูภาพประกอบด้านล่าง)

integralError += (currentError + thresOutput - sheerOutput) * timeStep

ข้อสังเกตสุดท้าย

เมื่อคุณเล่นได้ตามจุดต่างๆข้างต้นแล้วคุณจะมีโอกาสลดการโอเวอร์ / โอเวอร์ได้มากขึ้น ดังที่กล่าวไว้เครื่องควบคุมความเร็วบริสุทธิ์กลายเป็นแนวทางที่เรียบง่าย ดังนั้นเพื่อให้มีประสิทธิภาพและแม่นยำยิ่งขึ้นในที่สุดคุณควรเล่นกับโมเดลไดนามิกของ quadcopter

หวังว่ามันจะช่วยได้