如何用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];
case 'Y轴'
fx=[cos(b),0,sin(b),0;
0,1,0,0;
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.最终变换过程
初始位姿如下图所示
而需求的最终的位姿如下图
所以具体实现代码如下
clc
clear
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];
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
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);
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);
V6=V5.';
V7=[-1,-1,-1,1,1,1;
5,5,9,9,5,5;
2,0,0,0,0,2;
1,1,1,1,1,1;];
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')
初始位姿如图
最终位姿如图
我的上一个博客参考
如何用Matlab实现机器人的变换矩阵相关教程
[ STK ](八)使用 Matlab,在 STK 中建立卫星间连线
[ STK ](八)使用 Matlab,在 STK 中建立卫星间连线 星间距离小于 3e+07 时建立卫星间连线 星间距离是动态变化的,所以连线也是 每分钟建立一次完整连接,但是建立一次完整连接就需要218秒,就有点,, 开始建立连接,连接数目逐渐增多 一次完整连接,如下图
Echarts实战案例代码(44):同时渲染折线图实现和虚线渲染实现已
Echarts实战案例代码(44):同时渲染折线图实现和虚线渲染实现已发生和预测趋势的解决方案 实线和虚线,都是折线图lineStyle固有的属性; 分成同样数据的两组series,一段为实线,一段为虚线; option = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'W
剑指offer编程题----Java实现
剑指offer编程题----Java实现 剑指offer编程题----Java实现 JZ37 数字在升序数组中出现的次数 JZ57 二叉树的下一个结点 JZ37 数字在升序数组中出现的次数 题目描述 统计一个数字在升序数组中出现的次数。 题解 1. 类似双指针的方法 1.1 分析 传入的参数是:有
CentOS7安装MyCli实现MySQL自动补齐与语法高亮
CentOS7安装MyCli实现MySQL自动补齐与语法高亮 MyCli是一款命令行模式下实现MySQL语法高亮和自动补齐的工具 最近百度安装方法时发现前几页基于Python2.7的安装方法均已失效,所以写一篇新的分享出来供大家参考,理论上复制粘贴可以100%成功,遇到问题可以留言,解
实现点击微信链接自动跳转外部浏览器
实现点击微信链接自动跳转外部浏览器 正常情况下在微信中打开链接会有各种各样的限制,无法在微信内打开常用下载软件,APP等,链接发到微信中,微信会判断是不是可以让你从里面打开,识别是否合法,网上流传的各种微信打开下载链接,微信一更新基本失效。下面给大
剑指 Offer 09.用两个栈实现队列
剑指 Offer 09.用两个栈实现队列 这道题其实我有点蒙,只看题干信息的话,回答这个问题不难,可是我搞不清楚测试数据的输入输出QAQ 思路 用两个栈来实现队列功能,栈可以逆转数据的顺序,两次逆转就会变回来。 准备两个栈,一个作为中间过渡栈,“入栈”;一
使用springMVC实现图片上传
使用springMVC实现图片上传 在添加学生的时候添加图片 addStu.jsp添加图片代码 form action=../addStuResult method=post enctype=multipart/form-data table tr td学生编号/td tdinput type=text name=snum/td /tr tr td学生姓名/td tdinput type=text name=
【SpringBoot+Mybatis】bootstrap/sematic UI与pagehelper实现分
【SpringBoot+Mybatis】bootstrap/sematic UI与pagehelper实现分页 1.引入paging.js //分页,页码导航,要求参数为一个对象function createPageNav(opt) { opt= opt || {}; var $container = opt.$container || null, //必需,页码容器,请确保这个容器只用来