avoid. adjust_velocity_z ( pos_control-> get_pos_z_p ( ) . kP ( ) , pos_control-> get_accel_z ( ) , target_rate, G_Dt) ;
void AC_Avoid: : adjust_velocity_z ( float kP, float accel_cmss, float & climb_rate_cms, float dt)
{
if ( _enabled == AC_AVOID_DISABLED) {
return ;
}
if ( climb_rate_cms <= 0.0f ) {
return ;
}
float accel_cmss_limited = MIN ( accel_cmss, AC_AVOID_ACCEL_CMSS_MAX) ;
bool limit_alt = false;
float alt_diff = 0.0f ;
if ( ( _enabled & AC_AVOID_STOP_AT_FENCE) > 0 && ( _fence. get_enabled_fences ( ) & AC_FENCE_TYPE_ALT_MAX) > 0 ) {
float veh_alt;
_ahrs. get_relative_position_D_home ( veh_alt) ;
alt_diff = _fence. get_safe_alt_max ( ) + veh_alt;
limit_alt = true;
}
float alt_limit;
float curr_alt;
if ( _ahrs. get_hgt_ctrl_limit ( alt_limit) &&
_ahrs. get_relative_position_D_origin ( curr_alt) ) {
const float ctrl_alt_diff = alt_limit + curr_alt;
if ( ! limit_alt || ctrl_alt_diff < alt_diff) {
alt_diff = ctrl_alt_diff;
limit_alt = true;
}
}
float proximity_alt_diff;
if ( _proximity. get_upward_distance ( proximity_alt_diff) ) {
proximity_alt_diff - = _margin;
if ( ! limit_alt || proximity_alt_diff < alt_diff) {
alt_diff = proximity_alt_diff;
limit_alt = true;
}
}
if ( limit_alt) {
if ( alt_diff <= 0.0f ) {
climb_rate_cms = MIN ( climb_rate_cms, 0.0f ) ;
return ;
}
const float max_speed = get_max_speed ( kP, accel_cmss_limited, alt_diff* 100.0f , dt) ;
climb_rate_cms = MIN ( max_speed, climb_rate_cms) ;
}
}