This is a log from a quadcopter running ArduPilot, analyzed with the PID Review Tool. I find the stick feel of my quadcopter to be generally acceptable, and I’m opening this thread to discuss PID tuning in ArduPilot using this log as a practical example.
While the official ArduPilot wiki provides extensive theoretical guidance on PID tuning, there are very few practical, real-world tuning tutorials available. I understand the basic principles of P, I, and D controllers, but when applying this theory to actual flight, I still struggle to achieve ideal PID response curves. For hobbys, the stability of my current setup may be sufficient, but for commercial or precision operations, these curves are far from optimal.
The biggest challenge I’m facing is that I’ve never seen what a truly well-tuned PID curve looks like, so I don’t have a clear benchmark for what to aim for. As you can see in my log, there is a consistent delay of approximately 60ms between the peaks of the actual rate curve and the target rate curve. I understand this delay can be caused by filtering, slow motor/ESC response, or a combination of both. However, no matter how I adjust my PID gains, I cannot reduce this 60ms latency. I’ve increased the low-pass filter cutoff from 45Hz to 120Hz, but the delay barely changes. I’ve seen videos showing that BetaFlight can achieve latency as low as 7ms, which makes me believe there is significant room for improvement in my ArduPilot setup.
Additionally, I’m unsure about the ideal characteristics of a good step response curve, and what latency range is considered acceptable for professional use. I also notice that the frequency domain starts to degrade significantly above 20Hz, meaning the quadcopter not good above hight HZ
My goal with this thread is to deepen our collective understanding of PID response curves in ArduPilot, share practical tuning insights, and work toward achieving far better PID performance for both hobbyist and commercial applications.
60ms of ArduPilot vs 7ms of Betaflight resembles a lot the situation with the default rate loop freq of 400Hz in Ardupilot vs 4-8 kHz of Betaflight. But this 400Hz is not set in stone, I fly my (small hobby-grade) machines at 1kHz using the subsystem that starts at FSTRATE_ENABLE, and with an H7-based FC you can go to the same 4kHz.
Thanks, Lucas, for the link you provided. The content in the link seems quite complicated. For now, could you let me know the following:
In the time domain, what is the acceptable delay in milliseconds between the desired curve and the actual curve for a normal PID response? Also, from the time-domain perspective, by how many degrees per second (°/s) can the actual curve exceed the desired curve and still be considered acceptable?
At present, the peak of my actual curve overshoots the peak of the desired curve by approximately 8 °/s at best. Is this considered a relatively good PID curve based on the step response?
Generally, what range should the rise time be controlled within, and what percentage overshoot is acceptable from the step response curve?