@@ -74,6 +74,7 @@ typedef struct {
7474 pt1Filter_t angleFilterState ;
7575
7676 // Rate filtering
77+ rateLimitFilter_t axisAccelFilter ;
7778 pt1Filter_t ptermLpfState ;
7879 pt1Filter_t deltaLpfState ;
7980} pidState_t ;
@@ -278,6 +279,16 @@ static void pidLevel(const pidProfile_t *pidProfile, const controlRateConfig_t *
278279 }
279280}
280281
282+ /* Apply angular acceleration limit to rate target to limit extreme stick inputs to respect physical capabilities of the machine */
283+ static void pidApplySetpointRateLimiting (const pidProfile_t * pidProfile , pidState_t * pidState , flight_dynamics_index_t axis )
284+ {
285+ const uint32_t axisAccelLimit = (axis == FD_YAW ) ? pidProfile -> axisAccelerationLimitYaw : pidProfile -> axisAccelerationLimitRollPitch ;
286+
287+ if (axisAccelLimit > AXIS_ACCEL_MIN_LIMIT ) {
288+ pidState -> rateTarget = rateLimitFilterApply4 (& pidState -> axisAccelFilter , pidState -> rateTarget , (float )axisAccelLimit , dT );
289+ }
290+ }
291+
281292static void pidApplyRateController (const pidProfile_t * pidProfile , pidState_t * pidState , flight_dynamics_index_t axis )
282293{
283294 const float rateError = pidState -> rateTarget - pidState -> gyroRate ;
@@ -499,6 +510,11 @@ void pidController(const pidProfile_t *pidProfile, const controlRateConfig_t *co
499510 pidTurnAssistant (pidState );
500511 }
501512
513+ // Apply setpoint rate of change limits
514+ for (int axis = 0 ; axis < 3 ; axis ++ ) {
515+ pidApplySetpointRateLimiting (pidProfile , & pidState [axis ], axis );
516+ }
517+
502518 // Step 4: Run gyro-driven control
503519 for (int axis = 0 ; axis < 3 ; axis ++ ) {
504520 // Apply PID setpoint controller
0 commit comments