1

大家好,使用 Eigen 的人,我在这里遇到了一个奇怪的问题。

我用Eigen实现了一个无味卡尔曼滤波器。

它在我的 PC 上运行良好,但同一段代码会在我的嵌入式系统Odroid XU(Armv7 架构)上产生分段错误。

经过几个小时的调试,我发现问题出在这部分:

qrSolver.compute(OS.transpose());    
m_q=qrSolver.householderQ();
m_r = qrSolver.matrixQR().triangularView<Upper>();

S_pre = m_r.block(0,0,n,n).transpose();

if (w_c0 < 0)
    internal::llt_inplace<float,Upper>::rankUpdate(S_pre,
                sqrt(-w_c0)*(sigmaPoints.col(0) - state_pre),
    -1);
else
    internal::llt_inplace<float,Upper>::rankUpdate(S_pre,
                sqrt(w_c0)*(sigmaPoints.col(0) - state_pre),
    1);

我首先计算矩阵OS的 QR 分解(维度 n×3n),然后执行其 R 分量的秩更新(维度 n×n)。internal::llt_inplace::rankUpdate是 Eigen 库中未记录的函数。它只是对其第一个参数执行 rank-1 更新。这个函数可以在 ~/path_to_Eigen/Cholesky/LLT.h 中找到

这段代码最奇怪的是,使用-DCMAKE_BUILD_TYPE=Debug可以完美运行,而如果我使用-DCMAKE_BUILD_TYPE=Release进行编译,则此代码将失败。

我想问任何人都可以理解这一点,或者以前有没有人遇到过类似的问题。请帮忙,非常感谢。

4

0 回答 0