diff --git a/src/modules/mc_pos_control/MulticopterPositionControl.cpp b/src/modules/mc_pos_control/MulticopterPositionControl.cpp index c3a40737da..7d173f3cbb 100644 --- a/src/modules/mc_pos_control/MulticopterPositionControl.cpp +++ b/src/modules/mc_pos_control/MulticopterPositionControl.cpp @@ -331,7 +331,28 @@ void MulticopterPositionControl::Run() } if (_control_mode.flag_control_offboard_enabled) { - _vehicle_constraints.want_takeoff = _control_mode.flag_armed && hrt_elapsed_time(&_setpoint.timestamp) < 1_s; + + bool want_takeoff = _control_mode.flag_armed && _vehicle_land_detected.landed + && hrt_elapsed_time(&_setpoint.timestamp) < 1_s; + + if (want_takeoff && PX4_ISFINITE(_setpoint.z) + && (_setpoint.z < states.position(2))) { + + _vehicle_constraints.want_takeoff = true; + + } else if (want_takeoff && PX4_ISFINITE(_setpoint.vz) + && (_setpoint.vz < 0.f)) { + + _vehicle_constraints.want_takeoff = true; + + } else if (want_takeoff && PX4_ISFINITE(_setpoint.acceleration[2]) + && (_setpoint.acceleration[2] < 0.f)) { + + _vehicle_constraints.want_takeoff = true; + + } else { + _vehicle_constraints.want_takeoff = false; + } // override with defaults _vehicle_constraints.speed_xy = _param_mpc_xy_vel_max.get();