Calico
A visual-inertial calibration library designed for rapid problem construction and debugging.
camera.h
1 #ifndef CALICO_SENSORS_CAMERA_H_
2 #define CALICO_SENSORS_CAMERA_H_
3 
4 #include <string>
5 #include <vector>
6 
7 #include "Eigen/Dense"
8 #include "absl/container/flat_hash_map.h"
9 #include "absl/container/flat_hash_set.h"
10 #include "absl/status/status.h"
11 #include "absl/strings/string_view.h"
12 #include "calico/sensors/camera_models.h"
13 #include "calico/sensors/sensor_base.h"
14 #include "calico/trajectory.h"
15 #include "calico/typedefs.h"
16 #include "ceres/problem.h"
17 
18 namespace calico::sensors {
19 
25  double stamp;
27  int image_id;
31  int model_id;
36 
37  template <typename H>
38  friend H AbslHashValue(H h, const CameraObservationId& id) {
39  return H::combine(std::move(h), id.stamp, id.image_id, id.model_id,
40  id.feature_id);
41  }
42  friend bool operator==(const CameraObservationId& lhs,
43  const CameraObservationId& rhs) {
44  return (lhs.stamp == rhs.stamp && lhs.image_id == rhs.image_id &&
45  lhs.model_id == rhs.model_id && lhs.feature_id == rhs.feature_id);
46  }
47 };
48 
49 // Camera measurement type.
52  Eigen::Vector2d pixel;
55 };
56 
58 class Camera : public Sensor {
59  public:
60  explicit Camera() = default;
61  Camera(const Camera&) = delete;
62  Camera& operator=(const Camera&) = delete;
63  ~Camera() = default;
64 
65  void SetName(const std::string& name);
66  const std::string& GetName() const;
67  void SetExtrinsics(const Pose3d& T_sensorrig_sensor);
68  const Pose3d& GetExtrinsics() const;
69  absl::Status SetIntrinsics(const Eigen::VectorXd& intrinsics);
70  const Eigen::VectorXd& GetIntrinsics() const;
71  absl::Status SetLatency(double latency);
72  double GetLatency() const;
73  void EnableExtrinsicsEstimation(bool enable);
74  void EnableIntrinsicsEstimation(bool enable);
75  void EnableLatencyEstimation(bool enable);
76  void SetLossFunction(utils::LossFunctionType loss, double scale) final;
77  absl::StatusOr<int> AddParametersToProblem(ceres::Problem& problem) final;
78  absl::StatusOr<int> AddResidualsToProblem(ceres::Problem& problem,
79  Trajectory& sensorrig_trajectory,
80  WorldModel& world_model) final;
81  absl::Status SetMeasurementNoise(double sigma) final;
82  absl::Status UpdateResiduals(ceres::Problem& problem) final;
83  void ClearResidualInfo() final;
84 
86 
97  absl::StatusOr<std::vector<CameraMeasurement>> Project(
98  const std::vector<double>& interp_times,
99  const Trajectory& sensorrig_trajectory,
100  const WorldModel& world_model) const;
101 
103  absl::Status SetModel(CameraIntrinsicsModel camera_model);
104 
107 
109 
111  absl::Status AddMeasurement(const CameraMeasurement& measurement);
112 
114 
120  absl::Status AddMeasurements(
121  const std::vector<CameraMeasurement>& measurements);
122 
125  const absl::flat_hash_map<CameraObservationId, CameraMeasurement>&
127 
129 
135  absl::StatusOr<std::vector<std::pair<CameraMeasurement, Eigen::Vector2d>>>
137 
139 
143  absl::Status MarkOutlierById(const CameraObservationId& id);
144 
146 
150  absl::Status MarkOutliersById(const std::vector<CameraObservationId>& ids);
151 
153  void ClearOutliersList();
154 
156 
158  void ClearMeasurements();
159 
161  int NumberOfMeasurements() const;
162 
163  private:
164  std::string name_;
165  bool intrinsics_enabled_;
166  bool extrinsics_enabled_;
167  bool latency_enabled_;
168  std::unique_ptr<CameraModel> camera_model_;
169  Pose3d T_sensorrig_sensor_;
170  Eigen::VectorXd intrinsics_;
171  double latency_ = 0.0;
172  double sigma_ = 1.0;
173  utils::LossFunctionType loss_function_;
174  double loss_scale_ = 1.0;
175  absl::flat_hash_map<CameraObservationId, CameraMeasurement>
176  id_to_measurement_;
177  absl::flat_hash_map<CameraObservationId, Eigen::Vector2d> id_to_residual_;
178  absl::flat_hash_map<CameraObservationId, ceres::ResidualBlockId>
179  id_to_residual_id_;
180  absl::flat_hash_set<CameraObservationId> outlier_ids_;
181 };
182 
183 } // namespace calico::sensors
184 
185 #endif // CALICO_SENSORS_CAMERA_H_
Definition: trajectory.h:25
Definition: world_model.h:73
Camera class.
Definition: camera.h:58
CameraIntrinsicsModel GetModel() const
Getter for the camera model.
Definition: camera.cpp:218
absl::Status MarkOutliersById(const std::vector< CameraObservationId > &ids)
Tag multiple measurements as outliers by measurement ID.
Definition: camera.cpp:287
absl::Status AddMeasurements(const std::vector< CameraMeasurement > &measurements)
Add multiple measurements to the measurement list.
Definition: camera.cpp:234
const absl::flat_hash_map< CameraObservationId, CameraMeasurement > & GetMeasurementIdToMeasurement() const
Definition: camera.cpp:250
int NumberOfMeasurements() const
Get current number of measurements stored.
Definition: camera.cpp:304
void ClearOutliersList()
Clear outliers list.
Definition: camera.cpp:295
absl::Status MarkOutlierById(const CameraObservationId &id)
Tag a single measurement as an outlier by its measurement ID.
Definition: camera.cpp:276
absl::StatusOr< int > AddParametersToProblem(ceres::Problem &problem) final
Add this sensor's calibration parameters to the ceres problem.
Definition: camera.cpp:87
absl::StatusOr< std::vector< std::pair< CameraMeasurement, Eigen::Vector2d > > > GetMeasurementResidualPairs() const
Returns a vector of measurement-residual pairs.
Definition: camera.cpp:255
absl::Status UpdateResiduals(ceres::Problem &problem) final
Update residuals for this sensor.
Definition: camera.cpp:62
void SetLossFunction(utils::LossFunctionType loss, double scale) final
Setter for loss function and scale.
Definition: camera.cpp:82
absl::Status AddMeasurement(const CameraMeasurement &measurement)
Add a single camera measurement to the measurement list.
Definition: camera.cpp:223
absl::Status SetMeasurementNoise(double sigma) final
Set the measurement noise .
Definition: camera.cpp:54
void ClearResidualInfo() final
Clear all stored info about residuals.
Definition: camera.cpp:77
absl::Status SetModel(CameraIntrinsicsModel camera_model)
Setter for the camera model.
Definition: camera.cpp:207
absl::StatusOr< int > AddResidualsToProblem(ceres::Problem &problem, Trajectory &sensorrig_trajectory, WorldModel &world_model) final
Contribue this sensor's residuals to the ceres problem.
Definition: camera.cpp:110
absl::StatusOr< std::vector< CameraMeasurement > > Project(const std::vector< double > &interp_times, const Trajectory &sensorrig_trajectory, const WorldModel &world_model) const
Compute synthetic camera measurements given a Trajectory and WorldModel.
Definition: camera.cpp:160
void ClearMeasurements()
Clear all measurements.
Definition: camera.cpp:297
Definition: sensor_base.h:20
Sensors namespace.
Definition: accelerometer.cpp:8
CameraIntrinsicsModel
Camera model types.
Definition: camera_models.h:16
LossFunctionType
Definition: optimization_utils.h:15
Definition: camera.h:50
Eigen::Vector2d pixel
Pixel location of the observed feature.
Definition: camera.h:52
CameraObservationId id
Id of this observation.
Definition: camera.h:54
int model_id
RigidBody model id. Equivalent to RigidBody.id field of a RigidBody or kLandmarkFrameId if this measu...
Definition: camera.h:31
int feature_id
Feature id. Equivalent to the key field of RigidBody.model_definition of RigidBody or Landmark....
Definition: camera.h:35
double stamp
Timestamp in seconds.
Definition: camera.h:25
int image_id
Image id.
Definition: camera.h:27