Modern_Robotics/packages/Matlab/mr/DistanceToSE3.m

29 lines
820 B
Matlab

function d = DistanceToSE3(mat)
% *** CHAPTER 3: RIGID-BODY MOTIONS ***
% Takes mat: A 4x4 matrix.
% Returns the Frobenius norm to describe the distance of mat from the SE(3)
% manifold.
% Compute the determinant of matR, the top 3x3 submatrix of mat. If
% det(matR) <= 0, return a large number. If det(matR) > 0, replace the top
% 3x3 submatrix of mat with matR' * matR, and set the first three entries
% of the fourth column of mat to zero. Then return norm(mat - I).
% Example Inputs:
%
% clear; clc;
% mat = [1.0, 0.0, 0.0, 1.2;
% 0.0, 0.1, -0.95, 1.5;
% 0.0, 1.0, 0.1, -0.9;
% 0.0, 0.0, 0.1, 0.98];
% d = DistanceToSE3(mat)
%
% Output:
% d =
% 0.1349
[R, p] = TransToRp(mat);
if det(R) > 0
d = norm([R' * R, [0; 0; 0]; mat(4, :)] - eye(4), 'fro');
else
d = 1e+9;
end
end