22 #ifndef OV_INIT_INERTIALINITIALIZEROPTIONS_H 23 #define OV_INIT_INERTIALINITIALIZEROPTIONS_H 25 #include <Eigen/Eigen> 55 void print_and_load(
const std::shared_ptr<ov_core::YamlParser> &parser =
nullptr) {
126 if (parser !=
nullptr) {
127 parser->parse_config(
"init_window_time", init_window_time);
128 parser->parse_config(
"init_imu_thresh", init_imu_thresh);
129 parser->parse_config(
"init_max_disparity", init_max_disparity);
130 parser->parse_config(
"init_max_features", init_max_features);
131 parser->parse_config(
"init_dyn_use", init_dyn_use);
132 parser->parse_config(
"init_dyn_mle_opt_calib", init_dyn_mle_opt_calib);
133 parser->parse_config(
"init_dyn_mle_max_iter", init_dyn_mle_max_iter);
134 parser->parse_config(
"init_dyn_mle_max_threads", init_dyn_mle_max_threads);
135 parser->parse_config(
"init_dyn_mle_max_time", init_dyn_mle_max_time);
136 parser->parse_config(
"init_dyn_num_pose", init_dyn_num_pose);
137 parser->parse_config(
"init_dyn_min_deg", init_dyn_min_deg);
138 parser->parse_config(
"init_dyn_inflation_ori", init_dyn_inflation_orientation);
139 parser->parse_config(
"init_dyn_inflation_vel", init_dyn_inflation_velocity);
140 parser->parse_config(
"init_dyn_inflation_bg", init_dyn_inflation_bias_gyro);
141 parser->parse_config(
"init_dyn_inflation_ba", init_dyn_inflation_bias_accel);
142 parser->parse_config(
"init_dyn_min_rec_cond", init_dyn_min_rec_cond);
143 std::vector<double> bias_g = {0, 0, 0};
144 std::vector<double> bias_a = {0, 0, 0};
145 parser->parse_config(
"init_dyn_bias_g", bias_g);
146 parser->parse_config(
"init_dyn_bias_a", bias_a);
147 init_dyn_bias_g << bias_g.at(0), bias_g.at(1), bias_g.at(2);
148 init_dyn_bias_a << bias_a.at(0), bias_a.at(1), bias_a.at(2);
150 PRINT_DEBUG(
" - init_window_time: %.2f\n", init_window_time);
151 PRINT_DEBUG(
" - init_imu_thresh: %.2f\n", init_imu_thresh);
152 PRINT_DEBUG(
" - init_max_disparity: %.2f\n", init_max_disparity);
153 PRINT_DEBUG(
" - init_max_features: %.2f\n", init_max_features);
154 if (init_max_features < 15) {
156 PRINT_ERROR(
RED " init_max_features = %d\n" RESET, init_max_features);
157 std::exit(EXIT_FAILURE);
159 if (init_imu_thresh <= 0.0 && !init_dyn_use) {
161 PRINT_ERROR(
RED " init_imu_thresh = %.3f\n" RESET, init_imu_thresh);
163 std::exit(EXIT_FAILURE);
165 if (init_max_disparity <= 0.0 && !init_dyn_use) {
167 PRINT_ERROR(
RED " init_max_disparity = %.3f\n" RESET, init_max_disparity);
169 std::exit(EXIT_FAILURE);
171 PRINT_DEBUG(
" - init_dyn_use: %d\n", init_dyn_use);
172 PRINT_DEBUG(
" - init_dyn_mle_opt_calib: %d\n", init_dyn_mle_opt_calib);
173 PRINT_DEBUG(
" - init_dyn_mle_max_iter: %d\n", init_dyn_mle_max_iter);
174 PRINT_DEBUG(
" - init_dyn_mle_max_threads: %d\n", init_dyn_mle_max_threads);
175 PRINT_DEBUG(
" - init_dyn_mle_max_time: %.2f\n", init_dyn_mle_max_time);
176 PRINT_DEBUG(
" - init_dyn_num_pose: %d\n", init_dyn_num_pose);
177 PRINT_DEBUG(
" - init_dyn_min_deg: %.2f\n", init_dyn_min_deg);
178 PRINT_DEBUG(
" - init_dyn_inflation_ori: %.2e\n", init_dyn_inflation_orientation);
179 PRINT_DEBUG(
" - init_dyn_inflation_vel: %.2e\n", init_dyn_inflation_velocity);
180 PRINT_DEBUG(
" - init_dyn_inflation_bg: %.2e\n", init_dyn_inflation_bias_gyro);
181 PRINT_DEBUG(
" - init_dyn_inflation_ba: %.2e\n", init_dyn_inflation_bias_accel);
182 PRINT_DEBUG(
" - init_dyn_min_rec_cond: %.2e\n", init_dyn_min_rec_cond);
183 if (init_dyn_num_pose < 4) {
185 PRINT_ERROR(
RED " init_dyn_num_pose = %d (4 min)\n" RESET, init_dyn_num_pose);
186 std::exit(EXIT_FAILURE);
217 if (parser !=
nullptr) {
218 parser->parse_external(
"relative_config_imu",
"imu0",
"gyroscope_noise_density", sigma_w);
219 parser->parse_external(
"relative_config_imu",
"imu0",
"gyroscope_random_walk", sigma_wb);
220 parser->parse_external(
"relative_config_imu",
"imu0",
"accelerometer_noise_density", sigma_a);
221 parser->parse_external(
"relative_config_imu",
"imu0",
"accelerometer_random_walk", sigma_ab);
222 parser->parse_config(
"up_slam_sigma_px", sigma_pix);
224 PRINT_DEBUG(
" - gyroscope_noise_density: %.6f\n", sigma_w);
225 PRINT_DEBUG(
" - accelerometer_noise_density: %.5f\n", sigma_a);
226 PRINT_DEBUG(
" - gyroscope_random_walk: %.7f\n", sigma_wb);
227 PRINT_DEBUG(
" - accelerometer_random_walk: %.6f\n", sigma_ab);
261 if (parser !=
nullptr) {
262 parser->parse_config(
"gravity_mag", gravity_mag);
263 parser->parse_config(
"max_cameras", num_cameras);
264 parser->parse_config(
"use_stereo", use_stereo);
265 parser->parse_config(
"downsample_cameras", downsample_cameras);
271 parser->parse_external(
"relative_config_imucam",
"cam" + std::to_string(i),
"timeshift_cam_imu", calib_camimu_dt,
false);
275 std::string dist_model =
"radtan";
276 parser->parse_external(
"relative_config_imucam",
"cam" + std::to_string(i),
"distortion_model", dist_model);
279 std::vector<double> cam_calib1 = {1, 1, 0, 0};
280 std::vector<double> cam_calib2 = {0, 0, 0, 0};
281 parser->parse_external(
"relative_config_imucam",
"cam" + std::to_string(i),
"intrinsics", cam_calib1);
282 parser->parse_external(
"relative_config_imucam",
"cam" + std::to_string(i),
"distortion_coeffs", cam_calib2);
283 Eigen::VectorXd cam_calib = Eigen::VectorXd::Zero(8);
284 cam_calib << cam_calib1.at(0), cam_calib1.at(1), cam_calib1.at(2), cam_calib1.at(3), cam_calib2.at(0), cam_calib2.at(1),
285 cam_calib2.at(2), cam_calib2.at(3);
292 std::vector<int> matrix_wh = {1, 1};
293 parser->parse_external(
"relative_config_imucam",
"cam" + std::to_string(i),
"resolution", matrix_wh);
298 Eigen::Matrix4d T_CtoI = Eigen::Matrix4d::Identity();
299 parser->parse_external(
"relative_config_imucam",
"cam" + std::to_string(i),
"T_imu_cam", T_CtoI);
302 Eigen::Matrix<double, 7, 1> cam_eigen;
304 cam_eigen.block(4, 0, 3, 1) = -T_CtoI.block(0, 0, 3, 3).transpose() * T_CtoI.block(0, 3, 3, 1);
307 if (dist_model ==
"equidistant") {
308 camera_intrinsics.insert({i, std::make_shared<ov_core::CamEqui>(matrix_wh.at(0), matrix_wh.at(1))});
309 camera_intrinsics.at(i)->set_value(cam_calib);
311 camera_intrinsics.insert({i, std::make_shared<ov_core::CamRadtan>(matrix_wh.at(0), matrix_wh.at(1))});
312 camera_intrinsics.at(i)->set_value(cam_calib);
314 camera_extrinsics.insert({i, cam_eigen});
318 PRINT_DEBUG(
" - gravity_mag: %.4f\n", gravity_mag);
319 PRINT_DEBUG(
" - gravity: %.3f, %.3f, %.3f\n", 0.0, 0.0, gravity_mag);
322 PRINT_DEBUG(
" - downsize cameras: %d\n", downsample_cameras);
323 if (num_cameras != (
int)camera_intrinsics.size() || num_cameras != (int)camera_extrinsics.size()) {
325 PRINT_ERROR(
RED "[SIM]: got %d but expected %d max cameras (camera_intrinsics)\n" RESET, (
int)camera_intrinsics.size(),
num_cameras);
326 PRINT_ERROR(
RED "[SIM]: got %d but expected %d max cameras (camera_extrinsics)\n" RESET, (
int)camera_extrinsics.size(),
num_cameras);
327 std::exit(EXIT_FAILURE);
329 PRINT_DEBUG(
" - calib_camimu_dt: %.4f\n", calib_camimu_dt);
331 std::stringstream ss;
332 ss <<
"cam_" << n <<
"_fisheye:" << (std::dynamic_pointer_cast<
ov_core::CamEqui>(camera_intrinsics.at(n)) !=
nullptr) << std::endl;
333 ss <<
"cam_" << n <<
"_wh:" << std::endl << camera_intrinsics.at(n)->w() <<
" x " << camera_intrinsics.at(n)->h() << std::endl;
334 ss <<
"cam_" << n <<
"_intrinsic(0:3):" << std::endl
335 << camera_intrinsics.at(n)->get_value().block(0, 0, 4, 1).transpose() << std::endl;
336 ss <<
"cam_" << n <<
"_intrinsic(4:7):" << std::endl
337 << camera_intrinsics.at(n)->get_value().block(4, 0, 4, 1).transpose() << std::endl;
338 ss <<
"cam_" << n <<
"_extrinsic(0:3):" << std::endl << camera_extrinsics.at(n).block(0, 0, 4, 1).transpose() << std::endl;
339 ss <<
"cam_" << n <<
"_extrinsic(4:6):" << std::endl << camera_extrinsics.at(n).block(4, 0, 3, 1).transpose() << std::endl;
340 Eigen::Matrix4d T_CtoI = Eigen::Matrix4d::Identity();
341 T_CtoI.block(0, 0, 3, 3) =
ov_core::quat_2_Rot(camera_extrinsics.at(n).block(0, 0, 4, 1)).transpose();
342 T_CtoI.block(0, 3, 3, 1) = -T_CtoI.block(0, 0, 3, 3) * camera_extrinsics.at(n).block(4, 0, 3, 1);
343 ss <<
"T_C" << n <<
"toI:" << std::endl << T_CtoI << std::endl << std::endl;
389 if (parser !=
nullptr) {
390 parser->parse_config(
"sim_seed_state_init", sim_seed_state_init);
391 parser->parse_config(
"sim_seed_preturb", sim_seed_preturb);
392 parser->parse_config(
"sim_seed_measurements", sim_seed_measurements);
393 parser->parse_config(
"sim_do_perturbation", sim_do_perturbation);
394 parser->parse_config(
"sim_traj_path", sim_traj_path);
395 parser->parse_config(
"sim_distance_threshold", sim_distance_threshold);
396 parser->parse_config(
"sim_freq_cam", sim_freq_cam);
397 parser->parse_config(
"sim_freq_imu", sim_freq_imu);
398 parser->parse_config(
"sim_min_feature_gen_dist", sim_min_feature_gen_distance);
399 parser->parse_config(
"sim_max_feature_gen_dist", sim_max_feature_gen_distance);
406 PRINT_DEBUG(
" - traj path: %s\n", sim_traj_path.c_str());
407 PRINT_DEBUG(
" - dist thresh: %.2f\n", sim_distance_threshold);
408 PRINT_DEBUG(
" - cam feq: %.2f\n", sim_freq_cam);
409 PRINT_DEBUG(
" - imu feq: %.2f\n", sim_freq_imu);
410 PRINT_DEBUG(
" - min feat dist: %.2f\n", sim_min_feature_gen_distance);
411 PRINT_DEBUG(
" - max feat dist: %.2f\n", sim_max_feature_gen_distance);
417 #endif // OV_INIT_INERTIALINITIALIZEROPTIONS_H
bool downsample_cameras
Will half the resolution all tracking image (aruco will be 1/4 instead of halved if dowsize_aruoc als...
std::string sim_traj_path
Path to the trajectory we will b-spline and simulate on. Should be time(s),pos(xyz),ori(xyzw) format.
std::map< size_t, Eigen::VectorXd > camera_extrinsics
Map between camid and camera extrinsics (q_ItoC, p_IinC).
double sim_freq_cam
Frequency (Hz) that we will simulate our cameras.
int init_dyn_mle_max_threads
Max number of MLE threads for dynamic initialization.
double init_imu_thresh
Variance threshold on our acceleration to be classified as moving.
double sigma_wb
Gyroscope random walk (rad/s^2/sqrt(hz))
double sigma_pix
Noise sigma for our raw pixel measurements.
void print_and_load_noise(const std::shared_ptr< ov_core::YamlParser > &parser=nullptr)
This function will load print out all noise parameters loaded. This allows for visual checking that e...
double sim_distance_threshold
double init_dyn_inflation_orientation
Magnitude we will inflate initial covariance of orientation.
double calib_camimu_dt
Time offset between camera and IMU (t_imu = t_cam + t_off)
int sim_seed_preturb
Seed for calibration perturbations. Change this to perturb by different random values if perturbation...
int sim_seed_measurements
double sigma_w
Gyroscope white noise (rad/s/sqrt(hz))
double sigma_a
Accelerometer white noise (m/s^2/sqrt(hz))
void print_and_load_state(const std::shared_ptr< ov_core::YamlParser > &parser=nullptr)
This function will load and print all state parameters (e.g. sensor extrinsics) This allows for visua...
State initialization code.
int init_dyn_mle_max_iter
Max number of MLE iterations for dynamic initialization.
int init_dyn_num_pose
Number of poses to use during initialization (max should be cam freq * window)
bool init_dyn_use
If we should perform dynamic initialization.
bool init_dyn_mle_opt_calib
If we should optimize and recover the calibration in our MLE.
double init_dyn_inflation_velocity
Magnitude we will inflate initial covariance of velocity.
void print_and_load_initializer(const std::shared_ptr< ov_core::YamlParser > &parser=nullptr)
This function will load print out all initializer settings loaded. This allows for visual checking th...
Eigen::Matrix< double, 4, 1 > rot_2_quat(const Eigen::Matrix< double, 3, 3 > &rot)
double sim_freq_imu
Frequency (Hz) that we will simulate our inertial measurement unit.
double sim_max_feature_gen_distance
Feature distance we generate features from (maximum)
double init_dyn_inflation_bias_accel
Magnitude we will inflate initial covariance of accelerometer bias.
double sim_min_feature_gen_distance
Feature distance we generate features from (minimum)
int init_max_features
Number of features we should try to track.
bool sim_do_perturbation
If we should perturb the calibration that the estimator starts with.
int num_cameras
Number of distinct cameras that we will observe features in.
double init_dyn_min_rec_cond
#define PRINT_WARNING(x...)
std::unordered_map< size_t, std::shared_ptr< ov_core::CamBase > > camera_intrinsics
Map between camid and camera intrinsics (fx, fy, cx, cy, d1...d4, cam_w, cam_h)
#define PRINT_ERROR(x...)
double init_dyn_min_deg
Minimum degrees we need to rotate before we try to init (sum of norm)
double init_window_time
Amount of time we will initialize over (seconds)
double gravity_mag
Gravity magnitude in the global frame (i.e. should be 9.81 typically)
bool use_stereo
If we should process two cameras are being stereo or binocular. If binocular, we do monocular feature...
int sim_seed_state_init
Seed for initial states (i.e. random feature 3d positions in the generated map)
double init_max_disparity
Max disparity we will consider the unit to be stationary.
void print_and_load_simulation(const std::shared_ptr< ov_core::YamlParser > &parser=nullptr)
This function will load print out all simulated parameters. This allows for visual checking that ever...
Eigen::Vector3d init_dyn_bias_a
Initial IMU accelerometer bias values for dynamic initialization (will be optimized) ...
Eigen::Matrix< double, 3, 3 > quat_2_Rot(const Eigen::Matrix< double, 4, 1 > &q)
#define PRINT_DEBUG(x...)
double init_dyn_mle_max_time
Max time for MLE optimization (seconds)
double init_dyn_inflation_bias_gyro
Magnitude we will inflate initial covariance of gyroscope bias.
Struct which stores all options needed for state estimation.
double sigma_ab
Accelerometer random walk (m/s^3/sqrt(hz))
Eigen::Vector3d init_dyn_bias_g
Initial IMU gyroscope bias values for dynamic initialization (will be optimized)
void print_and_load(const std::shared_ptr< ov_core::YamlParser > &parser=nullptr)
This function will load the non-simulation parameters of the system and print.