Calico
A visual-inertial calibration library designed for rapid problem construction and debugging.
world_model.h
1 #ifndef CALICO_WORLD_MODEL_H_
2 #define CALICO_WORLD_MODEL_H_
3 
4 #include <memory>
5 
6 #include "calico/typedefs.h"
7 #include "absl/container/flat_hash_map.h"
8 #include "absl/status/status.h"
9 #include "ceres/problem.h"
10 #include "Eigen/Dense"
11 
12 
13 namespace calico {
14 
16 constexpr int kLandmarkFrameId = -1;
17 
22 struct Landmark {
24  Eigen::Vector3d point;
26  int id;
30 };
31 
53 struct RigidBody {
57  std::unordered_map<int, Eigen::Vector3d> model_definition;
62  int id;
69 };
70 
73 class WorldModel {
74  public:
78  static constexpr double kGravityDefaultZ = -9.80665;
79 
80  WorldModel();
81  ~WorldModel();
82 
85  absl::Status AddLandmark(Landmark* landmark, bool take_ownership = true);
86 
89  absl::Status AddRigidBody(RigidBody* rigidbody, bool take_ownership = true);
90 
94  int AddParametersToProblem(ceres::Problem& problem);
95 
97  const absl::flat_hash_map<int, std::unique_ptr<Landmark>>& landmarks() const;
98  absl::flat_hash_map<int, std::unique_ptr<Landmark>>& landmarks();
99 
101  const absl::flat_hash_map<int, std::unique_ptr<RigidBody>>& rigidbodies() const;
102  absl::flat_hash_map<int, std::unique_ptr<RigidBody>>& rigidbodies();
103 
105  void EnableGravityEstimation(bool enable);
106 
108  const Eigen::Vector3d& gravity() const;
109  Eigen::Vector3d& gravity();
110 
112  void SetGravity(const Eigen::Vector3d& gravity);
113 
115  const Eigen::Vector3d& GetGravity() const;
116 
117 
119  int NumberOfLandmarks() const;
120 
122  int NumberOfRigidBodies() const;
123 
125  void ClearLandmarks();
126 
128  void ClearRigidBodies();
129 
131  void Clear();
132 
133  private:
134  absl::flat_hash_map<int, bool> rigidbody_id_to_own_rigidbody_;
135  absl::flat_hash_map<int, bool> landmark_id_to_own_landmark_;
136  absl::flat_hash_map<int, std::unique_ptr<RigidBody>> rigidbody_id_to_rigidbody_;
137  absl::flat_hash_map<int, std::unique_ptr<Landmark>> landmark_id_to_landmark_;
138 
139  Eigen::Vector3d gravity_;
140  bool gravity_enabled_;
141 };
142 
143 } // namespace calico
144 
145 #endif // CALICO_WORLD_MODEL_H_
Definition: world_model.h:73
void EnableGravityEstimation(bool enable)
Enable flag for gravity estimation.
Definition: world_model.cpp:79
const Eigen::Vector3d & gravity() const
Accessor for gravity vector.
Definition: world_model.cpp:103
void ClearRigidBodies()
Remove all RigidBody objects from the world model.
Definition: world_model.cpp:133
int NumberOfRigidBodies() const
Get the number of rigid bodies currently in this world model.
Definition: world_model.cpp:119
const absl::flat_hash_map< int, std::unique_ptr< RigidBody > > & rigidbodies() const
Accessor for rigid bodies.
Definition: world_model.cpp:95
absl::Status AddRigidBody(RigidBody *rigidbody, bool take_ownership=true)
Definition: world_model.cpp:30
const Eigen::Vector3d & GetGravity() const
Getter for gravity for easy pybind integration.
Definition: world_model.cpp:111
void SetGravity(const Eigen::Vector3d &gravity)
Setter for gravity for easy pybind integration.
Definition: world_model.cpp:107
const absl::flat_hash_map< int, std::unique_ptr< Landmark > > & landmarks() const
Accessor for landmarks.
Definition: world_model.cpp:87
int AddParametersToProblem(ceres::Problem &problem)
Definition: world_model.cpp:40
void ClearLandmarks()
Remove all Landmark objects from the world model.
Definition: world_model.cpp:123
static constexpr double kGravityDefaultZ
Definition: world_model.h:78
int NumberOfLandmarks() const
Get the number of landmarks currently in this world model.
Definition: world_model.cpp:115
void Clear()
Remove all objects from the world model.
Definition: world_model.cpp:143
absl::Status AddLandmark(Landmark *landmark, bool take_ownership=true)
Definition: world_model.cpp:20
Primary calico namespace.
Definition: __init__.py:1
constexpr int kLandmarkFrameId
Default frame id for a landmark (i.e. World frame).
Definition: world_model.h:16
Definition: world_model.h:22
int id
Unique id for this landmark.
Definition: world_model.h:26
Eigen::Vector3d point
This landmark's location in the world frame. .
Definition: world_model.h:24
bool point_is_constant
Flag for keeping this landmark's point constant or as a free parameter.
Definition: world_model.h:29
Definition: world_model.h:53
bool model_definition_is_constant
Flag for keeping the model definition constant or as free parameters.
Definition: world_model.h:68
int id
Id of this rigid body. When adding rigid bodies to the BatchOptimizer, id's for all rigid bodies must...
Definition: world_model.h:62
Pose3d T_world_rigidbody
FROM world TO rigidbody transform, .
Definition: world_model.h:59
std::unordered_map< int, Eigen::Vector3d > model_definition
Maps feature id to its 3d point definition resolved in the rigid body frame, . Each feature needs a u...
Definition: world_model.h:57
bool world_pose_is_constant
Flag for keeping this rigid body's world-from-rigidbody pose constant or as a free parameter.
Definition: world_model.h:65