|
|
|
@ -1001,7 +1001,7 @@ void Ekf::controlHeightFusion()
@@ -1001,7 +1001,7 @@ void Ekf::controlHeightFusion()
|
|
|
|
|
_hgt_sensor_offset = _terrain_vpos; |
|
|
|
|
|
|
|
|
|
} else if (_control_status.flags.in_air) { |
|
|
|
|
_hgt_sensor_offset = _range_sensor.getCosTilt() * _range_sensor.getRange() + _state.pos(2); |
|
|
|
|
_hgt_sensor_offset = _range_sensor.getDistBottom() + _state.pos(2); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
_hgt_sensor_offset = _params.rng_gnd_clearance; |
|
|
|
@ -1161,10 +1161,11 @@ void Ekf::controlHeightFusion()
@@ -1161,10 +1161,11 @@ void Ekf::controlHeightFusion()
|
|
|
|
|
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.getRange() * _range_sensor.getCosTilt(), |
|
|
|
|
_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) + sq(_params.range_noise_scaler * _range_sensor.getRange())) * sq(_range_sensor.getCosTilt()), 0.01f); |
|
|
|
|
rng_hgt_obs_var(2) = fmaxf(sq(_params.range_noise) |
|
|
|
|
+ sq(_params.range_noise_scaler * _range_sensor.getDistBottom()), 0.01f); |
|
|
|
|
// innovation gate size
|
|
|
|
|
rng_hgt_innov_gate(1) = fmaxf(_params.range_innov_gate, 1.0f); |
|
|
|
|
// fuse height information
|
|
|
|
|