Skip to content

关于ieskf更新的过程疑问 #1

@SharkPeppero

Description

@SharkPeppero
for (size_t i = 0; i < m_max_iter; i++)
{
    m_loss_func(m_x, shared_data);
    if (!shared_data.valid)
        break;
    H.setZero();
    b.setZero();
    delta = m_x - predict_x;
    M21D J = M21D::Identity();
    J.block<3, 3>(0, 0) = JrInv(delta.segment<3>(0));
    J.block<3, 3>(6, 6) = JrInv(delta.segment<3>(6));
    H += J.transpose() * m_P.inverse() * J;
    b += J.transpose() * m_P.inverse() * delta;

    H.block<12, 12>(0, 0) += shared_data.H;
    b.block<12, 1>(0, 0) += shared_data.b;

    delta = -H.inverse() * b;

    m_x += delta;
    shared_data.iter_num += 1;

    if (m_stop_func(delta))
        break;
}

M21D L = M21D::Identity();
// L.block<3, 3>(0, 0) = Jr(delta.segment<3>(0));
// L.block<3, 3>(6, 6) = Jr(delta.segment<3>(6));
L.block<3, 3>(0, 0) = Eigen::Matrix3d::Identity() - 0.5 * Sophus::SO3d::hat(delta.segment<3>(0));
L.block<3, 3>(6, 6) = Eigen::Matrix3d::Identity() - 0.5 * Sophus::SO3d::hat(delta.segment<3>(6));
m_P = L * H.inverse() * L.transpose();

m_loss_func(m_x, shared_data);在这里我们利用雷达点构建了点面残差,做了误差状态量中关于位移以及旋转的残差;

     M21D J = M21D::Identity();
    J.block<3, 3>(0, 0) = JrInv(delta.segment<3>(0));
    J.block<3, 3>(6, 6) = JrInv(delta.segment<3>(6));
    H += J.transpose() * m_P.inverse() * J;
    b += J.transpose() * m_P.inverse() * delta;

    H.block<12, 12>(0, 0) += shared_data.H;
    b.block<12, 1>(0, 0) += shared_data.b;
    
    在这里构建的雅阁比J矩阵请问是什么含义呢,为什么又利用这个雅阁比与误差状态量的矩阵构建残差?
    很困解的是这里的J矩阵推导公式是怎么来的,可以麻烦解释一下吗,或者有什么资料可以参考吗
    ~~~~~~~~希望可以回答^_^

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions