验证本质矩阵E的 分解

发布时间 2023-11-15 15:34:50作者: 玥茹苟

 

#include <iostream>
#include <vector>
#include <Eigen/Eigen>
#include <Eigen/Dense>

int main() {
    //SHAPE_FACTORY(BoxCude) < ClipFunType > ss;
    //std::cout << int(ss.points_.size()) << "\n";
    //std::cout << int(ss.shape_type_) << "\n";

    Eigen::Matrix3f R;
    R = Eigen::AngleAxisf(3.1415926 / 2.0, Eigen::Vector3f::UnitZ()) *
        Eigen::AngleAxisf(3.1415926 / 4.0, Eigen::Vector3f::UnitX()) *
        Eigen::AngleAxisf(3.1415926 / 4.0, Eigen::Vector3f::UnitY());
    Eigen::Vector3f t(0.2, 3.0, 1.2);
    Eigen::Matrix3f t_x;
    t_x << 0.0, -t[2], t[1], 
        t[2], 0.0, -t[0], 
        -t[1], t[0], 0.0;

    Eigen::Matrix3f essential_matrix_t = t_x * R;
    Eigen::BDCSVD<Eigen::MatrixXf> svd_e(essential_matrix_t, Eigen::ComputeThinU | Eigen::ComputeThinV);
    Eigen::VectorXf sigma = svd_e.singularValues();
    Eigen::MatrixXf U = svd_e.matrixU();
    Eigen::MatrixXf V = svd_e.matrixV();

    Eigen::Matrix3f diag_sigma;
    diag_sigma.setZero();
    if (sigma.size() >= 2)
    {
        std::cout << "sigma: " << sigma[0] << " " << sigma[1] << " " << sigma[2] << "\n";
        diag_sigma(0, 0) = sigma[0];
        diag_sigma(1, 1) = sigma[1];
    }

    Eigen::Matrix3f R_2pi, R_2pi_f;
    R_2pi = Eigen::AngleAxisf(3.1415926 / 2.0, Eigen::Vector3f::UnitZ()) *
        Eigen::AngleAxisf(0.0, Eigen::Vector3f::UnitX()) *
        Eigen::AngleAxisf(0.0, Eigen::Vector3f::UnitY());
    R_2pi_f = Eigen::AngleAxisf(-3.1415926 / 2.0, Eigen::Vector3f::UnitZ()) *
        Eigen::AngleAxisf(0.0, Eigen::Vector3f::UnitX()) *
        Eigen::AngleAxisf(0.0, Eigen::Vector3f::UnitY());

    Eigen::Matrix3f R1, R2;
    Eigen::Vector3f t1, t2;
    R1 = U * R_2pi.transpose() * V.transpose();
    R2 = U * R_2pi_f.transpose() * V.transpose();

    Eigen::Matrix3f t1_x = U * R_2pi * diag_sigma * U.transpose();
    Eigen::Matrix3f t2_x = U * R_2pi_f * diag_sigma * U.transpose();

    std::cout << "t1_x : \n" << t1_x << "\n ";
    std::cout << "t2_x : \n" << t2_x << "\n ";

    return 0;
}

结果: