@@ -139,7 +139,8 @@ class MulticopterPositionControl : public ModuleBase<MulticopterPositionControl>
139
139
(ParamInt<px4::params::MPC_POS_MODE>) MPC_POS_MODE,
140
140
(ParamInt<px4::params::MPC_ALT_MODE>) MPC_ALT_MODE,
141
141
(ParamFloat<px4::params::MPC_IDLE_TKO>) MPC_IDLE_TKO, /* *< time constant for smooth takeoff ramp */
142
- (ParamInt<px4::params::MPC_OBS_AVOID>) MPC_OBS_AVOID /* *< enable obstacle avoidance */
142
+ (ParamInt<px4::params::MPC_OBS_AVOID>) MPC_OBS_AVOID, /* *< enable obstacle avoidance */
143
+ (ParamFloat<px4::params::MPC_TILTMAX_LND>) MPC_TILTMAX_LND /* *< maximum tilt for landing and smooth takeoff */
143
144
);
144
145
145
146
control::BlockDerivative _vel_x_deriv; /* *< velocity derivative in x */
@@ -684,25 +685,18 @@ MulticopterPositionControl::run()
684
685
// altitude above reference takeoff
685
686
const float alt_above_tko = -(_states.position (2 ) - _takeoff_reference_z);
686
687
687
- // disable position-xy / yaw control when close to ground
688
+ // disable yaw control when close to ground
688
689
if (alt_above_tko <= ALTITUDE_THRESHOLD) {
689
- // don't control position in xy
690
- setpoint.x = setpoint.y = NAN;
691
- setpoint.vx = setpoint.vy = NAN;
692
- setpoint.thrust [0 ] = setpoint.thrust [1 ] = NAN;
693
- setpoint.yaw = setpoint.yawspeed = NAN;
694
690
695
- if (PX4_ISFINITE (_states.velocity (0 )) && PX4_ISFINITE (_states.velocity (1 ))) {
696
- setpoint.vx = setpoint.vy = 0 .0f ; // try to keep zero velocity
697
-
698
- } else {
699
- setpoint.thrust [0 ] = setpoint.thrust [1 ] = 0 .0f ; // just keeping pointing upwards
700
- }
691
+ setpoint.yawspeed = NAN;
701
692
702
693
// if there is a valid yaw estimate, just set setpoint to yaw
703
694
if (PX4_ISFINITE (_states.yaw )) {
704
695
setpoint.yaw = _states.yaw ;
705
696
}
697
+
698
+ // limit tilt during smooth takeoff when still close to ground
699
+ constraints.tilt = math::radians (MPC_TILTMAX_LND.get ());
706
700
}
707
701
}
708
702
0 commit comments