 // vertical position innovation  gps measurement has opposite sign to earth z axis
 _gps_pos_innov(2) = _state.pos(2) + _gps_sample_delayed.hgt  _gps_alt_ref  _hgt_sensor_offset;
 // observation variance  receiver defined and parameter limited
 // use scaled horizontal position accuracy assuming typical ratio of VDOP/HDOP
 const float lower_limit = fmaxf(_params.gps_pos_noise, 0.01f);
 const float upper_limit = fmaxf(_params.pos_noaid_noise, lower_limit);
 gps_hgt_obs_var(2) = sq(1.5f * math::constrain(_gps_sample_delayed.vacc, lower_limit, upper_limit));
 // innovation gate size
 gps_hgt_innov_gate(1) = fmaxf(_params.baro_innov_gate, 1.0f);
 // fuse height information
 fuseVerticalPosition(_gps_pos_innov,gps_hgt_innov_gate,
 gps_hgt_obs_var, _gps_pos_innov_var,_gps_pos_test_ratio);

 } else if (_control_status.flags.rng_hgt) {
 Vector2f rng_hgt_innov_gate;
 Vector3f rng_hgt_obs_var;
 // use range finder with tilt correction
 _rng_hgt_innov(2) = _state.pos(2)  (math::max(_range_sensor.getDistBottom(),
 _params.rng_gnd_clearance))  _hgt_sensor_offset;
 // observation variance  user parameter defined
 rng_hgt_obs_var(2) = fmaxf(sq(_params.range_noise)