@ -545,12 +545,7 @@ void Mode::land_run_vertical_control(bool pause_descent)
@@ -545,12 +545,7 @@ void Mode::land_run_vertical_control(bool pause_descent)
const float precland_min_descent_speed = 10.0f ;
// modify by @Brown , Staging land speed control
int16_t land_speed_now = g . land_speed ;
if ( get_alt_above_ground_cm ( ) < g . land_slow_2nd_alt )
land_speed_now = g . land_speed_2nd ;
else if ( get_alt_above_ground_cm ( ) < 3000 )
land_speed_now = g . land_speed_3nd ;
int16_t land_speed_now = get_speed_dn_slow ( ) ;
float cmb_rate = 0 ;
if ( ! pause_descent ) {
@ -560,14 +555,12 @@ void Mode::land_run_vertical_control(bool pause_descent)
@@ -560,14 +555,12 @@ void Mode::land_run_vertical_control(bool pause_descent)
} else {
max_land_descent_velocity = pos_control - > get_max_speed_down ( ) ;
}
// Don't speed up for landing.
// max_land_descent_velocity = MIN(max_land_descent_velocity, -abs(g.land_speed));
max_land_descent_velocity = MIN ( max_land_descent_velocity , - abs ( land_speed_now ) ) ;
max_land_descent_velocity = MAX ( max_land_descent_velocity , - abs ( land_speed_now ) ) ;
// Compute a vertical velocity demand such that the vehicle approaches g2.land_alt_low. Without the below constraint, this would cause the vehicle to hover at g2.land_alt_low.
cmb_rate = AC_AttitudeControl : : sqrt_controller ( MAX ( g2 . land_alt_low , 100 ) - get_alt_above_ground_cm ( ) , pos_control - > get_pos_z_p ( ) . kP ( ) , pos_control - > get_max_accel_z ( ) , G_Dt ) ;
// Constrain the demanded vertical velocity so that it is between the configured maximum descent speed and the configured minimum descent speed.
// cmb_rate = constrain_float(cmb_rate, max_land_descent_velocity, -abs(g.land_speed));
cmb_rate = constrain_float ( cmb_rate , max_land_descent_velocity , - abs ( land_speed_now ) ) ;
@ -648,41 +641,8 @@ void Mode::land_run_horizontal_control()
@@ -648,41 +641,8 @@ void Mode::land_run_horizontal_control()
pos_control - > override_vehicle_velocity_xy ( - target_vel_rel ) ;
}
# endif
static uint8_t prt_once ;
# if CONFIG_HAL_BOARD == HAL_BOARD_SITL
bool land_lock_attitude = ( get_alt_above_ground_cm ( ) < g . land_lock_alt * 2 ) & & \
g . land_lock_alt & & \
( copter . control_mode = = Mode : : Number : : LAND | | copter . control_mode = = Mode : : Number : : RTL | | copter . control_mode = = Mode : : Number : : AUTO ) ;
if ( ! prt_once & & land_lock_attitude )
gcs ( ) . send_text ( MAV_SEVERITY_INFO , " land lock sitl mode " ) ;
# else
bool land_lock_attitude = ( get_alt_above_ground_cm ( ) < g . land_lock_alt * 2 ) & & \
copter . rangefinder_alt_ok ( ) & & g . land_lock_alt & & \
( copter . control_mode = = Mode : : Number : : LAND | | copter . control_mode = = Mode : : Number : : RTL | | copter . control_mode = = Mode : : Number : : AUTO ) ;
# endif
if ( land_lock_attitude )
{
if ( prt_once = = 0 )
{
gcs ( ) . send_text ( MAV_SEVERITY_INFO , " Land ready to enter attitude lock mode " ) ;
copter . Log_Write_Event ( DATA_LAND_READY_LOCK ) ;
prt_once = 1 ;
}
if ( copter . rangefinder_state . alt_cm_filt . get ( ) < g . land_lock_alt ) {
target_roll = 0 ;
target_pitch = 0 ;
target_yaw_rate = 0 ;
loiter_nav - > soften_for_landing ( ) ;
if ( prt_once = = 1 )
{
gcs ( ) . send_text ( MAV_SEVERITY_INFO , " Land Lock attitude! " ) ;
copter . Log_Write_Event ( DATA_LAND_LOCK_ATT ) ;
prt_once = 2 ;
}
}
}
land_lock_att_control ( & target_roll , & target_pitch , & target_yaw_rate ) ;
// process roll, pitch inputs
loiter_nav - > set_pilot_desired_acceleration ( target_roll , target_pitch , G_Dt ) ;
@ -722,6 +682,50 @@ void Mode::land_run_horizontal_control()
@@ -722,6 +682,50 @@ void Mode::land_run_horizontal_control()
}
}
void Mode : : land_lock_att_control ( float * p_roll , float * p_pitch , float * p_yaw_rate )
{
float * target_roll = p_roll ;
float * target_pitch = p_pitch ;
float * target_yaw_rate = p_yaw_rate ;
static uint8_t prt_once ;
# if CONFIG_HAL_BOARD == HAL_BOARD_SITL
bool land_lock_attitude = ( get_alt_above_ground_cm ( ) < g . land_lock_alt * 2 ) & & \
g . land_lock_alt & & \
( copter . control_mode = = Mode : : Number : : LAND | | copter . control_mode = = Mode : : Number : : RTL | | copter . control_mode = = Mode : : Number : : AUTO ) ;
if ( ! prt_once & & land_lock_attitude )
gcs ( ) . send_text ( MAV_SEVERITY_INFO , " land lock sitl mode " ) ;
# else
bool land_lock_attitude = ( get_alt_above_ground_cm ( ) < g . land_lock_alt * 2 ) & & \
copter . rangefinder_alt_ok ( ) & & g . land_lock_alt & & \
( copter . control_mode = = Mode : : Number : : LAND | | copter . control_mode = = Mode : : Number : : RTL | | copter . control_mode = = Mode : : Number : : AUTO ) ;
# endif
if ( land_lock_attitude )
{
if ( prt_once = = 0 )
{
gcs ( ) . send_text ( MAV_SEVERITY_INFO , " Land ready to enter attitude lock mode " ) ;
copter . Log_Write_Event ( DATA_LAND_READY_LOCK ) ;
prt_once = 1 ;
}
if ( copter . rangefinder_state . alt_cm_filt . get ( ) < g . land_lock_alt ) {
* target_roll = 0 ;
* target_pitch = 0 ;
* target_yaw_rate = 0 ;
loiter_nav - > soften_for_landing ( ) ;
if ( prt_once = = 1 )
{
gcs ( ) . send_text ( MAV_SEVERITY_INFO , " Land Lock attitude! " ) ;
copter . Log_Write_Event ( DATA_LAND_LOCK_ATT ) ;
prt_once = 2 ;
}
}
} else {
prt_once = 0 ;
}
}
float Mode : : throttle_hover ( ) const
{
return motors - > get_throttle_hover ( ) ;
@ -884,3 +888,8 @@ uint16_t Mode::get_pilot_speed_dn()
@@ -884,3 +888,8 @@ uint16_t Mode::get_pilot_speed_dn()
{
return copter . get_pilot_speed_dn ( ) ;
}
uint16_t Mode : : get_speed_dn_slow ( )
{
return copter . get_speed_dn_slow ( ) ;
}