我需要过滤一个旋转矩阵,为此我需要首先将其转换为旋转角度,然后过滤这些并将答案转换回旋转矩阵形式。问题在于,将这两个转换链接在一起,即使没有中间的过滤(即angl2rot(rot2angl(rotationMatrix))
)也会由于执行转换所需的所有trig函数缺乏精确性而引入显着错误。
有没有办法提高MatLab的精度?或者特别是可以使trig函数(我使用sin(),cos()和atan2())更精确?
编辑:负责从旋转矩阵转换为欧拉角的函数的实现,反之亦然:
function [ rotationM ] = eul2rot( a, b, c )
%EUL2ROT This function converts euler rotation angles to a 3x3 rotaton
%matrix
X = zeros(3,3,size(a,1));
Y = zeros(3,3,size(a,1));
Z = zeros(3,3,size(a,1));
rotationM = zeros(3,3,size(a,1));
for count = 1:size(a,1)
X(:,:,count) = [1 0 0; ...
0 cos(a(count)) -sin(a(count)); ...
0 sin(a(count)) cos(a(count))];
Y(:,:,count) = [cos(b(count)) 0 sin(b(count)); ...
0 1 0; ...
-sin(b(count)) 0 cos(b(count))];
Z(:,:,count) = [cos(c(count)) -sin(c(count)) 0; ...
sin(c(count)) cos(c(count)) 0; ...
0 0 1];
rotationM(:,:,count) = Y(:,:,count)*Z(:,:,count);
rotationM(:,:,count) = X(:,:,count)*rotationM(:,:,count);
end
end
function [ th ] = rot2eul( rot )
%ROT2EUL Converts a 3x3 rotation matrix into a vector of three euler angles
th = [atan2(rot(3,2,:),rot(3,3,:)); ...
atan2(-rot(3,1,:),sqrt(rot(3,2,:).^2+rot(3,3,:).^2)); ...
atan2(rot(2,1,:),rot(1,1,:))];
end
他们使用找到的方程here。
答案 0 :(得分:3)
作为源的site you link将旋转矩阵R定义为:
R = Z*Y*X;
X, Y, Z
是三个单独的旋转矩阵。
但是,在您的代码中,您正在执行此操作:
rotationM(:,:,count) = Y(:,:,count)*Z(:,:,count);
rotationM(:,:,count) = X(:,:,count)*rotationM(:,:,count);
相当于:
R = X*Y*Z;
这两个不等价,因为矩阵乘法不是可交换的。改变顺序是乘法相当于改变执行旋转的顺序(并且3D中的旋转也不是可交换的),给你的结果与你期望的不同。
答案 1 :(得分:0)
John D' Errico的类HPF(High Precision Floats)支持具有任意小数位数的浮点数。您还可以查看符号数学工具箱的函数vpa
。
答案 2 :(得分:0)
您提到的功能如sin
和cos
是非常基本的matlab功能,并且不会包含错误。使用它们时获得的精度基本上是matlabs自己的精度(双精度,当你使用我期望的值时,很容易有14位小数。)
因此嫌疑人很清楚:自制函数angl2rot
和rot2angl
可能是问题所在。要么是因为它们被窃听,要么是因为它们被错误地使用了。
如果没有看到实际的功能,就无法说明更多信息。