GLIM
Loading...
Searching...
No Matches
interactive_viewer.hpp
1#pragma once
2
3#include <atomic>
4#include <memory>
5#include <thread>
6#include <vector>
7
8#include <Eigen/Core>
9#include <Eigen/Geometry>
10
11#include <glim/mapping/sub_map.hpp>
12#include <glim/util/extension_module.hpp>
13#include <glim/util/concurrent_vector.hpp>
14#include <gtsam_points/util/gtsam_migration.hpp>
15
16namespace spdlog {
17class logger;
18}
19
20namespace gtsam {
21class Values;
22class NonlinearFactor;
23class NonlinearFactorGraph;
24} // namespace gtsam
25
26namespace gtsam_points {
27class ISAM2Ext;
28class ISAM2ResultExt;
29} // namespace gtsam_points
30
31namespace glim {
32
33class TrajectoryManager;
34class ManualLoopCloseModal;
35class BundleAdjustmentModal;
36
38public:
39 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40
41 enum class PickType { POINTS = 1, FRAME = (1 << 1), FACTOR = (1 << 2) };
42 enum class FactorType { MATCHING_COST, BETWEEN, IMU };
43
45 virtual ~InteractiveViewer();
46
47 virtual bool ok() const override;
48 void wait();
49 void stop();
50 void clear();
51
52protected:
53 void viewer_loop();
54
55 virtual void setup_ui() {}
56
57 void invoke(const std::function<void()>& task);
58 void drawable_selection();
59 void on_click();
60 void context_menu();
61 void run_modals();
62
63 void update_viewer();
64
65 void odometry_on_new_frame(const EstimationFrame::ConstPtr& new_frame);
66 void globalmap_on_insert_submap(const SubMap::ConstPtr& submap);
67 void globalmap_on_update_submaps(const std::vector<SubMap::Ptr>& updated_submaps);
68 void globalmap_on_smoother_update(gtsam_points::ISAM2Ext& isam2, gtsam::NonlinearFactorGraph& new_factors, gtsam::Values& new_values);
69 void globalmap_on_smoother_update_result(gtsam_points::ISAM2Ext& isam2, const gtsam_points::ISAM2ResultExt& result);
70
71protected:
72 std::atomic_bool request_to_clear;
73 std::atomic_bool request_to_terminate;
74 std::atomic_bool kill_switch;
75 std::thread thread;
76
77 // Process params
78 int num_threads;
79
80 // Tasks to be executed in the GUI thread
81 std::mutex invoke_queue_mutex;
82 std::vector<std::function<void()>> invoke_queue;
83
84 // Visualization params
85 int color_mode;
86
87 float coord_scale;
88 float sphere_scale;
89
90 bool draw_current;
91 bool draw_traj;
92 bool draw_points;
93 bool draw_factors;
94 bool draw_spheres;
95
96 float min_overlap;
97 bool cont_optimize;
98
99 bool enable_partial_rendering;
100 int partial_rendering_budget;
101
102 double point_size;
103 bool point_size_metric;
104 bool point_shape_circle;
105
106 Eigen::Vector2f z_range;
107
108 double points_alpha;
109 double factors_alpha;
110
111 std::atomic_bool needs_session_merge;
112
113 // Click information
114 Eigen::Vector4i right_clicked_info;
115 Eigen::Vector3f right_clicked_pos;
116
117 // GUI widgets
118 std::unique_ptr<ManualLoopCloseModal> manual_loop_close_modal;
119 std::unique_ptr<BundleAdjustmentModal> bundle_adjustment_modal;
120
121 // Odometry
122 std::unique_ptr<TrajectoryManager> trajectory;
123
124 // Submaps
125 std::vector<Eigen::Isometry3d> submap_poses;
126 std::vector<SubMap::ConstPtr> submaps;
127
128 // Factors
129 std::vector<std::tuple<FactorType, std::uint64_t, std::uint64_t>> global_factors;
130
131 // Factors to be inserted into the global mapping graph
133
134 // Logging
135 std::shared_ptr<spdlog::logger> logger;
136};
137} // namespace glim
Simple thread-safe vector with mutex-lock.
Definition concurrent_vector.hpp:48
Extension module to be dynamically loaded via dynamic linking.
Definition extension_module.hpp:10
Definition interactive_viewer.hpp:37
virtual bool ok() const override
Check if the module is alive. (If it returns false, the system will be shutdown)
Definition loose_initial_state_estimation.hpp:9