Avoid SVD to compute optimal rotation between point sets
Optimal rotation in shape matching. - 06/2019 - #Math

Draft note
https://zalo.github.io/blog/kabsch/
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
// 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)) + R.col(2).cross(A.col(2))) * (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) break; q = Quaterniond(AngleAxisd(w, (1.0 / w)*omega))*q; q.normalize(); } }
Original algorithm (but slow):
https://en.wikipedia.org/wiki/Kabsch_algorithm
https://igl.ethz.ch/projects/ARAP/svd_rot.pdf
Related:
http://nghiaho.com/?page_id=671
No comments