1

Eigen を使用している皆さん、こんにちは。ここで奇妙な質問に遭遇しました。

Eigenを使用して Unscented Kalman Filter を実装しました。

私の 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 (次元 n x 3n) の QR 分解を計算し、次にその R コンポーネント (次元 n x n) のランク更新を実行します。internal::llt_inplace::rankUpdateは、文書化されていない Eigen ライブラリの関数です。最初の引数に対してランク 1 の更新を実行するだけです。この関数は ~/path_to_Eigen/Cholesky/LLT.h にあります。

このコードの最も奇妙な点は、-DCMAKE_BUILD_TYPE=Debugを使用すると完全に動作しますが、 -DCMAKE_BUILD_TYPE=Releaseを使用してコンパイルすると、このコードは失敗します。

誰かがこれを理解できるか、以前に同様の問題を抱えているかどうかを尋ねたいと思います。助けてください、どうもありがとう。

4

0 に答える 0