function[R, q, theta]=vec2quat_R(v1, v2)% 将向量转换为单位向量
u1 = v1/norm(v1);
u2 = v2/norm(v2);ifnorm(u1+u2)==0
q =[0000];else
u =cross(u1,u2);
u = u/norm(u);
theta =acos(dot(u1,u2));
q =[cos(theta/2)sin(theta/2)*u];end% 四元数转为方向余弦矩阵
dcm=[2*q(1).^2-1+2*q(2)^22*(q(2)*q(3)+q(1)*q(4))2*(q(2)*q(4)-q(1)*q(3));2*(q(2)*q(3)-q(1)*q(4))2*q(1)^2-1+2*q(3)^22*(q(3)*q(4)+q(1)*q(2));2*(q(2)*q(4)+q(1)*q(3))2*(q(3)*q(4)-q(1)*q(2))2*q(1)^2-1+2*q(4)^2];% 四元数转为旋转矩阵
rot =permute(dcm,[213]);end
欧拉角转旋转矩阵
function R =Eular2R(x,y,z,mode)
Rotx =[100;0cos(x)-sin(x);0sin(x)cos(x)];
Roty =[cos(y)0sin(y);010;-sin(y)0cos(y)];
Rotz =[cos(z)-sin(z)0;sin(z)cos(z)0;001];switch mode
case1%ZYX
R = Rotz*Roty*Rotx;case1%XYZ
R = Rotx*Roty*Rotz;case1%ZXY
R = Rotz*Rotx*Roty;case1%YZX
R = Roty*Rotz*Rotx;otherwise
R = Rotz*Roty*Rotx;end
旋转矩阵转欧拉角
function eular =R2eular(R)
x =atan2(R(3,2),R(3,3));
y =atan2(-R(3,1),sqrt(R(3,2)^2+R(3,3)^2));
z =atan2(R(2,1),R(1,1));
eular =[x y z];
旋转矩阵转四元数
function q =R2quat(R)
t=sqrt(1+R(1,1)+R(2,2)+R(3,3))/2;
q=[t(R(3,2)-R(2,3))/(4*t)(R(1,3)-R(3,1))/(4*t)(R(2,1)-R(1,2))/(4*t)];end