farm-ng-core
imu_model.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 #pragma once
10 
11 #include "sophus/common/enum.h"
12 #include "sophus/lie/se3.h"
13 
14 #include <Eigen/Dense>
15 
16 #include <variant>
17 
18 namespace sophus {
19 
20 template <class TT>
21 auto nonOrthogonalityMatrix(Eigen::Matrix<TT, 3, 1> const& non_orthogonality)
22  -> Eigen::Matrix<TT, 3, 3> {
23  Eigen::Matrix<TT, 3, 3> lower_triagonal = Eigen::Matrix<TT, 3, 3>::Identity();
24  lower_triagonal(1, 0) = non_orthogonality[0];
25  lower_triagonal(2, 0) = non_orthogonality[1];
26  lower_triagonal(2, 1) = non_orthogonality[2];
27  return lower_triagonal;
28 }
29 
30 // following: https://timohinzmann.com/publications/icra_2016_rehder.pdf
31 template <class TT>
34  Eigen::Matrix<TT, 3, 1> const& scale = Eigen::Matrix<TT, 3, 1>::Ones(),
35  Eigen::Matrix<TT, 3, 1> const& non_orthogonality =
36  Eigen::Matrix<TT, 3, 1>::Zero(),
37  Eigen::Matrix<TT, 3, 1> const& gyro_bias =
38  Eigen::Matrix<TT, 3, 1>::Zero())
39  : scale(scale),
42 
43  static auto fromParams(Eigen::Matrix<TT, 9, 1> const& params)
46  {params[0], params[1], params[2]},
47  {params[3], params[4], params[5]},
48  {params[6], params[7], params[8]});
49  }
50 
51  [[nodiscard]] auto gyroMeasurement(
52  Eigen::Matrix<TT, 3, 1> const& imu_angular_rate_imu) const
53  -> Eigen::Matrix<TT, 3, 1> {
54  return Eigen::DiagonalMatrix<TT, 3>(scale) *
56  imu_angular_rate_imu +
57  gyro_bias;
58  }
59 
60  [[nodiscard]] auto params() const -> Eigen::Matrix<TT, 9, 1> {
61  Eigen::Matrix<TT, 9, 1> params;
62  params << scale[0], scale[1], scale[2], non_orthogonality[0],
64  gyro_bias[2];
65  return params;
66  }
67 
68  Eigen::Matrix<TT, 3, 1> scale;
69  Eigen::Matrix<TT, 3, 1> non_orthogonality;
70  Eigen::Matrix<TT, 3, 1> gyro_bias;
71 };
72 
73 // following: https://timohinzmann.com/publications/icra_2016_rehder.pdf
74 template <class TT>
77  Eigen::Matrix<TT, 3, 1> const& scale = Eigen::Matrix<TT, 3, 1>::Ones(),
78  Eigen::Matrix<TT, 3, 1> const& non_orthogonality =
79  Eigen::Matrix<TT, 3, 1>::Zero(),
80  Eigen::Matrix<TT, 3, 1> const& accel_bias =
81  Eigen::Matrix<TT, 3, 1>::Zero())
82  : scale(scale),
85 
86  static auto fromParams(Eigen::Matrix<TT, 9, 1> const& params)
89  {params[0], params[1], params[2]},
90  {params[3], params[4], params[5]},
91  {params[6], params[7], params[8]});
92  }
93 
94  [[nodiscard]] auto acceleroMeasurement(
95  Eigen::Matrix<TT, 3, 1> const& imu_acceleration_imu) const
96  -> Eigen::Matrix<TT, 3, 1> {
97  return Eigen::DiagonalMatrix<TT, 3>(scale) *
99  imu_acceleration_imu +
100  accel_bias;
101  }
102 
103  [[nodiscard]] auto params() const -> Eigen::Matrix<TT, 9, 1> {
104  Eigen::Matrix<TT, 9, 1> params;
105  params << scale[0], scale[1], scale[2], non_orthogonality[0],
107  accel_bias[1], accel_bias[2];
108  return params;
109  }
110 
111  Eigen::Matrix<TT, 3, 1> scale;
112  Eigen::Matrix<TT, 3, 1> non_orthogonality;
113  Eigen::Matrix<TT, 3, 1> accel_bias;
114 };
115 
116 SOPHUS_ENUM(GyroModelType, (scaling_non_orthogonality));
117 
118 SOPHUS_ENUM(AcceleroModelType, (scaling_non_orthogonality));
119 
120 using GyroModelVariant = std::variant<ScalingNonOrthogonalityGyroModel<double>>;
121 using AcceleroModelVariant =
122  std::variant<ScalingNonOrthogonalityAcceleroModel<double>>;
123 
124 auto getModelFromType(GyroModelType model_type, Eigen::VectorXd const& params)
125  -> GyroModelVariant;
126 
127 auto getModelFromType(
128  AcceleroModelType model_type, Eigen::VectorXd const& params)
130 
131 static_assert(
132  std::variant_size_v<GyroModelVariant> == getCount(GyroModelType()),
133  "When the variant GyroModelVariant is updated, one needs to "
134  "update the enum GyroModelType as well, and vice versa.");
135 
136 static_assert(
137  std::variant_size_v<AcceleroModelVariant> == getCount(AcceleroModelType()),
138  "When the variant AcceleroModelVariant is updated, one needs to "
139  "update the enum AcceleroModelType as well, and vice versa.");
140 
141 class ImuModel {
142  public:
144  GyroModelVariant const& gyro_model,
145  AcceleroModelVariant const& accelero_model)
146  : gyro_model_(gyro_model), accelero_model_(accelero_model) {}
147 
148  auto gyroMeasurement(Eigen::Vector3d const& world_velocity_imu)
149  -> Eigen::Vector3d;
150 
151  auto acceleroMeasurement(Eigen::Vector3d const& world_acceleration_imu)
152  -> Eigen::Vector3d;
153 
154  auto gyroModel() -> GyroModelVariant& { return gyro_model_; }
155 
156  [[nodiscard]] auto gyroModel() const -> GyroModelVariant const& {
157  return gyro_model_;
158  }
159 
160  auto acceleroModel() -> AcceleroModelVariant& { return accelero_model_; }
161 
162  [[nodiscard]] auto acceleroModel() const -> AcceleroModelVariant const& {
163  return accelero_model_;
164  }
165 
166  [[nodiscard]] auto gyroParams() const -> Eigen::VectorXd;
167 
168  [[nodiscard]] auto acceleroParams() const -> Eigen::VectorXd;
169 
170  [[nodiscard]] auto gyroModelType() const -> GyroModelType;
171 
172  [[nodiscard]] auto acceleroModelType() const -> AcceleroModelType;
173 
174  private:
175  GyroModelVariant gyro_model_;
176  AcceleroModelVariant accelero_model_;
177 };
178 
179 } // namespace sophus
sophus::ScalingNonOrthogonalityAcceleroModel
Definition: imu_model.h:75
sophus::ImuModel::gyroParams
auto gyroParams() const -> Eigen::VectorXd
Definition: imu_model.cpp:69
Eigen
Definition: params.h:72
sophus::ImuModel::acceleroMeasurement
auto acceleroMeasurement(Eigen::Vector3d const &world_acceleration_imu) -> Eigen::Vector3d
Definition: imu_model.cpp:45
sophus::ImuModel::acceleroParams
auto acceleroParams() const -> Eigen::VectorXd
Definition: imu_model.cpp:73
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::ImuModel::gyroModel
auto gyroModel() -> GyroModelVariant &
Definition: imu_model.h:154
sophus::ScalingNonOrthogonalityAcceleroModel::accel_bias
Eigen::Matrix< TT, 3, 1 > accel_bias
Definition: imu_model.h:113
sophus::ScalingNonOrthogonalityGyroModel::gyroMeasurement
auto gyroMeasurement(Eigen::Matrix< TT, 3, 1 > const &imu_angular_rate_imu) const -> Eigen::Matrix< TT, 3, 1 >
Definition: imu_model.h:51
sophus::ScalingNonOrthogonalityAcceleroModel::acceleroMeasurement
auto acceleroMeasurement(Eigen::Matrix< TT, 3, 1 > const &imu_acceleration_imu) const -> Eigen::Matrix< TT, 3, 1 >
Definition: imu_model.h:94
sophus::ScalingNonOrthogonalityGyroModel::params
auto params() const -> Eigen::Matrix< TT, 9, 1 >
Definition: imu_model.h:60
sophus::ScalingNonOrthogonalityAcceleroModel::scale
Eigen::Matrix< TT, 3, 1 > scale
Definition: imu_model.h:111
sophus::ScalingNonOrthogonalityAcceleroModel::non_orthogonality
Eigen::Matrix< TT, 3, 1 > non_orthogonality
Definition: imu_model.h:112
sophus::ImuModel::gyroMeasurement
auto gyroMeasurement(Eigen::Vector3d const &world_velocity_imu) -> Eigen::Vector3d
Definition: imu_model.cpp:36
sophus::ScalingNonOrthogonalityAcceleroModel::fromParams
static auto fromParams(Eigen::Matrix< TT, 9, 1 > const &params) -> ScalingNonOrthogonalityAcceleroModel< TT >
Definition: imu_model.h:86
sophus::GyroModelVariant
std::variant< ScalingNonOrthogonalityGyroModel< double > > GyroModelVariant
Definition: imu_model.h:120
sophus::ScalingNonOrthogonalityGyroModel
Definition: imu_model.h:32
sophus::ScalingNonOrthogonalityGyroModel::non_orthogonality
Eigen::Matrix< TT, 3, 1 > non_orthogonality
Definition: imu_model.h:69
sophus::ImuModel::acceleroModel
auto acceleroModel() -> AcceleroModelVariant &
Definition: imu_model.h:160
sophus::ImuModel::acceleroModelType
auto acceleroModelType() const -> AcceleroModelType
Definition: imu_model.cpp:78
sophus::ImuModel::ImuModel
ImuModel(GyroModelVariant const &gyro_model, AcceleroModelVariant const &accelero_model)
Definition: imu_model.h:143
sophus::ImuModel::acceleroModel
auto acceleroModel() const -> AcceleroModelVariant const &
Definition: imu_model.h:162
sophus::SOPHUS_ENUM
SOPHUS_ENUM(NumberType,(fixed_point, floating_point))
sophus::getModelFromType
auto getModelFromType(GyroModelType model_type, Eigen::VectorXd const &params) -> GyroModelVariant
Definition: imu_model.cpp:13
se3.h
sophus::ScalingNonOrthogonalityAcceleroModel::ScalingNonOrthogonalityAcceleroModel
ScalingNonOrthogonalityAcceleroModel(Eigen::Matrix< TT, 3, 1 > const &scale=Eigen::Matrix< TT, 3, 1 >::Ones(), Eigen::Matrix< TT, 3, 1 > const &non_orthogonality=Eigen::Matrix< TT, 3, 1 >::Zero(), Eigen::Matrix< TT, 3, 1 > const &accel_bias=Eigen::Matrix< TT, 3, 1 >::Zero())
Definition: imu_model.h:76
sophus::AcceleroModelVariant
std::variant< ScalingNonOrthogonalityAcceleroModel< double > > AcceleroModelVariant
Definition: imu_model.h:122
sophus::ScalingNonOrthogonalityGyroModel::ScalingNonOrthogonalityGyroModel
ScalingNonOrthogonalityGyroModel(Eigen::Matrix< TT, 3, 1 > const &scale=Eigen::Matrix< TT, 3, 1 >::Ones(), Eigen::Matrix< TT, 3, 1 > const &non_orthogonality=Eigen::Matrix< TT, 3, 1 >::Zero(), Eigen::Matrix< TT, 3, 1 > const &gyro_bias=Eigen::Matrix< TT, 3, 1 >::Zero())
Definition: imu_model.h:33
sophus::ImuModel::gyroModel
auto gyroModel() const -> GyroModelVariant const &
Definition: imu_model.h:156
sophus::ScalingNonOrthogonalityGyroModel::fromParams
static auto fromParams(Eigen::Matrix< TT, 9, 1 > const &params) -> ScalingNonOrthogonalityGyroModel< TT >
Definition: imu_model.h:43
enum.h
sophus::nonOrthogonalityMatrix
auto nonOrthogonalityMatrix(Eigen::Matrix< TT, 3, 1 > const &non_orthogonality) -> Eigen::Matrix< TT, 3, 3 >
Definition: imu_model.h:21
sophus::ImuModel::gyroModelType
auto gyroModelType() const -> GyroModelType
Definition: imu_model.cpp:54
sophus::ScalingNonOrthogonalityGyroModel::scale
Eigen::Matrix< TT, 3, 1 > scale
Definition: imu_model.h:68
sophus::ScalingNonOrthogonalityGyroModel::gyro_bias
Eigen::Matrix< TT, 3, 1 > gyro_bias
Definition: imu_model.h:70
sophus::ScalingNonOrthogonalityAcceleroModel::params
auto params() const -> Eigen::Matrix< TT, 9, 1 >
Definition: imu_model.h:103
sophus::ImuModel
Definition: imu_model.h:141