Avoid SVD to compute optimal rotation between point sets

Draft note


 A Robust Method to Extract the Rotational Part of Deformations

Best used in an incremental system where you can re-use the rotation q from the previous frame (faster convergence) max iter should probably be set around 10-30

Eigen code:

// A: covariance matrix, q: shape matching rotation
void extractRotation(const Matrix3d& A, Quaterniond& q,const unsigned int maxIter)
    for (unsigned int iter = 0; iter < maxIter; iter++){
        Matrix3d R = q.matrix();
        Vector3d omega = (R.col(0).cross(A.col(0)) +
                          R.col(1).cross(A.col(1)) +
                * (1.0 / fabs(R.col(0).dot(A.col(0)) +
                              R.col(1).dot(A.col(1)) +
                              R.col(2).dot(A.col(2))) +1.0e-9);
        double w = omega.norm();
        if (w < 1.0e-9)

        q = Quaterniond(AngleAxisd(w, (1.0 / w)*omega))*q;

Original algorithm (but slow):





No comments

(optional field, I won't disclose or spam but it's necessary to notify you if I respond to your comment)
All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.
Anti-spam question: