diff --git a/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp b/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp index 5f21fe4e9fef7063f2c8457dd0b820cd928cebb9..e18d28a9bc72f1f8820317dbdb220b985d5d06ae 100644 --- a/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp +++ b/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp @@ -70,7 +70,8 @@ void FlightTaskManualPositionSmoothVel::_updateSetpoints() _smoothing[2].setMaxVel(_constraints.speed_down); } - Vector2f vel_xy = Vector2f(&_velocity(0)); + Vector2f vel_xy_sp = Vector2f(&_velocity_setpoint(0)); + Vector2f vel_xy_sp_smooth = Vector2f(&_vel_sp_smooth(0)); float jerk[3] = {_jerk_max.get(), _jerk_max.get(), _jerk_max.get()}; float jerk_xy = _jerk_max.get(); @@ -79,9 +80,15 @@ void FlightTaskManualPositionSmoothVel::_updateSetpoints() } if (_jerk_min.get() > FLT_EPSILON) { - // interpolate between min and max jerk - jerk_xy = math::min(_jerk_min.get() + (_jerk_max.get() - _jerk_min.get()) * vel_xy.length() / _constraints.speed_xy, - _jerk_max.get()); + if (vel_xy_sp.length() < FLT_EPSILON) { // Brake + jerk_xy = _jerk_min.get() + (_jerk_max.get() - _jerk_min.get()); + + } else if (vel_xy_sp.dot(vel_xy_sp_smooth) < -FLT_EPSILON) { // Reverse + jerk_xy = _jerk_max.get(); + + } else { + jerk_xy = _jerk_min.get(); + } } jerk[0] = jerk_xy;