matlab如何求变换矩阵,如何⽤Matlab实现机器⼈的变换矩阵如何⽤Matlab实现机器⼈的变换矩阵
如何⽤Matlab实现机器⼈的变换矩阵
前⾔
其中有些思路参考了这篇博客,有兴趣的同学可以看⼀下博客参考(关于位姿变换矩阵)
刚开始学⼯业机器⼈的时候,⼤家都先学到了其中的⼀些矩阵变换,但是计算过程还是不太熟悉,如果想要有较深的体验,可以从本⽂中获取⼀些经验,具体实例以我上⼀个博客中的两个三棱柱为主。
1.确定初始位姿
以我上⼀篇博客为例,那么初始位姿已经确定了代码如下
V1=[
-1,0,2;
-1,4,0;
-1,0,0;
1,0,2;
1,4,0;
1,0,0];
这⾥每⼀⾏是每⼀个顶点的x,y,z坐标值
2.矩阵⽅程
那么如果我要对这样⼀个点集做转换,就需要位移变换矩阵以及⾓度变换矩阵,所以这⾥做两个function,具体代码如下
function fx=Trans(a,b,c)
fx=[1,0,0,a;
0,1,0,b;
0,0,1,c;
0,0,0,1;];
end
function fx=Rot(a,b)
switch a
case 'X轴'
fx=[1,0,0,0;
0,cos(b),-sin(b),0;
0,sin(b),cos(b),0;
0,0,0,1];
0,-sin(b),0,cos(b);
0,0,0,1];
case 'Z轴'
fx=[cos(b),-sin(b),0,0;
sin(b),cos(b),0,0;
0,0,1,0;
0,0,0,1]; %具体内容属于机器⼈学内容,这⾥不做赘述end
于是后续可以直接调⽤该⽅程
3.最终变换过程
初始位姿如下图所⽰
⽽需求的最终的位姿如下图
syms pi; %这⾥定义pi是为了使cos(pi)=0
V1=[-1,-1,-1,1,1,1;
0,0,4,4,0,0;
2,0,0,0,0,2;
1,1,1,1,1,1;];
%这⾥是设置了各个顶点的坐标,这⾥是每⼀个列值都是⼀个点的x,y,z坐标,⽽1是齐次坐标,这⾥不做赘述。V2=Rot('Z轴',pi/2)*Rot('X轴',pi/2)*V1;
%这⾥是将初始矩阵,绕x轴逆时针旋转90°,再绕z轴逆时针旋转90°的操作
V3=V2([1 2 3 ],[1 2 3 4 5 6]);
%因为后续要进⾏画图操作,所以将齐次坐标去除了
V4=double(V2); %这⾥是为了将具体内容显⽰在⼯作区中
V5=double(V3);
V6=V5.'; %这⾥是将变换后的矩阵进⾏转置操作
F1=[
1,2,3,1;
1,2,5,6;
1,3,4,6;
3,2,5,4;
4,6,5,4];
如何用matlab将已知点连线patch('Faces',F1,'Vertices',V6,'FaceColor','none',...
'LineWidth',1,'EdgeColor','red');
grid minor;
axis([-2 2 -3 3 0 5]);
xlabel('x轴'); ylabel('y轴');zlabel('z轴');
set(gca,'XDir','reverse')
set(gca,'YDir','reverse')
4.附录
上接上⼀个博客的内容,设计了两个直三棱柱,并将这两个直三棱柱转换为⼀个⽴⽅体的过程。
最终参考代码如下:
clc
clear
V2=Rot('Z轴',pi/2)*Rot('X轴',pi/2)*V1;
V3=V2([1 2 3 ],[1 2 3 4 5 6]);
V4=double(V2);
V5=double(V3);
V6=V5.';
F1=[
1,2,3,1;
1,2,5,6;
1,3,4,6;
3,2,5,4;
4,6,5,4];
patch('Faces',F1,'Vertices',V6,'FaceColor','none',... 'LineWidth',1,'EdgeColor','red');
grid minor;
axis([-2 2 -3 3 0 5]);
xlabel('x轴'); ylabel('y轴');zlabel('z轴');
set(gca,'XDir','reverse')
set(gca,'YDir','reverse')
clc
clear
syms pi;
V1=[-1,-1,-1,1,1,1;
0,0,4,4,0,0;
2,0,0,0,0,2;
1,1,1,1,1,1;];
V2=Rot('Z轴',pi/2)*Rot('X轴',pi/2)*V1;
V3=V2([1 2 3 ],[1 2 3 4 5 6]);
V4=double(V2);
V5=double(V3);
V8=Trans(0,0,4)*Trans(2,0,0)*Rot('Z轴',pi/2)*Rot('X轴',-pi/2)*Trans(0,-5,0)*V7; V9=V8([1 2 3],[1,2,3,4,5,6]);
V10=double(V8);
V11=double(V9);
V12=V11.';
F1=[
1,2,3,1;
1,2,5,6;
1,3,4,6;
3,2,5,4;
4,6,5,4];
F2=[
1,2,3,1;
1,2,5,6;
1,3,4,6;
3,2,5,4;
4,6,5,4];
patch('Faces',F1,'Vertices',V6,'FaceColor','none',...
'LineWidth',1,'EdgeColor','red');
patch('Faces',F2,'Vertices',V12,'FaceColor','none',...
'LineWidth',1,'EdgeColor','red');
grid minor;
axis([-2 2 -3 3 0 5]);
xlabel('x轴'); ylabel('y轴');zlabel('z轴');
set(gca,'XDir','reverse')
set(gca,'YDir','reverse')
初始位姿如图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论