@@ -28,6 +28,7 @@ void atr_init(ATR *atr) {
2828 atr -> ad_alpha2 = 0.0f ;
2929 atr -> ad_alpha3 = 0.0f ;
3030
31+ ema_init (& atr -> transition_target );
3132 smooth_setpoint_init (& atr -> setpoint );
3233
3334 atr_reset (atr );
@@ -38,6 +39,8 @@ void atr_reset(ATR *atr) {
3839 atr -> speed_boost = 0.0f ;
3940
4041 atr -> target = 0.0f ;
42+ ema_reset (& atr -> transition_target , 0.0f );
43+ atr -> transition_boost = 1.0f ;
4144 smooth_setpoint_reset (& atr -> setpoint );
4245}
4346
@@ -53,6 +56,7 @@ void atr_configure(ATR *atr, const RefloatConfig *config, float frequency) {
5356 atr -> ad_alpha2 = ema_calculate_alpha (6.0f , frequency );
5457 atr -> ad_alpha1 = ema_calculate_alpha (1.0f , frequency );
5558
59+ ema_configure (& atr -> transition_target , 6.0f , frequency );
5660 smooth_setpoint_configure (
5761 & atr -> setpoint ,
5862 config -> atr .filter .time_constant ,
@@ -139,8 +143,26 @@ void atr_update(
139143) {
140144 if (!wheelslip ) {
141145 calculate_atr_target (atr , motor , config );
142- smooth_setpoint_update (& atr -> setpoint , atr -> target , motor -> forward , dt );
146+
147+ ema_update (& atr -> transition_target , atr -> target );
148+
149+ float transition_target = atr -> transition_target .value ;
150+ float degrees_diff = fabsf (atr -> setpoint .value - transition_target ) - 1.0f ;
151+ // Only apply transition boost if the setpoint and target differ in
152+ // signs and the degree diff is greater than 1
153+ if (atr -> setpoint .value * transition_target < 0 && degrees_diff > 0.0f ) {
154+ // Scale the transition multiplier linearly from 1 to 2 degrees of difference
155+ atr -> transition_boost =
156+ 1.0f + min (degrees_diff , 1.0f ) * (config -> atr .transition_boost - 1.0f );
157+ } else {
158+ atr -> transition_boost = 1.0f ;
159+ }
160+
161+ smooth_setpoint_update (
162+ & atr -> setpoint , atr -> target , motor -> forward , atr -> transition_boost , dt
163+ );
143164 } else {
144165 smooth_setpoint_winddown (& atr -> setpoint );
166+ ema_reset (& atr -> transition_target , atr -> setpoint .value );
145167 }
146168}
0 commit comments