GPS: added an acceleration estimate to the GPS driver

This uses the GPS ground speed to estimate acceleration
This commit is contained in:
Andrew Tridgell 2012-03-04 20:33:12 +11:00
parent 7fbfcc2721
commit 57f67ca6e3
2 changed files with 31 additions and 2 deletions

View File

@ -33,6 +33,24 @@ GPS::update(void)
// reset the idle timer // reset the idle timer
_idleTimer = millis(); _idleTimer = millis();
if (_status == GPS_OK) {
// update our acceleration
float deltat = 1.0e-3 * (_idleTimer - _last_fix_time);
float deltav = 1.0e-2 * ((float)ground_speed - (float)_last_ground_speed);
_last_fix_time = _idleTimer;
_last_ground_speed = ground_speed;
if (deltat > 2.0 || deltat == 0) {
// we didn't get a fix for 2 seconds - set
// acceleration to zero, as the estimate will be too
// far out
_acceleration = 0;
} else {
// calculate a mildly smoothed acceleration value
_acceleration = (0.7 * _acceleration) + (0.3 * (deltav/deltat));
}
}
} }
} }

View File

@ -108,7 +108,10 @@ public:
/// 1200ms allows a small amount of slack over the worst-case 1Hz update /// 1200ms allows a small amount of slack over the worst-case 1Hz update
/// rate. /// rate.
/// ///
unsigned long idleTimeout; uint32_t idleTimeout;
// our approximate linear acceleration in m/s/s
float acceleration(void) { return _acceleration; }
protected: protected:
Stream *_port; ///< port the GPS is attached to Stream *_port; ///< port the GPS is attached to
@ -165,11 +168,19 @@ private:
/// Last time that the GPS driver got a good packet from the GPS /// Last time that the GPS driver got a good packet from the GPS
/// ///
unsigned long _idleTimer; uint32_t _idleTimer;
/// Our current status /// Our current status
GPS_Status _status; GPS_Status _status;
// the time we got our last fix in system milliseconds
uint32_t _last_fix_time;
// previous ground speed in cm/s
uint32_t _last_ground_speed;
// smoothed estimate of our acceleration
float _acceleration;
}; };
inline long inline long