matlab练习程序(罗德里格斯变换)

给出空间中一个点,将该点绕向量(k1 k2 k3)旋转一定角度theta,从而得到新点,这种操作能够利用罗德里格斯变换来处理。

变换公式如下:

其中theta为旋转度数。

K为由点所绕的单位向量构成的矩阵。

比如所绕向量为(k1 k2 k3),则矩阵K表示如下:

公式中R即为进行这种变换的旋转矩阵。

同样,用四元数也能够完成这种旋转操作。

下面给出了用四元数和罗德里格斯变换对同一个点做旋转的例子,互相验证一下。

matlab代码如下:

clear all;
close all;
clc;

p=rand(1,3);        %待旋转点

quat = eul2quat([0.6,0.4,0.5]);     %利用欧拉角构造四元数
q_quat = quaternion(quat);
p_quat = quaternion([0 p]);
re_quat= q_quat*p_quat*q_quat';     %利用四元数旋转
[w,a,b,c] = parts(re_quat);         %得到四元数中四个数

theta = acos(quat(1))*2;            %得到旋转弧度和所环绕的向量
kx = quat(2)/sin(theta/2);
ky = quat(3)/sin(theta/2);
kz = quat(4)/sin(theta/2);

K=[0 -kz ky;
   kz 0 -kx;
   -ky kx 0];
R = eye(3) + sin(theta)*K + (1- cos(theta))*K*K;    %罗德里格斯公式
p1= R*p';                           %利用罗德里格斯公式计算的旋转后的点

dr = HelperDrawRotation;
figure;
dr.draw3DOrientation(gca,[quat(2:4)],theta*180/pi);

hold on;
plot3(p(1),p(2),p(3),'bo')
plot3(p1(1),p1(2),p1(3),'r*')
plot3(a,b,c,'go');
axis equal;

其中的HelperDrawRotation是matlab帮助中的例子,我就不贴了,可以点击这里下载

变换效果如下:

利用四元数和罗德里格斯变换将蓝圈变换到绿圈(红星)上,结果是一致的。

注:这里matlab版本为2019a,2018a之前版本可能没有quaternion这个函数。

posted @ 2020-12-13 10:23  Dsp Tian  阅读(2296)  评论(0编辑  收藏  举报