Calico
A visual-inertial calibration library designed for rapid problem construction and debugging.
gyroscope.h
1 #ifndef CALICO_SENSORS_GYROSCOPE_H_
2 #define CALICO_SENSORS_GYROSCOPE_H_
3 
4 #include <string>
5 #include <vector>
6 
7 #include "Eigen/Dense"
8 #include "absl/container/flat_hash_map.h"
9 #include "absl/status/status.h"
10 #include "absl/strings/string_view.h"
11 #include "calico/sensors/gyroscope_models.h"
12 #include "calico/sensors/sensor_base.h"
13 #include "calico/trajectory.h"
14 #include "calico/typedefs.h"
15 #include "ceres/problem.h"
16 
17 namespace calico::sensors {
18 
24  double stamp;
26  int sequence;
27 
28  template <typename H>
29  friend H AbslHashValue(H h, const GyroscopeObservationId& id) {
30  return H::combine(std::move(h), id.stamp, id.sequence);
31  }
32  friend bool operator==(const GyroscopeObservationId& lhs,
33  const GyroscopeObservationId& rhs) {
34  return (lhs.stamp == rhs.stamp && lhs.sequence == rhs.sequence);
35  }
36 };
37 
41  Eigen::Vector3d measurement;
44 };
45 
47 class Gyroscope : public Sensor {
48  public:
49  explicit Gyroscope() = default;
50  Gyroscope(const Gyroscope&) = delete;
51  Gyroscope& operator=(const Gyroscope&) = delete;
52  ~Gyroscope() = default;
53 
54  void SetName(const std::string& name);
55  const std::string& GetName() const;
56  void SetExtrinsics(const Pose3d& T_sensorrig_sensor);
57  const Pose3d& GetExtrinsics() const;
58  absl::Status SetIntrinsics(const Eigen::VectorXd& intrinsics);
59  const Eigen::VectorXd& GetIntrinsics() const;
60  absl::Status SetLatency(double latency);
61  double GetLatency() const;
62  void EnableExtrinsicsEstimation(bool enable);
63  void EnableIntrinsicsEstimation(bool enable);
64  void EnableLatencyEstimation(bool enable);
65  void SetLossFunction(utils::LossFunctionType loss, double scale);
66  absl::StatusOr<int> AddParametersToProblem(ceres::Problem& problem) final;
67  absl::StatusOr<int> AddResidualsToProblem(ceres::Problem& problem,
68  Trajectory& sensorrig_trajectory,
69  WorldModel& world_model) final;
70  absl::Status SetMeasurementNoise(double sigma) final;
71  absl::Status UpdateResiduals(ceres::Problem& problem) final;
72  void ClearResidualInfo() final;
73 
75 
84  absl::StatusOr<std::vector<GyroscopeMeasurement>> Project(
85  const std::vector<double>& interp_times,
86  const Trajectory& sensorrig_trajectory,
87  const WorldModel& world_model) const;
88 
90  absl::Status SetModel(GyroscopeIntrinsicsModel gyroscope_model);
91 
94 
96 
98  absl::Status AddMeasurement(const GyroscopeMeasurement& measurement);
99 
101 
107  absl::Status AddMeasurements(
108  const std::vector<GyroscopeMeasurement>& measurements);
109 
111  void ClearMeasurements();
112 
114  int NumberOfMeasurements() const;
115 
116  private:
117  std::string name_;
118  bool intrinsics_enabled_;
119  bool extrinsics_enabled_;
120  bool latency_enabled_;
121  std::unique_ptr<GyroscopeModel> gyroscope_model_;
122  Pose3d T_sensorrig_sensor_;
123  Eigen::VectorXd intrinsics_;
124  double latency_ = 0.0;
125  double sigma_ = 1.0;
126  utils::LossFunctionType loss_function_;
127  double loss_scale_ = 1.0;
128  absl::flat_hash_map<GyroscopeObservationId, GyroscopeMeasurement>
129  id_to_measurement_;
130  absl::flat_hash_map<GyroscopeObservationId, Eigen::Vector3d> id_to_residual_;
131  absl::flat_hash_map<GyroscopeObservationId, ceres::ResidualBlockId>
132  id_to_residual_id_;
133 };
134 
135 } // namespace calico::sensors
136 
137 #endif // CALICO_SENSORS_GYROSCOPE_H_
Definition: trajectory.h:25
Definition: world_model.h:73
Gyroscope class.
Definition: gyroscope.h:47
void SetLossFunction(utils::LossFunctionType loss, double scale)
Setter for loss function and scale.
Definition: gyroscope.cpp:146
GyroscopeIntrinsicsModel GetModel() const
Getter for gyroscope model.
Definition: gyroscope.cpp:167
void ClearResidualInfo() final
Clear all stored info about residuals.
Definition: gyroscope.cpp:151
void ClearMeasurements()
Clear all measurements.
Definition: gyroscope.cpp:211
absl::Status AddMeasurements(const std::vector< GyroscopeMeasurement > &measurements)
Add multiple measurements to the measurement list.
Definition: gyroscope.cpp:196
absl::Status SetModel(GyroscopeIntrinsicsModel gyroscope_model)
Setter for gyroscope model.
Definition: gyroscope.cpp:156
absl::Status AddMeasurement(const GyroscopeMeasurement &measurement)
Add a gyroscope measurement to the measurement list.
Definition: gyroscope.cpp:185
absl::StatusOr< std::vector< GyroscopeMeasurement > > Project(const std::vector< double > &interp_times, const Trajectory &sensorrig_trajectory, const WorldModel &world_model) const
Compute synthetic gyroscope measurements at given a sensorrig trajectory.
Definition: gyroscope.cpp:56
absl::Status UpdateResiduals(ceres::Problem &problem) final
Update residuals for this sensor.
Definition: gyroscope.cpp:172
absl::Status SetMeasurementNoise(double sigma) final
Set the measurement noise .
Definition: gyroscope.cpp:138
int NumberOfMeasurements() const
Get current number of measurements stored.
Definition: gyroscope.cpp:215
absl::StatusOr< int > AddParametersToProblem(ceres::Problem &problem) final
Add this sensor's calibration parameters to the ceres problem.
Definition: gyroscope.cpp:10
absl::StatusOr< int > AddResidualsToProblem(ceres::Problem &problem, Trajectory &sensorrig_trajectory, WorldModel &world_model) final
Contribue this sensor's residuals to the ceres problem.
Definition: gyroscope.cpp:33
Definition: sensor_base.h:20
Sensors namespace.
Definition: accelerometer.cpp:8
GyroscopeIntrinsicsModel
Gyroscope model types.
Definition: gyroscope_models.h:16
LossFunctionType
Definition: optimization_utils.h:15
Gyroscope measurement type.
Definition: gyroscope.h:39
GyroscopeObservationId id
Id of this observation.
Definition: gyroscope.h:43
Eigen::Vector3d measurement
Raw uncalibrated measurement value from a gyroscope.
Definition: gyroscope.h:41
Definition: gyroscope.h:22
double stamp
Timestamp in seconds.
Definition: gyroscope.h:24
int sequence
Sequence number of this measurement.
Definition: gyroscope.h:26