mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-22 00:28:30 -04:00
AP_AHRS: move AP_AHRS_DCM::groundspeed_vector into correct file
This commit is contained in:
parent
b44682d1a6
commit
8e57d66a0d
@ -90,74 +90,6 @@ void AP_AHRS::update_orientation()
|
||||
AP::compass().set_board_orientation(orientation);
|
||||
}
|
||||
|
||||
// return a ground speed estimate in m/s
|
||||
Vector2f AP_AHRS_DCM::groundspeed_vector(void)
|
||||
{
|
||||
// Generate estimate of ground speed vector using air data system
|
||||
Vector2f gndVelADS;
|
||||
Vector2f gndVelGPS;
|
||||
float airspeed = 0;
|
||||
const bool gotAirspeed = airspeed_estimate_true(airspeed);
|
||||
const bool gotGPS = (AP::gps().status() >= AP_GPS::GPS_OK_FIX_2D);
|
||||
if (gotAirspeed) {
|
||||
const Vector2f airspeed_vector{_cos_yaw * airspeed, _sin_yaw * airspeed};
|
||||
Vector3f wind;
|
||||
UNUSED_RESULT(wind_estimate(wind));
|
||||
gndVelADS = airspeed_vector + wind.xy();
|
||||
}
|
||||
|
||||
// Generate estimate of ground speed vector using GPS
|
||||
if (gotGPS) {
|
||||
const float cog = radians(AP::gps().ground_course());
|
||||
gndVelGPS = Vector2f(cosf(cog), sinf(cog)) * AP::gps().ground_speed();
|
||||
}
|
||||
// If both ADS and GPS data is available, apply a complementary filter
|
||||
if (gotAirspeed && gotGPS) {
|
||||
// The LPF is applied to the GPS and the HPF is applied to the air data estimate
|
||||
// before the two are summed
|
||||
//Define filter coefficients
|
||||
// alpha and beta must sum to one
|
||||
// beta = dt/Tau, where
|
||||
// dt = filter time step (0.1 sec if called by nav loop)
|
||||
// Tau = cross-over time constant (nominal 2 seconds)
|
||||
// More lag on GPS requires Tau to be bigger, less lag allows it to be smaller
|
||||
// To-Do - set Tau as a function of GPS lag.
|
||||
const float alpha = 1.0f - beta;
|
||||
// Run LP filters
|
||||
_lp = gndVelGPS * beta + _lp * alpha;
|
||||
// Run HP filters
|
||||
_hp = (gndVelADS - _lastGndVelADS) + _hp * alpha;
|
||||
// Save the current ADS ground vector for the next time step
|
||||
_lastGndVelADS = gndVelADS;
|
||||
// Sum the HP and LP filter outputs
|
||||
return _hp + _lp;
|
||||
}
|
||||
// Only ADS data is available return ADS estimate
|
||||
if (gotAirspeed && !gotGPS) {
|
||||
return gndVelADS;
|
||||
}
|
||||
// Only GPS data is available so return GPS estimate
|
||||
if (!gotAirspeed && gotGPS) {
|
||||
return gndVelGPS;
|
||||
}
|
||||
|
||||
if (airspeed > 0) {
|
||||
// we have a rough airspeed, and we have a yaw. For
|
||||
// dead-reckoning purposes we can create a estimated
|
||||
// groundspeed vector
|
||||
Vector2f ret{_cos_yaw, _sin_yaw};
|
||||
ret *= airspeed;
|
||||
// adjust for estimated wind
|
||||
Vector3f wind;
|
||||
UNUSED_RESULT(wind_estimate(wind));
|
||||
ret.x += wind.x;
|
||||
ret.y += wind.y;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return Vector2f(0.0f, 0.0f);
|
||||
}
|
||||
|
||||
/*
|
||||
calculate sin and cos of roll/pitch/yaw from a body_to_ned rotation matrix
|
||||
*/
|
||||
|
@ -1127,6 +1127,74 @@ bool AP_AHRS_DCM::get_velocity_NED(Vector3f &vec) const
|
||||
return true;
|
||||
}
|
||||
|
||||
// return a ground speed estimate in m/s
|
||||
Vector2f AP_AHRS_DCM::groundspeed_vector(void)
|
||||
{
|
||||
// Generate estimate of ground speed vector using air data system
|
||||
Vector2f gndVelADS;
|
||||
Vector2f gndVelGPS;
|
||||
float airspeed = 0;
|
||||
const bool gotAirspeed = airspeed_estimate_true(airspeed);
|
||||
const bool gotGPS = (AP::gps().status() >= AP_GPS::GPS_OK_FIX_2D);
|
||||
if (gotAirspeed) {
|
||||
const Vector2f airspeed_vector{_cos_yaw * airspeed, _sin_yaw * airspeed};
|
||||
Vector3f wind;
|
||||
UNUSED_RESULT(wind_estimate(wind));
|
||||
gndVelADS = airspeed_vector + wind.xy();
|
||||
}
|
||||
|
||||
// Generate estimate of ground speed vector using GPS
|
||||
if (gotGPS) {
|
||||
const float cog = radians(AP::gps().ground_course());
|
||||
gndVelGPS = Vector2f(cosf(cog), sinf(cog)) * AP::gps().ground_speed();
|
||||
}
|
||||
// If both ADS and GPS data is available, apply a complementary filter
|
||||
if (gotAirspeed && gotGPS) {
|
||||
// The LPF is applied to the GPS and the HPF is applied to the air data estimate
|
||||
// before the two are summed
|
||||
//Define filter coefficients
|
||||
// alpha and beta must sum to one
|
||||
// beta = dt/Tau, where
|
||||
// dt = filter time step (0.1 sec if called by nav loop)
|
||||
// Tau = cross-over time constant (nominal 2 seconds)
|
||||
// More lag on GPS requires Tau to be bigger, less lag allows it to be smaller
|
||||
// To-Do - set Tau as a function of GPS lag.
|
||||
const float alpha = 1.0f - beta;
|
||||
// Run LP filters
|
||||
_lp = gndVelGPS * beta + _lp * alpha;
|
||||
// Run HP filters
|
||||
_hp = (gndVelADS - _lastGndVelADS) + _hp * alpha;
|
||||
// Save the current ADS ground vector for the next time step
|
||||
_lastGndVelADS = gndVelADS;
|
||||
// Sum the HP and LP filter outputs
|
||||
return _hp + _lp;
|
||||
}
|
||||
// Only ADS data is available return ADS estimate
|
||||
if (gotAirspeed && !gotGPS) {
|
||||
return gndVelADS;
|
||||
}
|
||||
// Only GPS data is available so return GPS estimate
|
||||
if (!gotAirspeed && gotGPS) {
|
||||
return gndVelGPS;
|
||||
}
|
||||
|
||||
if (airspeed > 0) {
|
||||
// we have a rough airspeed, and we have a yaw. For
|
||||
// dead-reckoning purposes we can create a estimated
|
||||
// groundspeed vector
|
||||
Vector2f ret{_cos_yaw, _sin_yaw};
|
||||
ret *= airspeed;
|
||||
// adjust for estimated wind
|
||||
Vector3f wind;
|
||||
UNUSED_RESULT(wind_estimate(wind));
|
||||
ret.x += wind.x;
|
||||
ret.y += wind.y;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return Vector2f(0.0f, 0.0f);
|
||||
}
|
||||
|
||||
// Get a derivative of the vertical position in m/s which is kinematically consistent with the vertical position is required by some control loops.
|
||||
// This is different to the vertical velocity from the EKF which is not always consistent with the vertical position due to the various errors that are being corrected for.
|
||||
bool AP_AHRS_DCM::get_vert_pos_rate_D(float &velocity) const
|
||||
|
Loading…
Reference in New Issue
Block a user