is the rotation matrix is unique for one rotation I have a test for rotation , and found two rotation behave the same at one point
rot1 = [    0.8736    0.2915   -0.3897;
   -0.4011    0.8848   -0.2373;
    0.2756    0.3636    0.8898]

rot2 = [    0.9874   -0.1420   -0.0700;
    0.0700    0.7880   -0.6117;
    0.1420    0.5991    0.7880]

yet they have same result at rotation
wpt = [200 200 200] 

with result
   cpt = [  155.0812 49.2660 305.8148] 

can anyone could explain this? :)

I have coded for the testify for the rotation iterated solve with gauss-newton , and found if I have two or more point matches, the rotation could convergence to the right one and so the mapped point , but if I only have one point match , the mapped point is right but the rotation matrix is not correct , so I think two matches should be enough
//now it finally right
void so3fJacobianTestNewton()
{
    SO3f::Tangent v;
    v << 0.34, 0.24, 0.14;

    SO3f::Tangent delta;
    delta << 0.34, -0.24, -0.54;

    SO3f so3f = SO3f::exp(v);
    Matrix3f rot = so3f.matrix();
    SO3f so3f_delta = SO3f::exp(delta)*SO3f::exp(v);
    SO3f::Tangent so3f_v = SO3f::log(so3f_delta);
    Matrix3f rot_delta = so3f_delta.matrix();

    int wpt_n = 2;
    MatrixXf wpt = MatrixXf::Random(3, wpt_n)*100;

    MatrixXf wpt1 = rot*wpt;
    MatrixXf wpt2 = rot_delta*wpt;


    SO3f so3f_iter = so3f;
    MatrixXf wpt_jacobi = wpt1;
    for (int i = 0; i < 100; i++)
    {
        Matrix3f A = Matrix3f::Zero();
        Vector3f b = Vector3f::Zero();
        for (int i = 0; i < wpt_n; i++)
        {
            Matrix3f jacobi = Matrix3f::Zero();
            VectorXf wpt_jacobi_col = wpt_jacobi.col(i);
            VectorXf wpt2_col = wpt2.col(i);
            jacobi(0, 1) = wpt_jacobi_col[2];
            jacobi(1, 0) = -wpt_jacobi_col[2];
            jacobi(0, 2) = -wpt_jacobi_col[1];
            jacobi(2, 0) = wpt_jacobi_col[1];
            jacobi(1, 2) = wpt_jacobi_col[0];
            jacobi(2, 1) = -wpt_jacobi_col[0];

            A += jacobi.transpose()*jacobi;
            b += jacobi.transpose()*(wpt2_col - wpt_jacobi_col);
        }

//      Vector3f delta_step = A.inverse()*(b);
        Vector3f delta_step = A.ldlt().solve(b);

        so3f_iter = SO3f::exp(delta_step)*so3f_iter;
        wpt_jacobi = so3f_iter.matrix()*wpt;

//      cout << so3f_iter.transpose() << endl;
//      cout << so3f_v.transpose() << endl;
//      Vector3f rpt = Vector3f::Random();

        cout << "matrix_iter : " << endl << so3f_iter.matrix() << endl;
        cout << "matrix_right : " << endl << so3f_delta.matrix() << endl;

        cout << "result_wpt_iter : " << endl << wpt_jacobi << endl;
        cout << "result_wpt_right : " << endl << wpt2 << endl;
    }
}

