You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何抑制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

火山引擎 最新活动