Subversion Repositories FlightCtrl

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2189 - 1
#ifndef AP_AHRS_DCM_H
2
#define AP_AHRS_DCM_H
3
/*
4
  DCM based AHRS (Attitude Heading Reference System) interface for
5
  ArduPilot
6
 
7
  This library is free software; you can redistribute it and/or
8
  modify it under the terms of the GNU Lesser General Public
9
  License as published by the Free Software Foundation; either
10
  version 2.1 of the License, or (at your option) any later version.
11
*/
12
#include "AP_AHRS.h"
13
#include "GPS.h"
14
#include "Constants.h"
15
 
16
class AP_AHRS_DCM : public AP_AHRS {
17
public:
18
        // Constructors
19
        AP_AHRS_DCM(GPS *&gps) : AP_AHRS(gps) {
20
                _kp_roll_pitch = 0.13;
21
                _kp_yaw        = 0.2;
22
                _dcm_matrix(Vector3f(1, 0, 0),
23
                            Vector3f(0, 1, 0),
24
                            Vector3f(0, 0, 1));
25
 
26
                // base the ki values on the sensors drift rate
27
                _ki_roll_pitch = _gyro_drift_limit * 5;
28
                _ki_yaw        = _gyro_drift_limit * 8;
29
                _compass = NULL;
30
        }
31
 
32
        // return the smoothed gyro vector corrected for drift
33
        Vector3f        get_gyro(void) {return _omega; }
34
        Matrix3f        get_dcm_matrix(void) {return _dcm_matrix; }
35
 
36
        // return the current drift correction integrator value
37
        Vector3f        get_gyro_drift(void) {return _omega_I; }
38
 
39
        // Methods
40
        void            update(int16_t attitude[3], float delta_t);
41
        void            reset(bool recover_eulers = false);
42
 
43
        // status reporting
44
        float           get_error_rp(void);
45
        float           get_error_yaw(void);
46
 
47
        float           _kp_yaw;
48
 
49
private:
50
        float           _kp_roll_pitch;
51
        float           _ki_roll_pitch;
52
        float           _ki_yaw;
53
        bool            _have_initial_yaw;
54
 
55
        // Methods
56
        void            accel_adjust(Vector3f &accel);
57
        void            matrix_update(float _G_Dt);
58
        void            normalize(void);
59
        void            check_matrix(void);
60
        bool            renorm(Vector3f const &a, Vector3f &result);
61
        void            drift_correction(float deltat);
62
        void            euler_angles(void);
63
 
64
        // primary representation of attitude
65
        Matrix3f        _dcm_matrix;
66
 
67
        Vector3f        _gyro_vector;           // Store the gyros turn rate in a vector
68
        Vector3f        _accel_vector;          // current accel vector
69
 
70
        Vector3f        _omega_P;               // accel Omega Proportional correction
71
        Vector3f        _omega_yaw_P;           // yaw Omega Proportional correction
72
        Vector3f        _omega_I;               // Omega Integrator correction
73
        Vector3f        _omega_I_sum;           // summation vector for omegaI
74
        float           _omega_I_sum_time;
75
        Vector3f        _omega_integ_corr;      // Partially corrected Gyro_Vector data - used for centrepetal correction
76
        Vector3f        _omega;                 // Corrected Gyro_Vector data
77
 
78
        // state to support status reporting
79
        float           _renorm_val_sum;
80
        uint16_t        _renorm_val_count;
81
        float           _error_rp_sum;
82
        uint16_t        _error_rp_count;
83
        float           _error_rp_last;
84
        float           _error_yaw_sum;
85
        uint16_t        _error_yaw_count;
86
        float           _error_yaw_last;
87
 
88
        // time in millis when we last got a GPS heading
89
        uint32_t        _gps_last_update;
90
};
91
 
92
#endif // AP_AHRS_DCM_H