complementary_filter.h
Go to the documentation of this file.
1 /*
2  @author Roberto G. Valenti <robertogl.valenti@gmail.com>
3 
4  @section LICENSE
5  Copyright (c) 2015, City University of New York
6  CCNY Robotics Lab <http://robotics.ccny.cuny.edu>
7  All rights reserved.
8 
9  Redistribution and use in source and binary forms, with or without
10  modification, are permitted provided that the following conditions are met:
11  1. Redistributions of source code must retain the above copyright
12  notice, this list of conditions and the following disclaimer.
13  2. Redistributions in binary form must reproduce the above copyright
14  notice, this list of conditions and the following disclaimer in the
15  documentation and/or other materials provided with the distribution.
16  3. Neither the name of the City College of New York nor the
17  names of its contributors may be used to endorse or promote products
18  derived from this software without specific prior written permission.
19 
20  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23  DISCLAIMED. IN NO EVENT SHALL the CCNY ROBOTICS LAB BE LIABLE FOR ANY
24  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31 
32 #ifndef IMU_TOOLS_COMPLEMENTARY_FILTER_H
33 #define IMU_TOOLS_COMPLEMENTARY_FILTER_H
34 
35 namespace imu_tools {
36 
38 {
39  public:
41  virtual ~ComplementaryFilter();
42 
43  bool setGainAcc(double gain);
44  bool setGainMag(double gain);
45  double getGainAcc() const;
46  double getGainMag() const;
47 
48  bool setBiasAlpha(double bias_alpha);
49  double getBiasAlpha() const;
50 
51  // When the filter is in the steady state, bias estimation will occur (if the
52  // parameter is enabled).
53  bool getSteadyState() const;
54 
55  void setDoBiasEstimation(bool do_bias_estimation);
56  bool getDoBiasEstimation() const;
57 
58  void setDoAdaptiveGain(bool do_adaptive_gain);
59  bool getDoAdaptiveGain() const;
60 
61  double getAngularVelocityBiasX() const;
62  double getAngularVelocityBiasY() const;
63  double getAngularVelocityBiasZ() const;
64 
65  // Set the orientation, as a Hamilton Quaternion, of the body frame wrt the
66  // fixed frame.
67  void setOrientation(double q0, double q1, double q2, double q3);
68 
69  // Get the orientation, as a Hamilton Quaternion, of the body frame wrt the
70  // fixed frame.
71  void getOrientation(double& q0, double& q1, double& q2, double& q3) const;
72 
73  // Update from accelerometer and gyroscope data.
74  // [ax, ay, az]: Normalized gravity vector.
75  // [wx, wy, wz]: Angular veloctiy, in rad / s.
76  // dt: time delta, in seconds.
77  void update(double ax, double ay, double az,
78  double wx, double wy, double wz,
79  double dt);
80 
81  // Update from accelerometer, gyroscope, and magnetometer data.
82  // [ax, ay, az]: Normalized gravity vector.
83  // [wx, wy, wz]: Angular veloctiy, in rad / s.
84  // [mx, my, mz]: Magnetic field, units irrelevant.
85  // dt: time delta, in seconds.
86  void update(double ax, double ay, double az,
87  double wx, double wy, double wz,
88  double mx, double my, double mz,
89  double dt);
90 
91  private:
92  static const double kGravity;
93  static const double gamma_;
94  // Bias estimation steady state thresholds
95  static const double kAngularVelocityThreshold;
96  static const double kAccelerationThreshold;
97  static const double kDeltaAngularVelocityThreshold;
98 
99  // Gain parameter for the complementary filter, belongs in [0, 1].
100  double gain_acc_;
101  double gain_mag_;
102 
103  // Bias estimation gain parameter, belongs in [0, 1].
104  double bias_alpha_;
105 
106  // Parameter whether to do bias estimation or not.
108 
109  // Parameter whether to do adaptive gain or not.
111 
114 
115  // The orientation as a Hamilton quaternion (q0 is the scalar). Represents
116  // the orientation of the fixed frame wrt the body frame.
117  double q0_, q1_, q2_, q3_;
118 
119  // Bias in angular velocities;
121 
122  // Bias in angular velocities;
124 
125  void updateBiases(double ax, double ay, double az,
126  double wx, double wy, double wz);
127 
128  bool checkState(double ax, double ay, double az,
129  double wx, double wy, double wz) const;
130 
131  void getPrediction(
132  double wx, double wy, double wz, double dt,
133  double& q0_pred, double& q1_pred, double& q2_pred, double& q3_pred) const;
134 
135  void getMeasurement(
136  double ax, double ay, double az,
137  double& q0_meas, double& q1_meas, double& q2_meas, double& q3_meas);
138 
139  void getMeasurement(
140  double ax, double ay, double az,
141  double mx, double my, double mz,
142  double& q0_meas, double& q1_meas, double& q2_meas, double& q3_meas);
143 
144  void getAccCorrection(
145  double ax, double ay, double az,
146  double p0, double p1, double p2, double p3,
147  double& dq0, double& dq1, double& dq2, double& dq3);
148 
149  void getMagCorrection(
150  double mx, double my, double mz,
151  double p0, double p1, double p2, double p3,
152  double& dq0, double& dq1, double& dq2, double& dq3);
153 
154  double getAdaptiveGain(double alpha, double ax, double ay, double az);
155 };
156 
157 // Utility math functions:
158 
159 void normalizeVector(double& x, double& y, double& z);
160 
161 void normalizeQuaternion(double& q0, double& q1, double& q2, double& q3);
162 
163 void scaleQuaternion(double gain,
164  double& dq0, double& dq1, double& dq2, double& dq3);
165 
166 void invertQuaternion(
167  double q0, double q1, double q2, double q3,
168  double& q0_inv, double& q1_inv, double& q2_inv, double& q3_inv);
169 
170 void quaternionMultiplication(double p0, double p1, double p2, double p3,
171  double q0, double q1, double q2, double q3,
172  double& r0, double& r1, double& r2, double& r3);
173 
174 void rotateVectorByQuaternion(double x, double y, double z,
175  double q0, double q1, double q2, double q3,
176  double& vx, double& vy, double& vz);
177 
178 } // namespace imu
179 
180 #endif // IMU_TOOLS_COMPLEMENTARY_FILTER_H
void setOrientation(double q0, double q1, double q2, double q3)
void setDoAdaptiveGain(bool do_adaptive_gain)
void rotateVectorByQuaternion(double x, double y, double z, double q0, double q1, double q2, double q3, double &vx, double &vy, double &vz)
static const double kAngularVelocityThreshold
bool setBiasAlpha(double bias_alpha)
void updateBiases(double ax, double ay, double az, double wx, double wy, double wz)
void normalizeQuaternion(double &q0, double &q1, double &q2, double &q3)
void quaternionMultiplication(double p0, double p1, double p2, double p3, double q0, double q1, double q2, double q3, double &r0, double &r1, double &r2, double &r3)
void normalizeVector(double &x, double &y, double &z)
double getAdaptiveGain(double alpha, double ax, double ay, double az)
void getOrientation(double &q0, double &q1, double &q2, double &q3) const
void setDoBiasEstimation(bool do_bias_estimation)
static const double kDeltaAngularVelocityThreshold
void getMeasurement(double ax, double ay, double az, double &q0_meas, double &q1_meas, double &q2_meas, double &q3_meas)
void scaleQuaternion(double gain, double &dq0, double &dq1, double &dq2, double &dq3)
void update(double ax, double ay, double az, double wx, double wy, double wz, double dt)
bool checkState(double ax, double ay, double az, double wx, double wy, double wz) const
void getAccCorrection(double ax, double ay, double az, double p0, double p1, double p2, double p3, double &dq0, double &dq1, double &dq2, double &dq3)
void getPrediction(double wx, double wy, double wz, double dt, double &q0_pred, double &q1_pred, double &q2_pred, double &q3_pred) const
void getMagCorrection(double mx, double my, double mz, double p0, double p1, double p2, double p3, double &dq0, double &dq1, double &dq2, double &dq3)
void invertQuaternion(double q0, double q1, double q2, double q3, double &q0_inv, double &q1_inv, double &q2_inv, double &q3_inv)
static const double kAccelerationThreshold


imu_complementary_filter
Author(s): Roberto G. Valenti
autogenerated on Tue May 7 2019 03:16:52