Better error handling in bundle_adjuster.cc
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc index 61cd41f..885dbe2 100644 --- a/examples/bundle_adjuster.cc +++ b/examples/bundle_adjuster.cc
@@ -75,7 +75,9 @@ DEFINE_int32(num_iterations, 5, "Number of iterations"); DEFINE_int32(num_threads, 1, "Number of threads"); -DEFINE_double(eta, 1e-2, "Default value for eta."); +DEFINE_double(eta, 1e-2, "Default value for eta. Eta determines the " + "accuracy of each linear solve of the truncated newton step. " + "Changing this parameter can affect solve performance "); DEFINE_bool(use_schur_ordering, false, "Use automatic Schur ordering."); DEFINE_bool(use_quaternions, false, "If true, uses quaternions to represent " "rotations. If false, angle axis is used"); @@ -99,7 +101,7 @@ options->linear_solver_type = ceres::CONJUGATE_GRADIENTS; } else if (FLAGS_solver_type == "dense_qr") { // DENSE_QR is included here for completeness, but actually using - // this opttion is a bad idea due to the amount of memory needed + // this option is a bad idea due to the amount of memory needed // to store even the smallest of the bundle adjustment jacobian // arrays options->linear_solver_type = ceres::DENSE_QR; @@ -108,8 +110,20 @@ << FLAGS_solver_type; } - if (options->linear_solver_type == ceres::ITERATIVE_SCHUR || - options->linear_solver_type == ceres::CONJUGATE_GRADIENTS) { + if (options->linear_solver_type == ceres::CONJUGATE_GRADIENTS) { + options->linear_solver_min_num_iterations = 5; + if (FLAGS_preconditioner_type == "identity") { + options->preconditioner_type = ceres::IDENTITY; + } else if (FLAGS_preconditioner_type == "jacobi") { + options->preconditioner_type = ceres::JACOBI; + } else { + LOG(FATAL) << "For CONJUGATE_GRADIENTS, only identity and jacobian " + << "preconditioners are supported. Got: " + << FLAGS_preconditioner_type; + } + } + + if (options->linear_solver_type == ceres::ITERATIVE_SCHUR) { options->linear_solver_min_num_iterations = 5; if (FLAGS_preconditioner_type == "identity") { options->preconditioner_type = ceres::IDENTITY; @@ -123,7 +137,7 @@ options->preconditioner_type = ceres::CLUSTER_TRIDIAGONAL; } else { LOG(FATAL) << "Unknown ceres preconditioner type: " - << FLAGS_preconditioner_type; + << FLAGS_preconditioner_type; } }