2015-11-19 13:08:04 -04:00
|
|
|
/****************************************************************************
|
|
|
|
*
|
2015-12-06 07:57:43 -04:00
|
|
|
* Copyright (c) 2015 Estimation and Control Library (ECL). All rights reserved.
|
2015-11-19 13:08:04 -04:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
* 3. Neither the name ECL nor the names of its contributors may be
|
|
|
|
* used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file ekf.h
|
2015-12-06 07:57:43 -04:00
|
|
|
* Class for core functions for ekf attitude and position estimator.
|
2015-11-19 13:08:04 -04:00
|
|
|
*
|
2015-12-06 07:57:43 -04:00
|
|
|
* @author Roman Bast <bapstroman@gmail.com>
|
2015-11-19 13:08:04 -04:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "estimator_base.h"
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
#define sq(_arg) powf(_arg, 2.0f)
|
|
|
|
|
2015-11-19 13:08:04 -04:00
|
|
|
class Ekf : public EstimatorBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
Ekf();
|
|
|
|
~Ekf();
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
bool update();
|
2015-11-19 13:08:04 -04:00
|
|
|
|
|
|
|
private:
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
static const uint8_t _k_num_states = 24;
|
|
|
|
static constexpr float _k_earth_rate = 0.000072921f;
|
|
|
|
|
2015-11-19 13:08:04 -04:00
|
|
|
bool _filter_initialised;
|
2015-12-07 04:26:30 -04:00
|
|
|
bool _earth_rate_initialised;
|
2015-11-19 13:08:04 -04:00
|
|
|
|
|
|
|
bool _fuse_height; // true if there is new baro data
|
|
|
|
bool _fuse_pos; // true if there is new position data from gps
|
|
|
|
bool _fuse_vel; // true if there is new velocity data from gps
|
|
|
|
|
2015-12-10 04:07:00 -04:00
|
|
|
uint8_t _mag_fuse_index; // counter for sequential mag axis fusion
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
Vector3f _earth_rate_NED;
|
|
|
|
|
|
|
|
matrix::Dcm<float> _R_prev;
|
|
|
|
|
|
|
|
float P[_k_num_states][_k_num_states]; // state covariance matrix
|
2015-12-06 07:57:43 -04:00
|
|
|
|
2015-12-10 11:36:10 -04:00
|
|
|
// complementary filter states
|
|
|
|
Vector3f _delta_angle_corr;
|
|
|
|
Vector3f _delta_vel_corr;
|
|
|
|
Vector3f _vel_corr;
|
|
|
|
|
|
|
|
void calculateOutputStates();
|
|
|
|
|
2015-11-19 13:08:04 -04:00
|
|
|
bool initialiseFilter(void);
|
|
|
|
|
2015-12-06 07:57:43 -04:00
|
|
|
void initialiseCovariance();
|
|
|
|
|
2015-11-19 13:08:04 -04:00
|
|
|
void predictState();
|
|
|
|
|
|
|
|
void predictCovariance();
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
void fuseMag(uint8_t index);
|
2015-11-19 13:08:04 -04:00
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
void fuseHeading();
|
2015-11-19 13:08:04 -04:00
|
|
|
|
|
|
|
void fuseAirspeed();
|
|
|
|
|
|
|
|
void fuseRange();
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
void fuseVelPosHeight();
|
|
|
|
|
2015-12-06 07:57:43 -04:00
|
|
|
void resetVelocity();
|
|
|
|
|
|
|
|
void resetPosition();
|
|
|
|
|
2015-12-07 04:26:30 -04:00
|
|
|
void makeCovSymetrical();
|
|
|
|
|
|
|
|
void limitCov();
|
|
|
|
|
|
|
|
void printCovToFile(char const *filename);
|
|
|
|
|
|
|
|
void assertCovNiceness();
|
|
|
|
|
|
|
|
void makeSymmetrical();
|
|
|
|
|
|
|
|
void constrainStates();
|
|
|
|
|
|
|
|
void fuse(float *K, float innovation);
|
|
|
|
|
|
|
|
void printStates();
|
|
|
|
|
2015-12-10 11:36:10 -04:00
|
|
|
void printStatesFast();
|
2015-12-07 04:26:30 -04:00
|
|
|
|
2015-12-10 11:36:10 -04:00
|
|
|
void calcEarthRateNED(Vector3f &omega, double lat_rad) const;
|
2015-11-19 13:08:04 -04:00
|
|
|
|
2015-12-06 07:57:43 -04:00
|
|
|
};
|