AP_AHRS: add a bool wind_estimate(...)

NavEKF3 can fail to return a wind estimate, and we lose that value
This commit is contained in:
Peter Barker 2023-01-12 18:12:01 +11:00 committed by Peter Barker
parent 96f359b4e3
commit aa7ab28969
8 changed files with 33 additions and 27 deletions

View File

@ -734,40 +734,40 @@ float AP_AHRS::get_error_yaw(void) const
} }
// return a wind estimation vector, in m/s // return a wind estimation vector, in m/s
Vector3f AP_AHRS::wind_estimate(void) const bool AP_AHRS::wind_estimate(Vector3f &wind) const
{ {
Vector3f wind;
switch (active_EKF_type()) { switch (active_EKF_type()) {
case EKFType::NONE: case EKFType::NONE:
wind = dcm.wind_estimate(); return dcm.wind_estimate(wind);
break;
#if AP_AHRS_SIM_ENABLED #if AP_AHRS_SIM_ENABLED
case EKFType::SIM: case EKFType::SIM:
wind = sim.wind_estimate(); return sim.wind_estimate(wind);
break;
#endif #endif
#if HAL_NAVEKF2_AVAILABLE #if HAL_NAVEKF2_AVAILABLE
case EKFType::TWO: case EKFType::TWO:
EKF2.getWind(wind); EKF2.getWind(wind);
break; return true;
#endif #endif
#if HAL_NAVEKF3_AVAILABLE #if HAL_NAVEKF3_AVAILABLE
case EKFType::THREE: case EKFType::THREE:
EKF3.getWind(wind); return EKF3.getWind(wind);
break;
#endif #endif
#if HAL_EXTERNAL_AHRS_ENABLED #if HAL_EXTERNAL_AHRS_ENABLED
case EKFType::EXTERNAL: case EKFType::EXTERNAL:
wind.zero(); return false;
break;
#endif #endif
} }
return wind; return false;
}
Vector3f AP_AHRS::wind_estimate(void) const
{
Vector3f ret;
UNUSED_RESULT(wind_estimate(ret));
return ret;
} }
/* /*

View File

@ -108,7 +108,7 @@ public:
// wind_estimation_enabled returns true if wind estimation is enabled // wind_estimation_enabled returns true if wind estimation is enabled
bool get_wind_estimation_enabled() const { return wind_estimation_enabled; } bool get_wind_estimation_enabled() const { return wind_estimation_enabled; }
// return a wind estimation vector, in m/s // return a wind estimation vector, in m/s; returns 0,0,0 on failure
Vector3f wind_estimate() const; Vector3f wind_estimate() const;
// instruct DCM to update its wind estimate: // instruct DCM to update its wind estimate:
@ -784,6 +784,9 @@ private:
*/ */
bool wind_estimation_enabled; bool wind_estimation_enabled;
// return a wind estimation vector, in m/s
bool wind_estimate(Vector3f &wind) const WARN_IF_UNUSED;
/* /*
* fly_forward is set by the vehicles to indicate the vehicle * fly_forward is set by the vehicles to indicate the vehicle
* should generally be moving in the direction of its heading. * should generally be moving in the direction of its heading.

View File

@ -100,10 +100,10 @@ Vector2f AP_AHRS_DCM::groundspeed_vector(void)
const bool gotAirspeed = airspeed_estimate_true(airspeed); const bool gotAirspeed = airspeed_estimate_true(airspeed);
const bool gotGPS = (AP::gps().status() >= AP_GPS::GPS_OK_FIX_2D); const bool gotGPS = (AP::gps().status() >= AP_GPS::GPS_OK_FIX_2D);
if (gotAirspeed) { if (gotAirspeed) {
const Vector3f wind = wind_estimate();
const Vector2f wind2d(wind.x, wind.y);
const Vector2f airspeed_vector{_cos_yaw * airspeed, _sin_yaw * airspeed}; const Vector2f airspeed_vector{_cos_yaw * airspeed, _sin_yaw * airspeed};
gndVelADS = airspeed_vector + wind2d; Vector3f wind;
UNUSED_RESULT(wind_estimate(wind));
gndVelADS = airspeed_vector + wind.xy();
} }
// Generate estimate of ground speed vector using GPS // Generate estimate of ground speed vector using GPS
@ -148,7 +148,8 @@ Vector2f AP_AHRS_DCM::groundspeed_vector(void)
Vector2f ret{_cos_yaw, _sin_yaw}; Vector2f ret{_cos_yaw, _sin_yaw};
ret *= airspeed; ret *= airspeed;
// adjust for estimated wind // adjust for estimated wind
const Vector3f wind = wind_estimate(); Vector3f wind;
UNUSED_RESULT(wind_estimate(wind));
ret.x += wind.x; ret.x += wind.x;
ret.y += wind.y; ret.y += wind.y;
return ret; return ret;

View File

@ -117,7 +117,7 @@ public:
virtual bool get_hagl(float &height) const WARN_IF_UNUSED { return false; } virtual bool get_hagl(float &height) const WARN_IF_UNUSED { return false; }
// return a wind estimation vector, in m/s // return a wind estimation vector, in m/s
virtual Vector3f wind_estimate(void) const = 0; virtual bool wind_estimate(Vector3f &wind) const = 0;
// return an airspeed estimate if available. return true // return an airspeed estimate if available. return true
// if we have an estimate // if we have an estimate

View File

@ -72,8 +72,9 @@ public:
} }
// return a wind estimation vector, in m/s // return a wind estimation vector, in m/s
Vector3f wind_estimate() const override { bool wind_estimate(Vector3f &wind) const override {
return _wind; wind = _wind;
return true;
} }
// return an airspeed estimate if available. return true // return an airspeed estimate if available. return true

View File

@ -31,13 +31,14 @@ bool AP_AHRS_SIM::get_velocity_NED(Vector3f &vec) const
return true; return true;
} }
Vector3f AP_AHRS_SIM::wind_estimate() const bool AP_AHRS_SIM::wind_estimate(Vector3f &wind) const
{ {
if (_sitl == nullptr) { if (_sitl == nullptr) {
return Vector3f{}; return false;
} }
return _sitl->state.wind_ef; wind = _sitl->state.wind_ef;
return true;
} }
bool AP_AHRS_SIM::airspeed_estimate(float &airspeed_ret) const bool AP_AHRS_SIM::airspeed_estimate(float &airspeed_ret) const

View File

@ -67,7 +67,7 @@ public:
bool get_hagl(float &hagl) const override WARN_IF_UNUSED; bool get_hagl(float &hagl) const override WARN_IF_UNUSED;
// return a wind estimation vector, in m/s // return a wind estimation vector, in m/s
Vector3f wind_estimate() const override; bool wind_estimate(Vector3f &wind) const override;
// return an airspeed estimate if available. return true // return an airspeed estimate if available. return true
// if we have an estimate // if we have an estimate

View File

@ -89,8 +89,8 @@ public:
return ahrs.get_location(loc); return ahrs.get_location(loc);
} }
Vector3f wind_estimate(void) { bool wind_estimate(Vector3f &wind) {
return ahrs.wind_estimate(); return ahrs.wind_estimate(wind);
} }
bool airspeed_estimate(float &airspeed_ret) const WARN_IF_UNUSED { bool airspeed_estimate(float &airspeed_ret) const WARN_IF_UNUSED {