Minimizing mean square error for a body tracking problem

3 views (last 30 days)
Seeking big-picture suggestions on how to tackle the following problem: I have measurements of the positions of 4 marker locations on a 3D body, and I know how to write the rotation/translation matrix given the body's unknown yaw, pitch, roll, and x,y,z translation. I want to solve for the yaw, pitch, etc. which minimizes the error of [markers' estimated separations] - [known marker separations]. I could loop through the expected range of yaw, pitch, etc., calculate the resulting marker separation, and choose the combination with smallest distance from their known separation. But is there a way to perform the minimization in 1 step? I assume this would be faster, especially since this will be inside a time loop.

Accepted Answer

Anton Semechko
Anton Semechko on 5 Jun 2012
No pen and paper necessary. Here is code for the function that I already have:
function [R,t,s]=SymTformParams(Xref,Xsrc)
% Compute rotation (R), translation (t) and scaling (s) parameters, such
% that Xref=s*R*Xsrc+t, where Xref and Xsrc are two point sets, respectively.
%
% - Xref,Xsrc : N-by-3 arrays of corresponding point coordinates.
% - R : 3x3 rotation matrix.
% - t : 1x3 translation vector.
% - s : scaling factor.
%
% AUTHOR: Anton Semechko (a.semechko@gmail.com)
% DATE: Apr.2012
%
% Find the centroids
Cref=mean(Xref,1);
Csrc=mean(Xsrc,1);
% Center the point sets
Xref=bsxfun(@minus,Xref,Cref);
Xsrc=bsxfun(@minus,Xsrc,Csrc);
N=size(Xref,1);
% Compute the covariance matrix
Cmat=(Xref'*Xsrc)/N;
% Find rotation using SVD
[U,~,V] = svd(Cmat);
R=U*diag([1 1 det(U*V')])*V';
% Find the scaling factor
Xref_L2=sum(Xref.^2,2);
Xsrc_L2=sum(Xsrc.^2,2);
s=Xref_L2./Xsrc_L2;
s=mean(sqrt(s));
% Translation
t=Cref-(s*R*Csrc')';

More Answers (1)

Anton Semechko
Anton Semechko on 5 Jun 2012
If point correspondences are known, do the following:
1) solve for translation, by comparing the centroids of the landmark sets before and after the transformation 2) normalize for translation and find rotation matrix using SVD (<http://kwon3d.com/theory/jkinem/rotmat.html>)
If you are interested in finding the Euler angles, you can use the 't2x' which can be downloaded from here: http://www.mathworks.com/matlabcentral/fileexchange/956-3d-rotations.

Categories

Find more on Mathematics and Optimization in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!