mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-22 07:44:03 -04:00
AP_InertialNav: implement InertialNav in terms of AHRS when available
This commit is contained in:
parent
5d43a1d704
commit
47f541e143
@ -34,7 +34,7 @@ class AP_InertialNav
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
AP_InertialNav( const AP_AHRS &ahrs, AP_Baro &baro, GPS*& gps, GPS_Glitch& gps_glitch ) :
|
AP_InertialNav(AP_AHRS &ahrs, AP_Baro &baro, GPS*& gps, GPS_Glitch& gps_glitch ) :
|
||||||
_ahrs(ahrs),
|
_ahrs(ahrs),
|
||||||
_baro(baro),
|
_baro(baro),
|
||||||
_gps(gps),
|
_gps(gps),
|
||||||
@ -52,7 +52,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* initializes the object.
|
* initializes the object.
|
||||||
*/
|
*/
|
||||||
void init();
|
virtual void init();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update - updates velocity and position estimates using latest info from accelerometers
|
* update - updates velocity and position estimates using latest info from accelerometers
|
||||||
@ -60,7 +60,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @param dt : time since last update in seconds
|
* @param dt : time since last update in seconds
|
||||||
*/
|
*/
|
||||||
void update(float dt);
|
virtual void update(float dt);
|
||||||
|
|
||||||
//
|
//
|
||||||
// XY Axis specific methods
|
// XY Axis specific methods
|
||||||
@ -80,7 +80,7 @@ public:
|
|||||||
* position_ok - true if inertial based altitude and position can be trusted
|
* position_ok - true if inertial based altitude and position can be trusted
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool position_ok() const;
|
virtual bool position_ok() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check_gps - checks if new gps readings have arrived and calls correct_with_gps to
|
* check_gps - checks if new gps readings have arrived and calls correct_with_gps to
|
||||||
@ -103,33 +103,33 @@ public:
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
const Vector3f& get_position() const { return _position; }
|
virtual const Vector3f& get_position() const { return _position; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_latitude - returns the latitude of the current position estimation in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
* get_latitude - returns the latitude of the current position estimation in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t get_latitude() const;
|
virtual int32_t get_latitude() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_longitude - returns the longitude of the current position estimation in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
* get_longitude - returns the longitude of the current position estimation in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t get_longitude() const;
|
virtual int32_t get_longitude() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_latitude_diff - returns the current latitude difference from the home location.
|
* get_latitude_diff - returns the current latitude difference from the home location.
|
||||||
*
|
*
|
||||||
* @return difference in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
* @return difference in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
||||||
*/
|
*/
|
||||||
float get_latitude_diff() const;
|
virtual float get_latitude_diff() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_longitude_diff - returns the current longitude difference from the home location.
|
* get_longitude_diff - returns the current longitude difference from the home location.
|
||||||
*
|
*
|
||||||
* @return difference in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
* @return difference in 100 nano degrees (i.e. degree value multiplied by 10,000,000)
|
||||||
*/
|
*/
|
||||||
float get_longitude_diff() const;
|
virtual float get_longitude_diff() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_velocity - returns the current velocity in cm/s
|
* get_velocity - returns the current velocity in cm/s
|
||||||
@ -139,14 +139,14 @@ public:
|
|||||||
* .y : longitude velocity in cm/s
|
* .y : longitude velocity in cm/s
|
||||||
* .z : vertical velocity in cm/s
|
* .z : vertical velocity in cm/s
|
||||||
*/
|
*/
|
||||||
const Vector3f& get_velocity() const { return _velocity; }
|
virtual const Vector3f& get_velocity() const { return _velocity; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_velocity_xy - returns the current horizontal velocity in cm/s
|
* get_velocity_xy - returns the current horizontal velocity in cm/s
|
||||||
*
|
*
|
||||||
* @returns the current horizontal velocity in cm/s
|
* @returns the current horizontal velocity in cm/s
|
||||||
*/
|
*/
|
||||||
float get_velocity_xy();
|
virtual float get_velocity_xy();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set_velocity_xy - overwrites the current horizontal velocity in cm/s
|
* set_velocity_xy - overwrites the current horizontal velocity in cm/s
|
||||||
@ -179,7 +179,7 @@ public:
|
|||||||
* altitude_ok - returns true if inertial based altitude and position can be trusted
|
* altitude_ok - returns true if inertial based altitude and position can be trusted
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool altitude_ok() const { return true; }
|
virtual bool altitude_ok() const { return true; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check_baro - checks if new baro readings have arrived and calls correct_with_baro to
|
* check_baro - checks if new baro readings have arrived and calls correct_with_baro to
|
||||||
@ -198,10 +198,11 @@ public:
|
|||||||
void correct_with_baro(float baro_alt, float dt);
|
void correct_with_baro(float baro_alt, float dt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_altitude - get latest altitude estimate in cm
|
* get_altitude - get latest altitude estimate in cm above the
|
||||||
|
* reference position
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
float get_altitude() const { return _position.z; }
|
virtual float get_altitude() const { return _position.z; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set_altitude - overwrites the current altitude value.
|
* set_altitude - overwrites the current altitude value.
|
||||||
@ -215,9 +216,9 @@ public:
|
|||||||
*
|
*
|
||||||
* @see get_velocity().z
|
* @see get_velocity().z
|
||||||
*
|
*
|
||||||
* @return climbrate in cm/s
|
* @return climbrate in cm/s (positive up)
|
||||||
*/
|
*/
|
||||||
float get_velocity_z() const { return _velocity.z; }
|
virtual float get_velocity_z() const { return _velocity.z; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set_velocity_z - overwrites the current climbrate.
|
* set_velocity_z - overwrites the current climbrate.
|
||||||
@ -229,7 +230,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* error_count - returns number of missed updates from GPS
|
* error_count - returns number of missed updates from GPS
|
||||||
*/
|
*/
|
||||||
uint8_t error_count() const { return _error_count; }
|
virtual uint8_t error_count() const { return _error_count; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ignore_next_error - the next error (if it occurs immediately) will not be added to the error count
|
* ignore_next_error - the next error (if it occurs immediately) will not be added to the error count
|
||||||
@ -270,7 +271,7 @@ protected:
|
|||||||
uint8_t ignore_error : 3; // the number of iterations for which we should ignore errors
|
uint8_t ignore_error : 3; // the number of iterations for which we should ignore errors
|
||||||
} _flags;
|
} _flags;
|
||||||
|
|
||||||
const AP_AHRS &_ahrs; // reference to ahrs object
|
AP_AHRS &_ahrs; // reference to ahrs object
|
||||||
AP_Baro &_baro; // reference to barometer
|
AP_Baro &_baro; // reference to barometer
|
||||||
GPS*& _gps; // pointer to gps
|
GPS*& _gps; // pointer to gps
|
||||||
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
#include <AP_HAL.h>
|
||||||
#include "AP_InertialNav.h"
|
#include "AP_InertialNav.h"
|
||||||
|
|
||||||
|
extern const AP_HAL::HAL& hal;
|
||||||
|
|
||||||
#if AP_AHRS_NAVEKF_AVAILABLE
|
#if AP_AHRS_NAVEKF_AVAILABLE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -18,12 +21,30 @@ void AP_InertialNav_NavEKF::init()
|
|||||||
AP_InertialNav::init();
|
AP_InertialNav::init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
update internal state
|
||||||
|
*/
|
||||||
|
void AP_InertialNav_NavEKF::update(float dt)
|
||||||
|
{
|
||||||
|
AP_InertialNav::update(dt);
|
||||||
|
_relpos_cm = _ahrs.get_relative_position_NED() * 100;
|
||||||
|
_haveabspos = _ahrs.get_position(_abspos);
|
||||||
|
_velocity_cm = _ahrs.get_velocity_NED() * 100;
|
||||||
|
|
||||||
|
// InertialNav is NEU
|
||||||
|
_relpos_cm.z = - _relpos_cm.z;
|
||||||
|
_velocity_cm.z = -_velocity_cm.z;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* position_ok - true if inertial based altitude and position can be trusted
|
* position_ok - true if inertial based altitude and position can be trusted
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool AP_InertialNav_NavEKF::position_ok() const
|
bool AP_InertialNav_NavEKF::position_ok() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav() && _haveabspos) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return AP_InertialNav::position_ok();
|
return AP_InertialNav::position_ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,6 +57,9 @@ bool AP_InertialNav_NavEKF::position_ok() const
|
|||||||
*/
|
*/
|
||||||
const Vector3f &AP_InertialNav_NavEKF::get_position(void) const
|
const Vector3f &AP_InertialNav_NavEKF::get_position(void) const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return _relpos_cm;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_position();
|
return AP_InertialNav::get_position();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +68,9 @@ const Vector3f &AP_InertialNav_NavEKF::get_position(void) const
|
|||||||
*/
|
*/
|
||||||
int32_t AP_InertialNav_NavEKF::get_latitude() const
|
int32_t AP_InertialNav_NavEKF::get_latitude() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav() && _haveabspos) {
|
||||||
|
return _abspos.lat;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_latitude();
|
return AP_InertialNav::get_latitude();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +80,9 @@ int32_t AP_InertialNav_NavEKF::get_latitude() const
|
|||||||
*/
|
*/
|
||||||
int32_t AP_InertialNav_NavEKF::get_longitude() const
|
int32_t AP_InertialNav_NavEKF::get_longitude() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav() && _haveabspos) {
|
||||||
|
return _abspos.lng;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_longitude();
|
return AP_InertialNav::get_longitude();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +93,9 @@ int32_t AP_InertialNav_NavEKF::get_longitude() const
|
|||||||
*/
|
*/
|
||||||
float AP_InertialNav_NavEKF::get_latitude_diff() const
|
float AP_InertialNav_NavEKF::get_latitude_diff() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return _relpos_cm.x / LATLON_TO_CM;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_latitude_diff();
|
return AP_InertialNav::get_latitude_diff();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,6 +106,9 @@ float AP_InertialNav_NavEKF::get_latitude_diff() const
|
|||||||
*/
|
*/
|
||||||
float AP_InertialNav_NavEKF::get_longitude_diff() const
|
float AP_InertialNav_NavEKF::get_longitude_diff() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return _relpos_cm.y / _lon_to_cm_scaling;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_longitude_diff();
|
return AP_InertialNav::get_longitude_diff();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +122,9 @@ float AP_InertialNav_NavEKF::get_longitude_diff() const
|
|||||||
*/
|
*/
|
||||||
const Vector3f &AP_InertialNav_NavEKF::get_velocity() const
|
const Vector3f &AP_InertialNav_NavEKF::get_velocity() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return _velocity_cm;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_velocity();
|
return AP_InertialNav::get_velocity();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,6 +135,9 @@ const Vector3f &AP_InertialNav_NavEKF::get_velocity() const
|
|||||||
*/
|
*/
|
||||||
float AP_InertialNav_NavEKF::get_velocity_xy()
|
float AP_InertialNav_NavEKF::get_velocity_xy()
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return pythagorous2(_velocity_cm.x, _velocity_cm.y);
|
||||||
|
}
|
||||||
return AP_InertialNav::get_velocity_xy();
|
return AP_InertialNav::get_velocity_xy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +147,9 @@ float AP_InertialNav_NavEKF::get_velocity_xy()
|
|||||||
*/
|
*/
|
||||||
bool AP_InertialNav_NavEKF::altitude_ok() const
|
bool AP_InertialNav_NavEKF::altitude_ok() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav() && _haveabspos) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return AP_InertialNav::altitude_ok();
|
return AP_InertialNav::altitude_ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,6 +159,9 @@ bool AP_InertialNav_NavEKF::altitude_ok() const
|
|||||||
*/
|
*/
|
||||||
float AP_InertialNav_NavEKF::get_altitude() const
|
float AP_InertialNav_NavEKF::get_altitude() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return _relpos_cm.z;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_altitude();
|
return AP_InertialNav::get_altitude();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +174,9 @@ float AP_InertialNav_NavEKF::get_altitude() const
|
|||||||
*/
|
*/
|
||||||
float AP_InertialNav_NavEKF::get_velocity_z() const
|
float AP_InertialNav_NavEKF::get_velocity_z() const
|
||||||
{
|
{
|
||||||
|
if (_ahrs.have_inertial_nav()) {
|
||||||
|
return _velocity_cm.z;
|
||||||
|
}
|
||||||
return AP_InertialNav::get_velocity_z();
|
return AP_InertialNav::get_velocity_z();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ class AP_InertialNav_NavEKF : public AP_InertialNav
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Constructor
|
// Constructor
|
||||||
AP_InertialNav_NavEKF(const AP_AHRS &ahrs, AP_Baro &baro, GPS*& gps, GPS_Glitch& gps_glitch ) :
|
AP_InertialNav_NavEKF(AP_AHRS &ahrs, AP_Baro &baro, GPS*& gps, GPS_Glitch& gps_glitch ) :
|
||||||
AP_InertialNav(ahrs, baro, gps, gps_glitch)
|
AP_InertialNav(ahrs, baro, gps, gps_glitch)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -24,6 +24,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
|
/**
|
||||||
|
update internal state
|
||||||
|
*/
|
||||||
|
void update(float dt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* position_ok - true if inertial based altitude and position can be trusted
|
* position_ok - true if inertial based altitude and position can be trusted
|
||||||
* @return
|
* @return
|
||||||
@ -101,6 +106,12 @@ public:
|
|||||||
* @return climbrate in cm/s
|
* @return climbrate in cm/s
|
||||||
*/
|
*/
|
||||||
float get_velocity_z() const;
|
float get_velocity_z() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Vector3f _relpos_cm; // NEU
|
||||||
|
Vector3f _velocity_cm; // NEU
|
||||||
|
struct Location _abspos;
|
||||||
|
bool _haveabspos;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __AP_INERTIALNAV_NAVEKF_H__
|
#endif // __AP_INERTIALNAV_NAVEKF_H__
|
||||||
|
Loading…
Reference in New Issue
Block a user