如何抑制Ceres Solver控制台日志并调整日志级别?
解决Ceres Solver协方差计算时的日志抑制/级别调整问题
首先,Ceres Solver底层依赖Google glog处理日志输出,要控制这类错误日志,核心是通过glog的配置或Ceres的编译选项实现。下面是几种可行的方案:
1. 代码中动态调整日志级别(全局/精准控制)
你可以在程序初始化阶段配置glog,灵活过滤日志:
全局调整日志阈值
只输出FATAL级别的致命错误,过滤掉ERROR、WARNING等日志:
#include <glog/logging.h> int main(int argc, char** argv) { // 初始化glog google::InitGoogleLogging(argv[0]); // 设置标准错误输出的日志阈值为FATAL,仅致命错误会输出 FLAGS_stderrthreshold = google::FATAL; // 你的Ceres协方差计算代码 ceres::Covariance::Options covarianceOptions; covarianceOptions.algorithm_type = ceres::SPARSE_QR; ceres::Covariance covarianceComputation(covarianceOptions); if (!covarianceComputation.Compute(paramBlocks, ceresProblem)) { // 自定义错误处理逻辑 } return 0; }
精准关闭特定模块日志
如果不想影响其他模块的日志,可单独禁用输出错误的covariance_impl.cc文件的日志:
#include <glog/logging.h> int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); // 禁止来自covariance_impl.cc的所有ERROR级别及以下的日志 google::DisableLog("covariance_impl.cc"); // 后续Ceres代码... }
2. 命令行参数快速控制
无需修改代码,运行程序时直接通过命令行参数传递glog配置:
# 仅输出FATAL级别的日志 ./your_program --stderrthreshold=FATAL # 完全关闭所有日志输出 ./your_program --minloglevel=4
minloglevel取值说明:0=INFO,1=WARNING,2=ERROR,3=FATAL,4=关闭所有日志。
3. 编译Ceres时彻底禁用日志
如果你的项目是自行编译Ceres Solver,可以在CMake配置阶段添加选项,从根源上移除日志代码:
# 在Ceres的CMake配置中加入该参数 -DCERES_DISABLE_LOGGING=ON
编译后的Ceres库将不再包含任何日志相关逻辑,彻底避免这类输出。
补充说明
你遇到的那条Jacobian matrix is rank deficient错误属于glog的ERROR级别,以上方案都能有效抑制它。如果需要保留其他模块的日志,优先选择精准关闭特定文件日志的方式,避免全局调整影响调试。
内容的提问来源于stack exchange,提问作者Sumit Dey




