2010-12-28 19:41:00 -04:00
|
|
|
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: t -*-
|
|
|
|
|
|
|
|
/// @file IMU.h
|
|
|
|
/// @brief Abstract class defining the interface to a real or virtual
|
|
|
|
/// Inertial Measurement Unit.
|
|
|
|
|
|
|
|
#ifndef IMU_h
|
|
|
|
#define IMU_h
|
|
|
|
|
2011-04-30 23:05:17 -03:00
|
|
|
#include "../AP_Math/AP_Math.h"
|
2010-12-28 19:41:00 -04:00
|
|
|
#include <inttypes.h>
|
|
|
|
|
|
|
|
class IMU
|
|
|
|
{
|
|
|
|
|
|
|
|
public:
|
|
|
|
/// Constructor
|
|
|
|
IMU() {}
|
2011-02-14 00:42:37 -04:00
|
|
|
|
2010-12-28 19:41:00 -04:00
|
|
|
enum Start_style {
|
|
|
|
COLD_START = 0,
|
|
|
|
WARM_START
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Perform startup initialisation.
|
|
|
|
///
|
2011-02-14 00:42:37 -04:00
|
|
|
/// Called to initialise the state of the IMU.
|
2010-12-28 19:41:00 -04:00
|
|
|
///
|
|
|
|
/// For COLD_START, implementations using real sensors can assume
|
|
|
|
/// that the airframe is stationary and nominally oriented.
|
|
|
|
///
|
|
|
|
/// For WARM_START, no assumptions should be made about the
|
|
|
|
/// orientation or motion of the airframe. Calibration should be
|
|
|
|
/// as for the previous COLD_START call.
|
|
|
|
///
|
|
|
|
/// @param style The initialisation startup style.
|
|
|
|
///
|
2011-07-31 19:34:25 -03:00
|
|
|
virtual void init(Start_style style, void (*callback)(unsigned long t)) = 0;
|
2011-02-14 00:42:37 -04:00
|
|
|
|
|
|
|
/// Perform cold startup initialisation for just the accelerometers.
|
2010-12-28 19:41:00 -04:00
|
|
|
///
|
|
|
|
/// @note This should not be called unless ::init has previously
|
|
|
|
/// been called, as ::init may perform other work.
|
|
|
|
///
|
2011-07-31 19:34:25 -03:00
|
|
|
virtual void init_accel(void (*callback)(unsigned long t)) = 0;
|
2010-12-28 19:41:00 -04:00
|
|
|
|
2011-02-14 00:42:37 -04:00
|
|
|
/// Perform cold-start initialisation for just the gyros.
|
2010-12-28 19:41:00 -04:00
|
|
|
///
|
|
|
|
/// @note This should not be called unless ::init has previously
|
|
|
|
/// been called, as ::init may perform other work
|
|
|
|
///
|
2011-07-31 19:34:25 -03:00
|
|
|
virtual void init_gyro(void (*callback)(unsigned long t)) = 0;
|
2010-12-28 19:41:00 -04:00
|
|
|
|
|
|
|
/// Give the IMU some cycles to perform/fetch an update from its
|
|
|
|
/// sensors.
|
|
|
|
///
|
|
|
|
/// @returns True if some state was updated.
|
|
|
|
///
|
|
|
|
virtual bool update(void) = 0;
|
|
|
|
|
|
|
|
/// Fetch the current gyro values
|
|
|
|
///
|
|
|
|
/// @returns vector of rotational rates in radians/sec
|
2011-02-14 00:42:37 -04:00
|
|
|
///
|
2010-12-28 19:41:00 -04:00
|
|
|
Vector3f get_gyro(void) { return _gyro; }
|
|
|
|
|
|
|
|
/// Fetch the current accelerometer values
|
|
|
|
///
|
|
|
|
/// @returns vector of current accelerations in m/s/s
|
|
|
|
///
|
|
|
|
Vector3f get_accel(void) { return _accel; }
|
|
|
|
|
2011-07-08 00:58:19 -03:00
|
|
|
/// Fetch the current accelerometer values
|
|
|
|
///
|
|
|
|
/// @returns vector of current accelerations in m/s/s
|
|
|
|
///
|
|
|
|
Vector3f get_accel_filtered(void) { return _accel_filtered; }
|
|
|
|
|
2010-12-28 19:41:00 -04:00
|
|
|
/// A count of bad sensor readings
|
|
|
|
///
|
|
|
|
/// @todo This should be renamed, as there's no guarantee that sensors
|
|
|
|
/// are using ADCs, etc.
|
|
|
|
///
|
|
|
|
uint8_t adc_constraints;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/// Most recent accelerometer reading obtained by ::update
|
|
|
|
Vector3f _accel;
|
2011-07-08 00:58:19 -03:00
|
|
|
Vector3f _accel_filtered;
|
2010-12-28 19:41:00 -04:00
|
|
|
|
|
|
|
/// Most recent gyro reading obtained by ::update
|
|
|
|
Vector3f _gyro;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|