ekf_cal  0.4.0
A Kalman filter-based sensor calibration package
types.hpp
1 // Copyright 2023 Jacob Hartzer
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program. If not, see <https://www.gnu.org/licenses/>.
15 
16 #ifndef EKF__TYPES_HPP_
17 #define EKF__TYPES_HPP_
18 
19 #include <eigen3/Eigen/Eigen>
20 
21 #include <map>
22 #include <vector>
23 
24 #include "ekf/constants.hpp"
25 
26 #include <opencv2/opencv.hpp>
27 
28 enum class SensorType
29 {
30  IMU,
31  Camera,
32  Tracker,
33  GPS
34 };
35 
36 enum class AugmentationType
37 {
38  NONE, // No camera frames are augmented (fiducial detection only)
39  ALL, // All camera frames are augmented
40  PRIMARY, // Only the primary camera frames are augmented
41  TIME, // Time-based frame augmentation
42  ERROR // Linear Error-based frame augmentation
43 };
44 
49 {
50 public:
51  Intrinsics() {}
52 
57  cv::Mat ToCameraMatrix();
58 
63  cv::Mat ToDistortionVector();
64 
66  double f_x {0.01};
67  double f_y {0.01};
68  double k_1 {0.0};
69  double k_2 {0.0};
70  double p_1 {0.0};
71  double p_2 {0.0};
72  double width {1920};
73  double height {1080};
74  double pixel_size {5.0e-6};
75 };
76 
80 class BodyState
81 {
82 public:
86  BodyState() {}
87 
92  Eigen::VectorXd ToVector() const;
93 
98  void SetState(const Eigen::VectorXd & state);
99 
100  Eigen::Vector3d pos_b_in_l{0.0, 0.0, 0.0};
101  Eigen::Vector3d vel_b_in_l{0.0, 0.0, 0.0};
102  Eigen::Vector3d acc_b_in_l{g_gravity};
103  Eigen::Quaterniond ang_b_to_l{1.0, 0.0, 0.0, 0.0};
104  Eigen::Vector3d ang_vel_b_in_l{0.0, 0.0, 0.0};
105  Eigen::Vector3d ang_acc_b_in_l{0.0, 0.0, 0.0};
106  unsigned int size{g_body_state_size};
107  int index{-1};
108 };
109 
113 class ImuState
114 {
115 public:
116  ImuState() {}
117 
122  Eigen::VectorXd ToVector() const;
123 
128  bool GetIsExtrinsic() const;
133  bool GetIsIntrinsic() const;
138  void SetIsExtrinsic(bool extrinsic);
143  void SetIsIntrinsic(bool intrinsic);
144 
145  double pos_stability {1e-9};
146  double ang_stability {1e-9};
147  double acc_bias_stability {1e-9};
148  double omg_bias_stability {1e-9};
149  Eigen::Vector3d pos_i_in_b{0.0, 0.0, 0.0};
150  Eigen::Quaterniond ang_i_to_b{1.0, 0.0, 0.0, 0.0};
151  Eigen::Vector3d acc_bias{0.0, 0.0, 0.0};
152  Eigen::Vector3d omg_bias{0.0, 0.0, 0.0};
153  unsigned int size{0};
154  int index{-1};
155  int index_intrinsic{-1};
156  int index_extrinsic{-1};
157 
158 private:
159  void refresh_size();
160  bool is_extrinsic{false};
161  bool is_intrinsic{false};
162 };
163 
167 class GpsState
168 {
169 public:
170  GpsState() {}
171 
176  Eigen::VectorXd ToVector() const;
177 
182  bool GetIsExtrinsic() const;
187  void SetIsExtrinsic(bool extrinsic);
188 
189  Eigen::Vector3d pos_a_in_b{0.0, 0.0, 0.0};
190  double pos_stability {1e-9};
191  unsigned int size{0};
192  int index{-1};
193 
194 private:
195  void refresh_size();
196  bool is_extrinsic{false};
197 };
198 
202 class AugState
203 {
204 public:
205  AugState() {}
206 
211  Eigen::VectorXd ToVector() const;
212 
213  int frame_id {-1};
214  double time {0.0};
215  Eigen::Vector3d pos_b_in_l{0.0, 0.0, 0.0};
216  Eigen::Quaterniond ang_b_to_l{1.0, 0.0, 0.0, 0.0};
217  unsigned int size{g_aug_state_size};
218  int index{-1};
219  double alpha {0.0};
220 };
221 
225 class CamState
226 {
227 public:
228  CamState() {}
229 
234  Eigen::VectorXd ToVector() const;
235 
240  bool GetIsExtrinsic() const;
245  void SetIsExtrinsic(bool extrinsic);
246 
247  double pos_stability {1e-9};
248  double ang_stability {1e-9};
249  Eigen::Vector3d pos_c_in_b{0.0, 0.0, 0.0};
250  Eigen::Quaterniond ang_c_to_b{1.0, 0.0, 0.0, 0.0};
252  double rate{1.0};
253  unsigned int size{0};
254  int index{-1};
255 
256 private:
257  void refresh_size();
258  bool is_extrinsic{false};
259 };
260 
264 typedef struct FeaturePoint
265 {
266  int frame_id;
267  double frame_time;
268  cv::KeyPoint key_point;
269 } FeaturePoint;
270 
274 typedef struct FeatureTrack
275 {
276  std::vector<FeaturePoint> track;
278  Eigen::Vector3d true_feature_position;
279 } FeatureTrack;
280 
284 typedef std::vector<FeatureTrack> FeatureTracks;
285 
289 typedef struct BoardDetection
290 {
291  int frame_id{-1};
292  double frame_time{-1.0};
293  Eigen::Vector3d pos_f_in_c;
294  Eigen::Quaterniond ang_f_to_c;
295  Eigen::Vector3d pos_error{1e-9, 1e-9, 1e-9};
296  Eigen::Vector3d ang_error{1e-9, 1e-9, 1e-9};
298 
302 class FidState
303 {
304 public:
305  FidState() {}
306 
311  Eigen::VectorXd ToVector() const;
312 
317  bool GetIsExtrinsic() const;
322  void SetIsExtrinsic(bool extrinsic);
323 
324  int frame_id{-1};
325  Eigen::Vector3d pos_f_in_l;
326  Eigen::Quaterniond ang_f_to_l;
327  double pos_stability {1e-9};
328  double ang_stability {1e-9};
329  unsigned int size{0};
330  int index{-1};
331  unsigned int id{0};
332 
333 private:
334  void refresh_size();
335  bool is_extrinsic{false};
336 };
337 
342 class State
343 {
344 public:
348  State() {}
349 
354  Eigen::VectorXd ToVector() const;
355 
360  unsigned int GetStateSize() const;
361 
363  std::map<unsigned int, ImuState> imu_states{};
364  std::map<unsigned int, GpsState> gps_states{};
365  std::map<unsigned int, CamState> cam_states{};
366  std::map<unsigned int, FidState> fid_states{};
367  std::map<unsigned int, std::vector<AugState>> aug_states{};
368 };
369 
370 BodyState & operator+=(BodyState & l_body_state, const BodyState & r_body_state);
371 BodyState & operator+=(BodyState & l_body_state, const Eigen::VectorXd & r_vector);
372 ImuState & operator+=(ImuState & l_imu_state, const Eigen::VectorXd & r_vector);
373 std::map<unsigned int, ImuState> & operator+=(
374  std::map<unsigned int, ImuState> & l_imu_state, const Eigen::VectorXd & r_vector);
375 std::map<unsigned int, GpsState> & operator+=(
376  std::map<unsigned int, GpsState> & l_gps_state, const Eigen::VectorXd & r_vector);
377 std::map<unsigned int, CamState> & operator+=(
378  std::map<unsigned int, CamState> & l_cam_state, const Eigen::VectorXd & r_vector);
379 std::map<unsigned int, FidState> & operator+=(
380  std::map<unsigned int, FidState> & l_fid_state, const Eigen::VectorXd & r_vector);
381 std::vector<AugState> & operator+=(
382  std::vector<AugState> & l_augState, const Eigen::VectorXd & r_vector);
383 
384 State & operator+=(State & l_state, State & rState);
385 State & operator+=(State & l_state, const Eigen::VectorXd & r_vector);
386 
387 enum class GpsInitType
388 {
389  CONSTANT,
390  BASELINE_DIST,
391  ERROR_THRESHOLD
392 };
393 
394 #endif // EKF__TYPES_HPP_
AugState structure.
Definition: types.hpp:203
double time
Augmented frame ID.
Definition: types.hpp:214
Eigen::Quaterniond ang_b_to_l
Augmented IMU orientation.
Definition: types.hpp:216
int index
State index.
Definition: types.hpp:218
double alpha
Interpolation Factor.
Definition: types.hpp:219
Eigen::Vector3d pos_b_in_l
Augmented IMU position.
Definition: types.hpp:215
unsigned int size
State size.
Definition: types.hpp:217
Eigen::VectorXd ToVector() const
Get augmented state as a vector.
Definition: types.cpp:244
int frame_id
Augmented frame ID.
Definition: types.hpp:213
BodyState structure.
Definition: types.hpp:81
Eigen::Vector3d ang_vel_b_in_l
Body angular velocity.
Definition: types.hpp:104
void SetState(const Eigen::VectorXd &state)
Function to set state using vector.
Definition: types.cpp:290
Eigen::Vector3d ang_acc_b_in_l
Body angular acceleration.
Definition: types.hpp:105
unsigned int size
State size.
Definition: types.hpp:106
int index
State index.
Definition: types.hpp:107
Eigen::Vector3d vel_b_in_l
Body velocity.
Definition: types.hpp:101
Eigen::Vector3d pos_b_in_l
Body position.
Definition: types.hpp:100
BodyState()
EKF State constructor.
Definition: types.hpp:86
Eigen::Vector3d acc_b_in_l
Body acceleration.
Definition: types.hpp:102
Eigen::VectorXd ToVector() const
Get EKF state as a vector.
Definition: types.cpp:220
Eigen::Quaterniond ang_b_to_l
Body orientation.
Definition: types.hpp:103
CamState structure.
Definition: types.hpp:226
void SetIsExtrinsic(bool extrinsic)
is_extrinsic setter function
Definition: types.cpp:414
Eigen::Vector3d pos_c_in_b
Camera state position.
Definition: types.hpp:249
double rate
Frame rate.
Definition: types.hpp:252
double ang_stability
Extrinsic orientation stability.
Definition: types.hpp:248
Eigen::Quaterniond ang_c_to_b
Camera state orientation.
Definition: types.hpp:250
Intrinsics intrinsics
Camera Intrinsics.
Definition: types.hpp:251
unsigned int size
State size.
Definition: types.hpp:253
double pos_stability
Extrinsic position stability.
Definition: types.hpp:247
Eigen::VectorXd ToVector() const
Get camera state as a vector.
Definition: types.cpp:234
bool GetIsExtrinsic() const
is_extrinsic getter function
Definition: types.cpp:393
int index
State index.
Definition: types.hpp:254
Camera Sensor Class.
Definition: camera.hpp:41
Fiducial state structure.
Definition: types.hpp:303
int index
State index.
Definition: types.hpp:330
Eigen::Vector3d pos_f_in_l
Fiducial position in the local frame.
Definition: types.hpp:325
double ang_stability
Fiducial orientation stability.
Definition: types.hpp:328
Eigen::VectorXd ToVector() const
Get fiducial state as a vector.
Definition: types.cpp:278
bool GetIsExtrinsic() const
is_extrinsic getter function
Definition: types.cpp:403
unsigned int size
State size.
Definition: types.hpp:329
int frame_id
Fiducial board ID.
Definition: types.hpp:324
double pos_stability
Fiducial position stability.
Definition: types.hpp:327
Eigen::Quaterniond ang_f_to_l
Fiducial position in the local frame.
Definition: types.hpp:326
void SetIsExtrinsic(bool extrinsic)
is_extrinsic setter function
Definition: types.cpp:451
GPS Sensor Class.
Definition: gps.hpp:36
GpsState structure.
Definition: types.hpp:168
double pos_stability
Antenna position stability.
Definition: types.hpp:190
void SetIsExtrinsic(bool extrinsic)
is_extrinsic setter function
Definition: types.cpp:420
Eigen::Vector3d pos_a_in_b
Antenna position in body frame.
Definition: types.hpp:189
bool GetIsExtrinsic() const
is_extrinsic getter function
Definition: types.cpp:398
Eigen::VectorXd ToVector() const
Get GPS state as a vector.
Definition: types.cpp:273
int index
State index.
Definition: types.hpp:192
unsigned int size
State size.
Definition: types.hpp:191
IMU Sensor Class.
Definition: imu.hpp:33
ImuState structure.
Definition: types.hpp:114
void SetIsExtrinsic(bool extrinsic)
is_extrinsic setter function
Definition: types.cpp:408
bool GetIsExtrinsic() const
is_extrinsic getter function
Definition: types.cpp:383
bool GetIsIntrinsic() const
is_intrinsic getter function
Definition: types.cpp:388
Eigen::Vector3d omg_bias
Angular rate bias.
Definition: types.hpp:152
Eigen::Vector3d pos_i_in_b
Position.
Definition: types.hpp:149
double ang_stability
Extrinsic orientation stability.
Definition: types.hpp:146
int index
State index.
Definition: types.hpp:154
void SetIsIntrinsic(bool intrinsic)
is_intrinsic setter function
Definition: types.cpp:426
double acc_bias_stability
Accelerometer bias stability.
Definition: types.hpp:147
unsigned int size
State size.
Definition: types.hpp:153
Eigen::VectorXd ToVector() const
Get IMU state as a vector.
Definition: types.cpp:254
int index_intrinsic
Intrinsic state index.
Definition: types.hpp:155
int index_extrinsic
Extrinsic state index.
Definition: types.hpp:156
Eigen::Quaterniond ang_i_to_b
Orientation.
Definition: types.hpp:150
Eigen::Vector3d acc_bias
Acceleration bias.
Definition: types.hpp:151
double pos_stability
Extrinsic position stability.
Definition: types.hpp:145
double omg_bias_stability
Gyroscope bias stability.
Definition: types.hpp:148
Camera intrinsics data structure.
Definition: types.hpp:49
double p_1
Tangential coefficient 1.
Definition: types.hpp:70
double p_2
Tangential coefficient 1.
Definition: types.hpp:71
double k_1
Radial coefficient 1.
Definition: types.hpp:68
double width
Image width [px].
Definition: types.hpp:72
cv::Mat ToDistortionVector()
Generate distortion vector from intrinsics.
Definition: types.cpp:476
double f_y
Y focal length [px].
Definition: types.hpp:67
double f_x
X focal length [px].
Definition: types.hpp:66
double height
Image height [px].
Definition: types.hpp:73
cv::Mat ToCameraMatrix()
Generate camera matrix from intrinsics.
Definition: types.cpp:463
double k_2
Radial coefficient 2.
Definition: types.hpp:69
double pixel_size
Pixel size [mm].
Definition: types.hpp:74
EKF State Class.
Definition: types.hpp:343
std::map< unsigned int, std::vector< AugState > > aug_states
Fiducial states.
Definition: types.hpp:367
unsigned int GetStateSize() const
Get EKF state size.
Definition: types.cpp:347
std::map< unsigned int, CamState > cam_states
Camera states.
Definition: types.hpp:365
std::map< unsigned int, ImuState > imu_states
IMU states.
Definition: types.hpp:363
State()
EKF State constructor.
Definition: types.hpp:348
std::map< unsigned int, GpsState > gps_states
GPS states.
Definition: types.hpp:364
Eigen::VectorXd ToVector() const
Get EKF state as a vector.
Definition: types.cpp:301
BodyState body_state
Body state.
Definition: types.hpp:362
std::map< unsigned int, FidState > fid_states
Fiducial states.
Definition: types.hpp:366
Tracker Class.
Definition: tracker.hpp:31
BoardDetection structure.
Definition: types.hpp:290
Eigen::Vector3d pos_f_in_c
Rotation vector of the board.
Definition: types.hpp:293
Eigen::Vector3d pos_error
Position detection error.
Definition: types.hpp:295
double frame_time
Feature frame time.
Definition: types.hpp:292
int frame_id
Image frame ID.
Definition: types.hpp:291
Eigen::Vector3d ang_error
Orientation detection error.
Definition: types.hpp:296
Eigen::Quaterniond ang_f_to_c
Translation vector of the board.
Definition: types.hpp:294
FeaturePoint structure.
Definition: types.hpp:265
cv::KeyPoint key_point
Feature track key point.
Definition: types.hpp:268
int frame_id
Feature track frame ID.
Definition: types.hpp:266
double frame_time
Feature frame time.
Definition: types.hpp:267
FeatureTrack structure.
Definition: types.hpp:275
std::vector< FeaturePoint > track
Vector of tracked feature keypoints.
Definition: types.hpp:276
Eigen::Vector3d true_feature_position
True feature position (sim only)
Definition: types.hpp:278