OpenVINS config file support (#1719)

This commit is contained in:
matlabbe
2026-06-13 16:20:37 -07:00
committed by GitHub
parent 1dddb350b9
commit 9f464db7c9
8 changed files with 293 additions and 137 deletions

View File

@@ -842,22 +842,7 @@ IF(WITH_VINS_FUSION)
ENDIF(WITH_VINS_FUSION) ENDIF(WITH_VINS_FUSION)
IF(WITH_OPENVINS) IF(WITH_OPENVINS)
FIND_PACKAGE(ov_msckf) FIND_PACKAGE(OpenVINS)
# On ROS2, the indirect includes and libraries
# are not forwarded by ov_msckf target, append them manually
FIND_PACKAGE(ov_core)
FIND_PACKAGE(ov_init)
IF(ov_msckf_FOUND AND ov_core_FOUND AND ov_init_FOUND)
SET(ov_msckf_INCLUDE_DIRS
${ov_msckf_INCLUDE_DIRS}
${ov_core_INCLUDE_DIRS}
${ov_init_INCLUDE_DIRS})
SET(ov_msckf_LIBRARIES
${ov_msckf_LIBRARIES}
${ov_core_LIBRARIES}
${ov_init_LIBRARIES})
MESSAGE(STATUS "Found OpenVINS: ${ov_msckf_INCLUDE_DIRS}")
ENDIF()
ENDIF(WITH_OPENVINS) ENDIF(WITH_OPENVINS)
IF(WITH_FASTCV) IF(WITH_FASTCV)
@@ -1223,7 +1208,7 @@ ENDIF()
IF(NOT vins_FOUND) IF(NOT vins_FOUND)
SET(VINSFUSION "//") SET(VINSFUSION "//")
ENDIF() ENDIF()
IF(NOT ov_msckf_FOUND) IF(NOT OpenVINS_FOUND)
SET(OPENVINS "//") SET(OPENVINS "//")
ENDIF() ENDIF()
IF(NOT CUVSLAM_FOUND) IF(NOT CUVSLAM_FOUND)
@@ -1981,7 +1966,7 @@ ELSE()
MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion not found)") MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion not found)")
ENDIF() ENDIF()
IF(ov_msckf_FOUND) IF(OpenVINS_FOUND)
MESSAGE(STATUS " With OpenVINS = YES (License: GPLv3)") MESSAGE(STATUS " With OpenVINS = YES (License: GPLv3)")
ELSEIF(NOT WITH_OPENVINS) ELSEIF(NOT WITH_OPENVINS)
MESSAGE(STATUS " With OpenVINS = NO (WITH_OPENVINS=OFF)") MESSAGE(STATUS " With OpenVINS = NO (WITH_OPENVINS=OFF)")

View File

@@ -0,0 +1,44 @@
# Find OpenVINS
#
# We search for a vins installation in ROS/ROS2 first, then fallback on
# ros-free library in common install paths
FIND_PACKAGE(ov_msckf QUIET)
IF(ov_msckf_FOUND)
# On ROS2, the indirect includes and libraries
# are not forwarded by ov_msckf target, append them manually
FIND_PACKAGE(ov_core)
FIND_PACKAGE(ov_init)
IF(ov_msckf_FOUND AND ov_core_FOUND AND ov_init_FOUND)
SET(OpenVINS_FOUND TRUE)
SET(OpenVINS_INCLUDE_DIRS
${ov_msckf_INCLUDE_DIRS}
${ov_core_INCLUDE_DIRS}
${ov_init_INCLUDE_DIRS})
SET(OpenVINS_LIBRARIES
${ov_msckf_LIBRARIES}
${ov_core_LIBRARIES}
${ov_init_LIBRARIES})
ENDIF()
ELSE()
find_path(OpenVINS_INCLUDE_DIR NAMES core/VioManager.h PATH_SUFFIXES open_vins)
find_library(OpenVINS_LIBRARY NAMES ov_msckf_lib)
IF (OpenVINS_INCLUDE_DIR AND OpenVINS_LIBRARY)
SET(OpenVINS_FOUND TRUE)
SET(OpenVINS_INCLUDE_DIRS ${OpenVINS_INCLUDE_DIR})
SET(OpenVINS_LIBRARIES ${OpenVINS_LIBRARY})
ENDIF()
ENDIF()
IF (OpenVINS_FOUND)
# show which OpenVINS was found only if not quiet
IF (NOT OpenVINS_FIND_QUIETLY)
MESSAGE(STATUS "Found OpenVINS: ${OpenVINS_LIBRARIES} ${OpenVINS_INCLUDE_DIRS}")
ENDIF (NOT OpenVINS_FIND_QUIETLY)
ELSE (OpenVINS_FOUND)
# fatal error if OpenVINS is required but not found
IF (OpenVINS_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find OpenVINS")
ENDIF (OpenVINS_FIND_REQUIRED)
ENDIF (OpenVINS_FOUND)

View File

@@ -620,66 +620,67 @@ class RTABMAP_CORE_EXPORT Parameters
RTABMAP_PARAM_STR(OdomVINSFusion, ConfigPath, "", "Path of VINS-Fusion config file."); RTABMAP_PARAM_STR(OdomVINSFusion, ConfigPath, "", "Path of VINS-Fusion config file.");
// Odometry OpenVINS // Odometry OpenVINS
RTABMAP_PARAM(OdomOpenVINS, UseStereo, bool, true, "If we have more than 1 camera, if we should try to track stereo constraints between pairs"); RTABMAP_PARAM_STR(OdomOpenVINS, ConfigPath, "", "Path of OpenVINS config file (*.yaml). Same format used than OpenVINS library. Note that any parameter from that config file will overwrite the same parameter in OdomOpenVINS group.");
RTABMAP_PARAM(OdomOpenVINS, UseKLT, bool, true, "If true we will use KLT, otherwise use a ORB descriptor + robust matching"); RTABMAP_PARAM(OdomOpenVINS, UseStereo, bool, true, "If we have more than 1 camera, if we should try to track stereo constraints between pairs.");
RTABMAP_PARAM(OdomOpenVINS, NumPts, int, 200, "Number of points (per camera) we will extract and try to track"); RTABMAP_PARAM(OdomOpenVINS, UseKLT, bool, true, "If true we will use KLT, otherwise use a ORB descriptor + robust matching.");
RTABMAP_PARAM(OdomOpenVINS, MinPxDist, int, 15, "Eistance between features (features near each other provide less information)"); RTABMAP_PARAM(OdomOpenVINS, NumPts, int, 200, "Number of points (per camera) we will extract and try to track.");
RTABMAP_PARAM(OdomOpenVINS, FiTriangulate1d, bool, false, "If we should perform 1d triangulation instead of 3d"); RTABMAP_PARAM(OdomOpenVINS, MinPxDist, int, 15, "Eistance between features (features near each other provide less information).");
RTABMAP_PARAM(OdomOpenVINS, FiRefineFeatures, bool, true, "If we should perform Levenberg-Marquardt refinement"); RTABMAP_PARAM(OdomOpenVINS, FiTriangulate1d, bool, false, "If we should perform 1d triangulation instead of 3d.");
RTABMAP_PARAM(OdomOpenVINS, FiMaxRuns, int, 5, "Max runs for Levenberg-Marquardt"); RTABMAP_PARAM(OdomOpenVINS, FiRefineFeatures, bool, true, "If we should perform Levenberg-Marquardt refinement.");
RTABMAP_PARAM(OdomOpenVINS, FiMaxBaseline, double, 40, "Max baseline ratio to accept triangulated features"); RTABMAP_PARAM(OdomOpenVINS, FiMaxRuns, int, 5, "Max runs for Levenberg-Marquardt.");
RTABMAP_PARAM(OdomOpenVINS, FiMaxCondNumber, double, 10000, "Max condition number of linear triangulation matrix accept triangulated features"); RTABMAP_PARAM(OdomOpenVINS, FiMaxBaseline, double, 40, "Max baseline ratio to accept triangulated features.");
RTABMAP_PARAM(OdomOpenVINS, FiMaxCondNumber, double, 10000, "Max condition number of linear triangulation matrix accept triangulated features.");
RTABMAP_PARAM(OdomOpenVINS, UseFEJ, bool, true, "If first-estimate Jacobians should be used (enable for good consistency)"); RTABMAP_PARAM(OdomOpenVINS, UseFEJ, bool, true, "If first-estimate Jacobians should be used (enable for good consistency).");
RTABMAP_PARAM(OdomOpenVINS, Integration, int, 1, "0=discrete, 1=rk4, 2=analytical (if rk4 or analytical used then analytical covariance propagation is used)"); RTABMAP_PARAM(OdomOpenVINS, Integration, int, 1, "0=discrete, 1=rk4, 2=analytical (if rk4 or analytical used then analytical covariance propagation is used).");
RTABMAP_PARAM(OdomOpenVINS, CalibCamExtrinsics, bool, false, "Bool to determine whether or not to calibrate imu-to-camera pose"); RTABMAP_PARAM(OdomOpenVINS, CalibCamExtrinsics, bool, false, "Bool to determine whether or not to calibrate imu-to-camera pose.");
RTABMAP_PARAM(OdomOpenVINS, CalibCamIntrinsics, bool, false, "Bool to determine whether or not to calibrate camera intrinsics"); RTABMAP_PARAM(OdomOpenVINS, CalibCamIntrinsics, bool, false, "Bool to determine whether or not to calibrate camera intrinsics.");
RTABMAP_PARAM(OdomOpenVINS, CalibCamTimeoffset, bool, false, "Bool to determine whether or not to calibrate camera to IMU time offset"); RTABMAP_PARAM(OdomOpenVINS, CalibCamTimeoffset, bool, false, "Bool to determine whether or not to calibrate camera to IMU time offset.");
RTABMAP_PARAM(OdomOpenVINS, CalibIMUIntrinsics, bool, false, "Bool to determine whether or not to calibrate the IMU intrinsics"); RTABMAP_PARAM(OdomOpenVINS, CalibIMUIntrinsics, bool, false, "Bool to determine whether or not to calibrate the IMU intrinsics.");
RTABMAP_PARAM(OdomOpenVINS, CalibIMUGSensitivity, bool, false, "Bool to determine whether or not to calibrate the Gravity sensitivity"); RTABMAP_PARAM(OdomOpenVINS, CalibIMUGSensitivity, bool, false, "Bool to determine whether or not to calibrate the Gravity sensitivity.");
RTABMAP_PARAM(OdomOpenVINS, MaxClones, int, 11, "Max clone size of sliding window"); RTABMAP_PARAM(OdomOpenVINS, MaxClones, int, 11, "Max clone size of sliding window.");
RTABMAP_PARAM(OdomOpenVINS, MaxSLAM, int, 50, "Max number of estimated SLAM features"); RTABMAP_PARAM(OdomOpenVINS, MaxSLAM, int, 50, "Max number of estimated SLAM features.");
RTABMAP_PARAM(OdomOpenVINS, MaxSLAMInUpdate, int, 25, "Max number of SLAM features we allow to be included in a single EKF update."); RTABMAP_PARAM(OdomOpenVINS, MaxSLAMInUpdate, int, 25, "Max number of SLAM features we allow to be included in a single EKF update..");
RTABMAP_PARAM(OdomOpenVINS, MaxMSCKFInUpdate, int, 50, "Max number of MSCKF features we will use at a given image timestep."); RTABMAP_PARAM(OdomOpenVINS, MaxMSCKFInUpdate, int, 50, "Max number of MSCKF features we will use at a given image timestep..");
RTABMAP_PARAM(OdomOpenVINS, FeatRepMSCKF, int, 0, "What representation our features are in (msckf features)"); RTABMAP_PARAM(OdomOpenVINS, FeatRepMSCKF, int, 0, "What representation our features are in (msckf features).");
RTABMAP_PARAM(OdomOpenVINS, FeatRepSLAM, int, 4, "What representation our features are in (slam features)"); RTABMAP_PARAM(OdomOpenVINS, FeatRepSLAM, int, 4, "What representation our features are in (slam features).");
RTABMAP_PARAM(OdomOpenVINS, DtSLAMDelay, double, 0.0, "Delay, in seconds, that we should wait from init before we start estimating SLAM features"); RTABMAP_PARAM(OdomOpenVINS, DtSLAMDelay, double, 0.0, "Delay, in seconds, that we should wait from init before we start estimating SLAM features.");
RTABMAP_PARAM(OdomOpenVINS, GravityMag, double, 9.81, "Gravity magnitude in the global frame (i.e. should be 9.81 typically)"); RTABMAP_PARAM(OdomOpenVINS, GravityMag, double, 9.81, "Gravity magnitude in the global frame (i.e. should be 9.81 typically).");
RTABMAP_PARAM_STR(OdomOpenVINS, LeftMaskPath, "", "Mask for left image"); RTABMAP_PARAM_STR(OdomOpenVINS, LeftMaskPath, "", "Mask for left image.");
RTABMAP_PARAM_STR(OdomOpenVINS, RightMaskPath, "", "Mask for right image"); RTABMAP_PARAM_STR(OdomOpenVINS, RightMaskPath, "", "Mask for right image.");
RTABMAP_PARAM(OdomOpenVINS, InitWindowTime, double, 2.0, "Amount of time we will initialize over (seconds)"); RTABMAP_PARAM(OdomOpenVINS, InitWindowTime, double, 2.0, "Amount of time we will initialize over (seconds).");
RTABMAP_PARAM(OdomOpenVINS, InitIMUThresh, double, 1.0, "Variance threshold on our acceleration to be classified as moving"); RTABMAP_PARAM(OdomOpenVINS, InitIMUThresh, double, 1.0, "Variance threshold on our acceleration to be classified as moving.");
RTABMAP_PARAM(OdomOpenVINS, InitMaxDisparity, double, 10.0, "Max disparity to consider the platform stationary (dependent on resolution)"); RTABMAP_PARAM(OdomOpenVINS, InitMaxDisparity, double, 10.0, "Max disparity to consider the platform stationary (dependent on resolution).");
RTABMAP_PARAM(OdomOpenVINS, InitMaxFeatures, int, 50, "How many features to track during initialization (saves on computation)"); RTABMAP_PARAM(OdomOpenVINS, InitMaxFeatures, int, 50, "How many features to track during initialization (saves on computation).");
RTABMAP_PARAM(OdomOpenVINS, InitDynUse, bool, false, "If dynamic initialization should be used"); RTABMAP_PARAM(OdomOpenVINS, InitDynUse, bool, false, "If dynamic initialization should be used.");
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEOptCalib, bool, false, "If we should optimize calibration during intialization (not recommended)"); RTABMAP_PARAM(OdomOpenVINS, InitDynMLEOptCalib, bool, false, "If we should optimize calibration during intialization (not recommended).");
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxIter, int, 50, "How many iterations the MLE refinement should use (zero to skip the MLE)"); RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxIter, int, 50, "How many iterations the MLE refinement should use (zero to skip the MLE).");
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxTime, double, 0.05, "How many seconds the MLE should be completed in"); RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxTime, double, 0.05, "How many seconds the MLE should be completed in.");
RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxThreads, int, 6, "How many threads the MLE should use"); RTABMAP_PARAM(OdomOpenVINS, InitDynMLEMaxThreads, int, 6, "How many threads the MLE should use.");
RTABMAP_PARAM(OdomOpenVINS, InitDynNumPose, int, 6, "Number of poses to use within our window time (evenly spaced)"); RTABMAP_PARAM(OdomOpenVINS, InitDynNumPose, int, 6, "Number of poses to use within our window time (evenly spaced).");
RTABMAP_PARAM(OdomOpenVINS, InitDynMinDeg, double, 10.0, "Orientation change needed to try to init"); RTABMAP_PARAM(OdomOpenVINS, InitDynMinDeg, double, 10.0, "Orientation change needed to try to init.");
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationOri, double, 10.0, "What to inflate the recovered q_GtoI covariance by"); RTABMAP_PARAM(OdomOpenVINS, InitDynInflationOri, double, 10.0, "What to inflate the recovered q_GtoI covariance by.");
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationVel, double, 100.0, "What to inflate the recovered v_IinG covariance by"); RTABMAP_PARAM(OdomOpenVINS, InitDynInflationVel, double, 100.0, "What to inflate the recovered v_IinG covariance by.");
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBg, double, 10.0, "What to inflate the recovered bias_g covariance by"); RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBg, double, 10.0, "What to inflate the recovered bias_g covariance by.");
RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBa, double, 100.0, "What to inflate the recovered bias_a covariance by"); RTABMAP_PARAM(OdomOpenVINS, InitDynInflationBa, double, 100.0, "What to inflate the recovered bias_a covariance by.");
RTABMAP_PARAM(OdomOpenVINS, InitDynMinRecCond, double, 1e-15, "Reciprocal condition number thresh for info inversion"); RTABMAP_PARAM(OdomOpenVINS, InitDynMinRecCond, double, 1e-15, "Reciprocal condition number thresh for info inversion.");
RTABMAP_PARAM(OdomOpenVINS, TryZUPT, bool, true, "If we should try to use zero velocity update"); RTABMAP_PARAM(OdomOpenVINS, TryZUPT, bool, true, "If we should try to use zero velocity update.");
RTABMAP_PARAM(OdomOpenVINS, ZUPTChi2Multiplier, double, 0.0, "Chi2 multiplier for zero velocity"); RTABMAP_PARAM(OdomOpenVINS, ZUPTChi2Multiplier, double, 0.0, "Chi2 multiplier for zero velocity.");
RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxVelodicy, double, 0.1, "Max velocity we will consider to try to do a zupt (i.e. if above this, don't do zupt)"); RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxVelodicy, double, 0.1, "Max velocity we will consider to try to do a zupt (i.e. if above this, don't do zupt).");
RTABMAP_PARAM(OdomOpenVINS, ZUPTNoiseMultiplier, double, 10.0, "Multiplier of our zupt measurement IMU noise matrix (default should be 1.0)"); RTABMAP_PARAM(OdomOpenVINS, ZUPTNoiseMultiplier, double, 10.0, "Multiplier of our zupt measurement IMU noise matrix (default should be 1.0).");
RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxDisparity, double, 0.5, "Max disparity we will consider to try to do a zupt (i.e. if above this, don't do zupt)"); RTABMAP_PARAM(OdomOpenVINS, ZUPTMaxDisparity, double, 0.5, "Max disparity we will consider to try to do a zupt (i.e. if above this, don't do zupt).");
RTABMAP_PARAM(OdomOpenVINS, ZUPTOnlyAtBeginning, bool, false, "If we should only use the zupt at the very beginning static initialization phase"); RTABMAP_PARAM(OdomOpenVINS, ZUPTOnlyAtBeginning, bool, false, "If we should only use the zupt at the very beginning static initialization phase.");
RTABMAP_PARAM(OdomOpenVINS, AccelerometerNoiseDensity, double, 0.01, "[m/s^2/sqrt(Hz)] (accel \"white noise\")"); RTABMAP_PARAM(OdomOpenVINS, AccelerometerNoiseDensity, double, 0.01, "[m/s^2/sqrt(Hz)] (accel \"white noise\").");
RTABMAP_PARAM(OdomOpenVINS, AccelerometerRandomWalk, double, 0.001, "[m/s^3/sqrt(Hz)] (accel bias diffusion)"); RTABMAP_PARAM(OdomOpenVINS, AccelerometerRandomWalk, double, 0.001, "[m/s^3/sqrt(Hz)] (accel bias diffusion).");
RTABMAP_PARAM(OdomOpenVINS, GyroscopeNoiseDensity, double, 0.001, "[rad/s/sqrt(Hz)] (gyro \"white noise\")"); RTABMAP_PARAM(OdomOpenVINS, GyroscopeNoiseDensity, double, 0.001, "[rad/s/sqrt(Hz)] (gyro \"white noise\").");
RTABMAP_PARAM(OdomOpenVINS, GyroscopeRandomWalk, double, 0.0001, "[rad/s^2/sqrt(Hz)] (gyro bias diffusion)"); RTABMAP_PARAM(OdomOpenVINS, GyroscopeRandomWalk, double, 0.0001, "[rad/s^2/sqrt(Hz)] (gyro bias diffusion).");
RTABMAP_PARAM(OdomOpenVINS, UpMSCKFSigmaPx, double, 1.0, "Pixel noise for MSCKF features"); RTABMAP_PARAM(OdomOpenVINS, UpMSCKFSigmaPx, double, 1.0, "Pixel noise for MSCKF features.");
RTABMAP_PARAM(OdomOpenVINS, UpMSCKFChi2Multiplier, double, 1.0, "Chi2 multiplier for MSCKF features"); RTABMAP_PARAM(OdomOpenVINS, UpMSCKFChi2Multiplier, double, 1.0, "Chi2 multiplier for MSCKF features.");
RTABMAP_PARAM(OdomOpenVINS, UpSLAMSigmaPx, double, 1.0, "Pixel noise for SLAM features"); RTABMAP_PARAM(OdomOpenVINS, UpSLAMSigmaPx, double, 1.0, "Pixel noise for SLAM features.");
RTABMAP_PARAM(OdomOpenVINS, UpSLAMChi2Multiplier, double, 1.0, "Chi2 multiplier for SLAM features"); RTABMAP_PARAM(OdomOpenVINS, UpSLAMChi2Multiplier, double, 1.0, "Chi2 multiplier for SLAM features.");
// Odometry Open3D // Odometry Open3D
RTABMAP_PARAM(OdomOpen3D, MaxDepth, float, 3.0, "Maximum depth."); RTABMAP_PARAM(OdomOpen3D, MaxDepth, float, 3.0, "Maximum depth.");

View File

@@ -781,16 +781,16 @@ IF(vins_FOUND)
) )
ENDIF(vins_FOUND) ENDIF(vins_FOUND)
IF(ov_msckf_FOUND) IF(OpenVINS_FOUND)
SET(INCLUDE_DIRS SET(INCLUDE_DIRS
${ov_msckf_INCLUDE_DIRS} ${OpenVINS_INCLUDE_DIRS}
${INCLUDE_DIRS} ${INCLUDE_DIRS}
) )
SET(LIBRARIES SET(LIBRARIES
${ov_msckf_LIBRARIES} ${OpenVINS_LIBRARIES}
${LIBRARIES} ${LIBRARIES}
) )
ENDIF(ov_msckf_FOUND) ENDIF(OpenVINS_FOUND)
IF(ORB_SLAM_FOUND) IF(ORB_SLAM_FOUND)
SET(INCLUDE_DIRS SET(INCLUDE_DIRS

View File

@@ -152,6 +152,85 @@ OdometryOpenVINS::OdometryOpenVINS(const ParametersMap & parameters) :
params_->init_options.sigma_wb = params_->imu_noises.sigma_wb; params_->init_options.sigma_wb = params_->imu_noises.sigma_wb;
params_->init_options.sigma_pix = params_->slam_options.sigma_pix; params_->init_options.sigma_pix = params_->slam_options.sigma_pix;
params_->init_options.gravity_mag = params_->gravity_mag; params_->init_options.gravity_mag = params_->gravity_mag;
if(parameters.find(Parameters::kOdomOpenVINSConfigPath()) != parameters.end())
{
// Load the config: will override all parameters above!
std::string configPath = parameters.at(Parameters::kOdomOpenVINSConfigPath());
if(!configPath.empty())
{
if(UFile::exists(configPath))
{
UWARN("OpenVINS config file is provided (%s=\"%s\"), reading it. The parameters from the config file will overwrite OdomOpenVINS/*** parameters.",
Parameters::kOdomOpenVINSConfigPath().c_str(), configPath.c_str());
auto parser = std::make_shared<ov_core::YamlParser>(configPath);
// The sequence of loading is based on VioManagerOptions::print_and_load()
// We removed all parts about intrinsics/extrinsics, which will be loaded later
// when we receive the data (which should already include intrinsics and extrinsics).
params_->state_options.print(parser);
params_->init_options.print_and_load_initializer(parser);
params_->init_options.print_and_load_noise(parser);
parser->parse_config("gravity_mag", params_->init_options.gravity_mag);
parser->parse_config("max_cameras", params_->init_options.num_cameras);
parser->parse_config("use_stereo", params_->init_options.use_stereo);
parser->parse_config("downsample_cameras", params_->init_options.downsample_cameras);
parser->parse_config("dt_slam_delay", params_->dt_slam_delay);
parser->parse_config("try_zupt", params_->try_zupt);
parser->parse_config("zupt_max_velocity",params_-> zupt_max_velocity);
parser->parse_config("zupt_noise_multiplier", params_->zupt_noise_multiplier);
parser->parse_config("zupt_max_disparity", params_->zupt_max_disparity);
parser->parse_config("zupt_only_at_beginning", params_->zupt_only_at_beginning);
parser->parse_config("record_timing_information", params_->record_timing_information);
parser->parse_config("record_timing_filepath", params_->record_timing_filepath);
params_->print_and_load_trackers(parser);
params_->print_and_load_noise(parser);
if(params_->state_options.num_cameras > 2)
{
UFATAL("OpenVINS integration in RTAB-Map doesn't support more than 2 cameras (num_cameras=%d).", params_->state_options.num_cameras);
}
parser->parse_config("gravity_mag", params_->gravity_mag);
parser->parse_config("use_mask", params_->use_mask);
params_->masks.clear();
if (params_->use_mask) {
for (int i = 0; i < params_->state_options.num_cameras; i++) {
std::string mask_path;
std::string mask_node = "mask" + std::to_string(i);
parser->parse_config(mask_node, mask_path);
std::string total_mask_path = parser->get_config_folder() + mask_path;
if (!boost::filesystem::exists(total_mask_path)) {
PRINT_ERROR(RED "VioManager(): invalid mask path:\n" RESET);
PRINT_ERROR(RED "\t- mask%d - %s\n" RESET, i, total_mask_path.c_str());
std::exit(EXIT_FAILURE);
}
params_->masks.emplace(i, cv::imread(total_mask_path, cv::IMREAD_GRAYSCALE));
}
}
if (!parser->successful()) {
UWARN("Not all expected OpenVINS parameters were read successfully "
"from \"%s\". Values from RTAB-Map's OpenOpenVINS/* parameters "
"will be used instead for the missing ones.",
configPath.c_str());
}
else {
UINFO("OpenVINS config file(%s=\"%s\") read.",
Parameters::kOdomOpenVINSConfigPath().c_str(), configPath.c_str());
}
}
else
{
UERROR("OpenVINS config file is provided (%s=\"%s\") but it doesn't exist!",
Parameters::kOdomOpenVINSConfigPath().c_str(), configPath.c_str());
}
}
}
#endif #endif
} }

View File

@@ -372,6 +372,7 @@ private Q_SLOTS:
void changeOdometryORBSLAMVocabulary(); void changeOdometryORBSLAMVocabulary();
void changeOdometryOKVISConfigPath(); void changeOdometryOKVISConfigPath();
void changeOdometryVINSFusionConfigPath(); void changeOdometryVINSFusionConfigPath();
void changeOdometryOpenVINSConfigPath();
void changeOdometryLIOSAMConfigPath(); void changeOdometryLIOSAMConfigPath();
void changeOdometryOpenVINSLeftMask(); void changeOdometryOpenVINSLeftMask();
void changeOdometryOpenVINSRightMask(); void changeOdometryOpenVINSRightMask();

View File

@@ -1617,6 +1617,8 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
connect(_ui->toolButton_OdomVinsFusionPath, SIGNAL(clicked()), this, SLOT(changeOdometryVINSFusionConfigPath())); connect(_ui->toolButton_OdomVinsFusionPath, SIGNAL(clicked()), this, SLOT(changeOdometryVINSFusionConfigPath()));
// Odometry OpenVINS // Odometry OpenVINS
_ui->lineEdit_openvinsConfigPath->setObjectName(Parameters::kOdomOpenVINSConfigPath().c_str());
connect(_ui->toolButton_openvinsConfigPath, SIGNAL(clicked()), this, SLOT(changeOdometryOpenVINSConfigPath()));
_ui->checkBox_OdomOpenVINSUseStereo->setObjectName(Parameters::kOdomOpenVINSUseStereo().c_str()); _ui->checkBox_OdomOpenVINSUseStereo->setObjectName(Parameters::kOdomOpenVINSUseStereo().c_str());
_ui->checkBox_OdomOpenVINSUseKLT->setObjectName(Parameters::kOdomOpenVINSUseKLT().c_str()); _ui->checkBox_OdomOpenVINSUseKLT->setObjectName(Parameters::kOdomOpenVINSUseKLT().c_str());
_ui->spinBox_OdomOpenVINSNumPts->setObjectName(Parameters::kOdomOpenVINSNumPts().c_str()); _ui->spinBox_OdomOpenVINSNumPts->setObjectName(Parameters::kOdomOpenVINSNumPts().c_str());
@@ -5792,6 +5794,23 @@ void PreferencesDialog::changeOdometryVINSFusionConfigPath()
} }
} }
void PreferencesDialog::changeOdometryOpenVINSConfigPath()
{
QString path;
if(_ui->lineEdit_openvinsConfigPath->text().isEmpty())
{
path = QFileDialog::getOpenFileName(this, tr("OpenVINS Config"), this->getWorkingDirectory(), tr("OpenVINS config (*.yaml)"));
}
else
{
path = QFileDialog::getOpenFileName(this, tr("OpenVINS Config"), _ui->lineEdit_openvinsConfigPath->text(), tr("OpenVINS config (*.yaml)"));
}
if(!path.isEmpty())
{
_ui->lineEdit_openvinsConfigPath->setText(path);
}
}
void PreferencesDialog::changeOdometryLIOSAMConfigPath() void PreferencesDialog::changeOdometryLIOSAMConfigPath()
{ {
QString path; QString path;

View File

@@ -63,7 +63,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>-648</y>
<width>684</width> <width>684</width>
<height>5218</height> <height>5218</height>
</rect> </rect>
@@ -95,7 +95,7 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>18</number> <number>19</number>
</property> </property>
<widget class="QWidget" name="page_22"> <widget class="QWidget" name="page_22">
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0"> <layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0">
@@ -16763,7 +16763,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item> <item>
<widget class="QStackedWidget" name="stackedWidget_odometryType"> <widget class="QStackedWidget" name="stackedWidget_odometryType">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>10</number>
</property> </property>
<widget class="QWidget" name="page_52"> <widget class="QWidget" name="page_52">
<layout class="QVBoxLayout" name="verticalLayout_77"> <layout class="QVBoxLayout" name="verticalLayout_77">
@@ -20388,7 +20388,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<property name="title"> <property name="title">
<string>OpenVINS</string> <string>OpenVINS</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_161" stretch="0,0,0,0,0,0"> <layout class="QVBoxLayout" name="verticalLayout_161">
<item> <item>
<widget class="QLabel" name="label_632"> <widget class="QLabel" name="label_632">
<property name="text"> <property name="text">
@@ -20405,6 +20405,33 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
</property> </property>
</widget> </widget>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_19" stretch="0,0,1">
<item>
<widget class="QToolButton" name="toolButton_openvinsConfigPath">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_openvinsConfigPath"/>
</item>
<item>
<widget class="QLabel" name="label_796">
<property name="text">
<string>Configuration file (*.yaml). Same format used than OpenVINS library. Note that any parameter from that config file will overwrite the same parameter below.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<widget class="QGroupBox" name="groupBox_36"> <widget class="QGroupBox" name="groupBox_36">
<property name="title"> <property name="title">
@@ -20421,7 +20448,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_682"> <widget class="QLabel" name="label_682">
<property name="text"> <property name="text">
<string>If we should process two cameras are being stereo or binocular. If binocular, we do monocular feature tracking on each image.</string> <string>Stereo mode. If we should process two cameras are being stereo or binocular. If binocular, we do monocular feature tracking on each image. Ignored if provided input data is not stereo.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20441,7 +20468,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_683"> <widget class="QLabel" name="label_683">
<property name="text"> <property name="text">
<string>If we should use KLT tracking, or descriptor matcher</string> <string>KLT tracking. Uncheck to use descriptor matcher.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20467,7 +20494,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLabel" name="label_684"> <widget class="QLabel" name="label_684">
<property name="text"> <property name="text">
<string>Number of points (per camera) we will extract and try to track</string> <string>Number of points (per camera) we will extract and try to track.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20490,7 +20517,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_688"> <widget class="QLabel" name="label_688">
<property name="text"> <property name="text">
<string>Will check after doing KLT track and remove any features closer than this</string> <string>Minimum pixel distance. Will check after doing KLT track and remove any features closer than this.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20510,7 +20537,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLabel" name="label_689"> <widget class="QLabel" name="label_689">
<property name="text"> <property name="text">
<string>If we should perform 1d triangulation instead of 3d</string> <string>If we should perform 1d triangulation instead of 3d.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20530,7 +20557,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLabel" name="label_732"> <widget class="QLabel" name="label_732">
<property name="text"> <property name="text">
<string>If we should perform Levenberg-Marquardt refinement</string> <string>If we should perform Levenberg-Marquardt refinement.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20553,7 +20580,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="6" column="1"> <item row="6" column="1">
<widget class="QLabel" name="label_733"> <widget class="QLabel" name="label_733">
<property name="text"> <property name="text">
<string>Max runs for Levenberg-Marquardt</string> <string>Max runs for Levenberg-Marquardt.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20579,7 +20606,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="7" column="1"> <item row="7" column="1">
<widget class="QLabel" name="label_734"> <widget class="QLabel" name="label_734">
<property name="text"> <property name="text">
<string>Max baseline ratio to accept triangulated features</string> <string>Max baseline ratio to accept triangulated features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20605,7 +20632,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="8" column="1"> <item row="8" column="1">
<widget class="QLabel" name="label_735"> <widget class="QLabel" name="label_735">
<property name="text"> <property name="text">
<string>Max condition number of linear triangulation matrix accept triangulated features</string> <string>Max condition number of linear triangulation matrix accept triangulated features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20634,7 +20661,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_690"> <widget class="QLabel" name="label_690">
<property name="text"> <property name="text">
<string>If first-estimate Jacobians should be used (enable for good consistency)</string> <string>If first-estimate Jacobians should be used (enable for good consistency).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20672,7 +20699,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_691"> <widget class="QLabel" name="label_691">
<property name="text"> <property name="text">
<string>Numerical integration methods</string> <string>Numerical integration methods.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20692,7 +20719,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLabel" name="label_685"> <widget class="QLabel" name="label_685">
<property name="text"> <property name="text">
<string>If the transform between camera and IMU should be optimized (R_ItoC, p_CinI)</string> <string>If the transform between camera and IMU should be optimized (R_ItoC, p_CinI).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20712,7 +20739,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_686"> <widget class="QLabel" name="label_686">
<property name="text"> <property name="text">
<string>If camera intrinsics should be optimized (focal, center, distortion)</string> <string>If camera intrinsics should be optimized (focal, center, distortion).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20732,7 +20759,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLabel" name="label_687"> <widget class="QLabel" name="label_687">
<property name="text"> <property name="text">
<string>If timeoffset between camera and IMU should be optimized</string> <string>If timeoffset between camera and IMU should be optimized.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20752,7 +20779,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLabel" name="label_718"> <widget class="QLabel" name="label_718">
<property name="text"> <property name="text">
<string>If imu intrinsics should be calibrated (rotation and skew-scale matrix)</string> <string>If imu intrinsics should be calibrated (rotation and skew-scale matrix).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20772,7 +20799,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="6" column="1"> <item row="6" column="1">
<widget class="QLabel" name="label_719"> <widget class="QLabel" name="label_719">
<property name="text"> <property name="text">
<string>If gyroscope gravity sensitivity (Tg) should be calibrated</string> <string>If gyroscope gravity sensitivity (Tg) should be calibrated.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20795,7 +20822,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="7" column="1"> <item row="7" column="1">
<widget class="QLabel" name="label_692"> <widget class="QLabel" name="label_692">
<property name="text"> <property name="text">
<string>Max clone size of sliding window</string> <string>Max clone size of sliding window.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20821,7 +20848,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="8" column="1"> <item row="8" column="1">
<widget class="QLabel" name="label_693"> <widget class="QLabel" name="label_693">
<property name="text"> <property name="text">
<string>Max number of estimated SLAM features</string> <string>Max number of estimated SLAM features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20926,7 +20953,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="11" column="1"> <item row="11" column="1">
<widget class="QLabel" name="label_696"> <widget class="QLabel" name="label_696">
<property name="text"> <property name="text">
<string>What representation our features are in (msckf features)</string> <string>What representation our features are in (msckf features).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -20942,7 +20969,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<number>4</number> <number>4</number>
</property> </property>
<property name="sizeAdjustPolicy"> <property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum> <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property> </property>
<item> <item>
<property name="text"> <property name="text">
@@ -20979,7 +21006,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="12" column="1"> <item row="12" column="1">
<widget class="QLabel" name="label_697"> <widget class="QLabel" name="label_697">
<property name="text"> <property name="text">
<string>What representation our features are in (slam features)</string> <string>What representation our features are in (slam features).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21008,7 +21035,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="13" column="1"> <item row="13" column="1">
<widget class="QLabel" name="label_698"> <widget class="QLabel" name="label_698">
<property name="text"> <property name="text">
<string>Delay before initializing (helps with stability from bad initialization...)</string> <string>Delay before initializing (helps with stability from bad initialization...).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21034,7 +21061,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="14" column="1"> <item row="14" column="1">
<widget class="QLabel" name="label_699"> <widget class="QLabel" name="label_699">
<property name="text"> <property name="text">
<string>Magnitude of gravity in this location</string> <string>Magnitude of gravity in this location.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21061,7 +21088,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="15" column="1"> <item row="15" column="1">
<widget class="QLabel" name="label_736"> <widget class="QLabel" name="label_736">
<property name="text"> <property name="text">
<string>Mask for left image</string> <string>Mask for left image (stereo mode) or mono image (RGB-D mode). For RGB-D mode, to use depth as mask, enable that option under Visual Registration panel.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21088,7 +21115,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="16" column="1"> <item row="16" column="1">
<widget class="QLabel" name="label_737"> <widget class="QLabel" name="label_737">
<property name="text"> <property name="text">
<string>Mask for right image</string> <string>Mask for right image.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21126,7 +21153,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_700"> <widget class="QLabel" name="label_700">
<property name="text"> <property name="text">
<string>Amount of time we will initialize over</string> <string>Amount of time we will initialize over.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21155,7 +21182,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_701"> <widget class="QLabel" name="label_701">
<property name="text"> <property name="text">
<string>Variance threshold on our acceleration to be classified as moving</string> <string>Variance threshold on our acceleration to be classified as moving.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21181,7 +21208,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLabel" name="label_702"> <widget class="QLabel" name="label_702">
<property name="text"> <property name="text">
<string>Max disparity to consider the platform stationary (dependent on resolution)</string> <string>Max disparity to consider the platform stationary (dependent on resolution).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21207,7 +21234,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_703"> <widget class="QLabel" name="label_703">
<property name="text"> <property name="text">
<string>How many features to track during initialization (saves on computation)</string> <string>How many features to track during initialization (saves on computation).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21227,7 +21254,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLabel" name="label_720"> <widget class="QLabel" name="label_720">
<property name="text"> <property name="text">
<string>If we should perform dynamic initialization</string> <string>If we should perform dynamic initialization.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21247,7 +21274,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLabel" name="label_721"> <widget class="QLabel" name="label_721">
<property name="text"> <property name="text">
<string>If we should optimize and recover the calibration in our MLE</string> <string>If we should optimize and recover the calibration in our MLE.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21270,7 +21297,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="6" column="1"> <item row="6" column="1">
<widget class="QLabel" name="label_722"> <widget class="QLabel" name="label_722">
<property name="text"> <property name="text">
<string>Max number of MLE iterations for dynamic initialization</string> <string>Max number of MLE iterations for dynamic initialization.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21299,7 +21326,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="7" column="1"> <item row="7" column="1">
<widget class="QLabel" name="label_723"> <widget class="QLabel" name="label_723">
<property name="text"> <property name="text">
<string>Max time for MLE optimization</string> <string>Max time for MLE optimization.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21322,7 +21349,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="8" column="1"> <item row="8" column="1">
<widget class="QLabel" name="label_724"> <widget class="QLabel" name="label_724">
<property name="text"> <property name="text">
<string>Max number of MLE threads for dynamic initialization</string> <string>Max number of MLE threads for dynamic initialization.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21345,7 +21372,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="9" column="1"> <item row="9" column="1">
<widget class="QLabel" name="label_725"> <widget class="QLabel" name="label_725">
<property name="text"> <property name="text">
<string>Number of poses to use during initialization (max should be cam freq * window)</string> <string>Number of poses to use during initialization (max should be cam freq * window).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21374,7 +21401,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="10" column="1"> <item row="10" column="1">
<widget class="QLabel" name="label_726"> <widget class="QLabel" name="label_726">
<property name="text"> <property name="text">
<string>Minimum degrees we need to rotate before we try to init (sum of norm)</string> <string>Minimum degrees we need to rotate before we try to init (sum of norm).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21400,7 +21427,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="11" column="1"> <item row="11" column="1">
<widget class="QLabel" name="label_727"> <widget class="QLabel" name="label_727">
<property name="text"> <property name="text">
<string>Magnitude we will inflate initial covariance of orientation</string> <string>Magnitude we will inflate initial covariance of orientation.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21426,7 +21453,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="12" column="1"> <item row="12" column="1">
<widget class="QLabel" name="label_728"> <widget class="QLabel" name="label_728">
<property name="text"> <property name="text">
<string>Magnitude we will inflate initial covariance of velocity</string> <string>Magnitude we will inflate initial covariance of velocity.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21452,7 +21479,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="13" column="1"> <item row="13" column="1">
<widget class="QLabel" name="label_729"> <widget class="QLabel" name="label_729">
<property name="text"> <property name="text">
<string>Magnitude we will inflate initial covariance of gyroscope bias</string> <string>Magnitude we will inflate initial covariance of gyroscope bias.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21478,7 +21505,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="14" column="1"> <item row="14" column="1">
<widget class="QLabel" name="label_730"> <widget class="QLabel" name="label_730">
<property name="text"> <property name="text">
<string>Magnitude we will inflate initial covariance of accelerometer bias</string> <string>Magnitude we will inflate initial covariance of accelerometer bias.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21507,7 +21534,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="15" column="1"> <item row="15" column="1">
<widget class="QLabel" name="label_731"> <widget class="QLabel" name="label_731">
<property name="text"> <property name="text">
<string>Minimum reciprocal condition number acceptable for our covariance recovery</string> <string>Minimum reciprocal condition number acceptable for our covariance recovery.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21536,7 +21563,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_704"> <widget class="QLabel" name="label_704">
<property name="text"> <property name="text">
<string>If we should try to use zero velocity update</string> <string>If we should try to use zero velocity update.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21565,7 +21592,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_705"> <widget class="QLabel" name="label_705">
<property name="text"> <property name="text">
<string>Chi2 multiplier for zero velocity</string> <string>Chi2 multiplier for zero velocity.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21594,7 +21621,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLabel" name="label_706"> <widget class="QLabel" name="label_706">
<property name="text"> <property name="text">
<string>Max velocity we will consider to try to do a zupt (i.e. if above this, don't do zupt)</string> <string>Max velocity we will consider to try to do a zupt (i.e. if above this, don't do zupt).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21623,7 +21650,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_707"> <widget class="QLabel" name="label_707">
<property name="text"> <property name="text">
<string>Multiplier of our zupt measurement IMU noise matrix (default should be 1.0)</string> <string>Multiplier of our zupt measurement IMU noise matrix (default should be 1.0).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21652,7 +21679,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLabel" name="label_708"> <widget class="QLabel" name="label_708">
<property name="text"> <property name="text">
<string>Max disparity we will consider to try to do a zupt (i.e. if above this, don't do zupt)</string> <string>Max disparity we will consider to try to do a zupt (i.e. if above this, don't do zupt).</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21672,7 +21699,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLabel" name="label_709"> <widget class="QLabel" name="label_709">
<property name="text"> <property name="text">
<string>If we should only use the zupt at the very beginning static initialization phase</string> <string>If we should only use the zupt at the very beginning static initialization phase.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21713,7 +21740,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="label_710"> <widget class="QLabel" name="label_710">
<property name="text"> <property name="text">
<string>Accel &quot;white noise&quot;</string> <string>Accel &quot;white noise&quot;.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21745,7 +21772,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="1" column="1"> <item row="1" column="1">
<widget class="QLabel" name="label_711"> <widget class="QLabel" name="label_711">
<property name="text"> <property name="text">
<string>Accel bias diffusion</string> <string>Accel bias diffusion.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21777,7 +21804,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLabel" name="label_712"> <widget class="QLabel" name="label_712">
<property name="text"> <property name="text">
<string>Gyro &quot;white noise&quot;</string> <string>Gyro &quot;white noise&quot;.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21809,7 +21836,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="label_713"> <widget class="QLabel" name="label_713">
<property name="text"> <property name="text">
<string>Gyro bias diffusion</string> <string>Gyro bias diffusion.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21838,7 +21865,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLabel" name="label_714"> <widget class="QLabel" name="label_714">
<property name="text"> <property name="text">
<string>Pixel noise for MSCKF features</string> <string>Pixel noise for MSCKF features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21867,7 +21894,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLabel" name="label_715"> <widget class="QLabel" name="label_715">
<property name="text"> <property name="text">
<string>Chi2 multiplier for MSCKF features</string> <string>Chi2 multiplier for MSCKF features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21896,7 +21923,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="6" column="1"> <item row="6" column="1">
<widget class="QLabel" name="label_716"> <widget class="QLabel" name="label_716">
<property name="text"> <property name="text">
<string>Pixel noise for SLAM features</string> <string>Pixel noise for SLAM features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -21925,7 +21952,7 @@ With &lt;0, the length is estimated once for each unique marker, then re-used fo
<item row="7" column="1"> <item row="7" column="1">
<widget class="QLabel" name="label_717"> <widget class="QLabel" name="label_717">
<property name="text"> <property name="text">
<string>Chi2 multiplier for SLAM features</string> <string>Chi2 multiplier for SLAM features.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>