基于matlab的四轴机械臂运动学逆运算

大家好!这是我第一次写客博,肯定会有表达不清楚和有些东西没讲到,在这就提前跟大家说下,麻烦大家多多见谅!学生党的一次学习记录。也是自己在网上找到关于四轴机器臂的教程较少,希望能给像我一样在解四轴机器臂时遇到问题的人一点点帮助。

关于四轴机械臂轴的角度求解主要有两种,一种代数法(需要建立D-H表),一种几何法(画图)。

这里我选择代数法几何法来对我的四轴机械臂进行计算,主要代数法在后续可以更方便地继承下去,几何法用来提高求解速度。

一、前期准备

1.机器人运动学基础学完,我这里推荐去b站看林沛群老师的机器人学。基本上学完运动学部分就可以做机器人的基本操作了。

07e712967a8a483bb11e9d23087c7355.png

2.matlab机器人工具箱,后面我主要用matlab来对机械臂进行仿真和求解(matlab yyds!!!)

c098d038bff34192b34d3095cd7bbf19.png

3.机械臂的具体参数(D-H table)。我是先在solidworks上把机械臂的模型建立出来后,直接在 

SW上找出机械臂的D-H table。(左边是机械臂相关参数,右边是我每个轴的坐标系建立)

c65fbd290ae64d689abfb5db65806c06.png52f71b7506db4f16bfe5ab52e1c2edae.png

D-H Table
iαi-1ai-1diθi
10079.05(0°)
2-90°00(0°)
3076.890(-135°)
4074.150(135°)
50113-14.09(0°)

我的第0轴在世界坐标系上,所有第1轴相对于第0轴有个位移,个人觉得还是有必要的。然后我的第5轴其实就是物件相对于机械臂第4轴的附加轴,我是希望物件的x、z轴方向与世界坐标系的方向相同。每个轴都是在舵机转动的中心位置,手画的不要太在意。

如果D-H table不太会的话,可以跟着林沛群老师上课的ppt里面的图来。α和θ的正负号就是右手定则。(如图下图)

e3e3891500854fe4a2349edb62f789c5.png

二、求解方法

1、多重解

对于机器臂末端确定为某个点时,机械臂可能存在多种位置情况,在我们运用代数求解就会发现,对某个角度求解的公式有开根号的情况,这样在一个角度就会有两个解,而还没求解的角度又基于以求的角度来求解,所以就会产生多个解的情况。所以在求解的过程中,我加入了几何法求解θ1,从而减少了复杂度(这种方法的解与我的机械结构有关)

2、求解方法

像上面所说在我的机械臂逆运动学求解中我使用了代数法几何法。我认为我这样既方便了后续改进和提高了运算的速度。

首先我们先来了解下代数法对前三轴的求解方法,下面这个公式是整个计算的核心,也基本包含了我们整个计算需要的内容。

其中最左边的4×1矩阵为T04(第4轴相对于第0轴的转换矩阵)的ORG(位移矩阵)

(1)这样T04就是我们第一个需要算出来的内容,从机械臂的坐标系统图中可以知道T04可以通过T45(目标物件相对于第4轴的转换矩阵)、TW5(目标物件相对于世界坐标系的转换矩阵)和TW0(第0轴相对于世界坐标系的转换矩阵)来求解。

这里可以用matlab来计算,节省时间。

syms x y z;
Two = [1,0,0,0;
       0,1,0,0;
       0,0,1,79.05;
       0,0,0,1];
T45 = [1,0,0,113;
       0,0,-1,-14.09;
       0,1,0,0;
       0,0,0,1];
Tw5 = [1,0,0,x;
       0,1,0,y;
       0,0,1,z;
       0,0,0,1];
T04 = inv(Two)*Tw5*inv(T45)

其中[x-113;y;z-4657/50;1]就是我的T04里的ORG(位移矩阵)

(2)下面我们来求出我们等号左边的

在机器人运动学中,改进版的D-H table中所有的

所以我们直接把我们D-H table里面 的值带进这个公式就可以直接求出第i轴相对第i-1轴的转换矩阵。(注意,我在这里就犯了错误,其实在新版的D-H table中,第i轴的α和a都已经是i-1了,所以可以 把第 i 行的数据直接代进就行。)同样为了方便计算,我们还是用matlab。

syms theta1 theta2 theta3 theta4;
alpha=[0,-90,0,0];%α列的所有值,下面同理
a=[0,0,76.90,74.15];
d=[0,0,0,0];
T1 = mat(theta1,alpha(1),a(1),d(1));
T2 = mat(theta2,alpha(2),a(2),d(2));
T3 = mat(theta3,alpha(3),a(3),d(3));
T4 = mat(theta4,alpha(4),a(4),d(4));
disp(T1);
function T=mat(ti,ali_1,ai_1,di) %输入thetai alphai-1 ai-1 di,返回转换矩阵
T=[cosd(ti),-sind(ti),0,ai_1;
   sind(ti)*cosd(ali_1),cosd(ti)*cosd(ali_1),-sind(ali_1),-sind(ali_1)*di;
   sind(ti)*sind(ali_1),cosd(ti)*sind(ali_1),cosd(ali_1),cosd(ali_1)*di;
   0,0,0,1];
end

>> scdn
[cos((pi*theta1)/180), -sin((pi*theta1)/180), 0, 0]
[sin((pi*theta1)/180),  cos((pi*theta1)/180), 0, 0]
[                   0,                     0, 1, 0]
[                   0,                     0, 0, 1]

返回结果是这样的,由于在函数里我用的是cosd、sind它们返回的是角度值,所以(pi*theta1)/180可以直接看成theta1。这样我们T01、T12、T23、T34都全部求解出来了,P34_ORG就是T34的位移矩阵,与上面同理。

(3)我们将T23*P23_ORG的结果可以看成一个关于θ3的函数f(θ),并且我们要把每个f(θ)写出来。

可以按照公式进行求解,由于我上面已经把T23、T34的具体值算出来的,所以我还是选择用matlab来算,因为matlab太方便啦!

T4org = [T4(1,4);T4(2,4);T4(3,4);T4(4,4)];
F = T3 *T4org

>>F =
 
(1483*cos((pi*theta3)/180))/20 + 769/10
         (1483*sin((pi*theta3)/180))/20
                                      0
                                      1

然后我们一部到位,剩下都是与上面同理的,到g(θ2,θ3)的函数与T01相乘结束。我们同样用公式也可以吧g(θ2,θ3)的表达式求出来就行。

G = simplify(T2*F) %simplify是用来对公式化简的,非常方便

>>G =
 
  (1483*cos((pi*(theta2 + theta3))/180))/20 + (769*cos((pi*theta2)/180))/10
                                                                          0
- (1483*sin((pi*(theta2 + theta3))/180))/20 - (769*sin((pi*theta2)/180))/10
                                                                          1
 

(4)然后我们可以回到开头吧T04的ORG结合到我们化简的最后一步

在我这个机械臂系统中,


r = F(1,1)^2+F(2,1)^2+F(3,1)^2;
r=simplify(f)
>>r =
 
(1140427*cos((pi*theta3)/180))/100 + 4564733/400

这样我们就求出了只包含了θ3未知数的方程组,所以

(x^2+y^2+z^2-11411.8325>11404.27),其实这样求出的θ3是有限制的,但是将就能用,如果以后我知道了其他的解法我再补充。我们知道了θ3后就可以代进g(θ)里面对θ2求解了。

(5)在上面我们可以知道,我们将θ3代入f(θ),就能求出f1和f2的值。对于这种公式有个专门求解的公式。

我们把公式里面的值带入就可以得到θ2的结果了

(6)对θ1的求解我们用更方便的解法——几何法。第5轴(物件)的x,y坐标投影到世界坐标系上,x,y值为第5轴(物件)相对于世界坐标系的投影值。那么θ1可以直接用反正切求解

(7)这样我们就吧θ1、θ2和θ3全部求解出来了。下面我们就需要利用上面三个角度来求解θ4。

在(1)中,我们用

求出了T04,再借用T04=T01*T12*T23*T34,等号左边已经求解出来了,而等号右边T01、T12、T23分别是带有未知数θ1、θ2、θ3的矩阵,我们把已经求出来的θ1、θ2、θ3带入到它们之中就可以求出T03,即T04 = T03*T34,而T34是θ4的矩阵。在(2)中我提到了转换矩阵的通用公式,当我们求出T34的具体值后,可以利用公式进行反推,这里我取了T34(1,1)对θ4反余弦求解,那么剩下的就交给matlab了!

theta1 = atand(y/x);
theta2 = 2*atand((f1+sqrt(f1^2+f2^2-z^2))/(f2-z));%只取了一种情况
theta3 = -acosd(((x.^2+y.^2+z.^2)-11411.8325)/11404.27);
T03 = simplify(T1*T2*T3);
T34 = inv(T03)*T04;%T34矩阵的数可以被全部求解出来
theta4 = acosd(T34(1,1)); %由T34的推导公式可知
disp(T34);

这里我只写了θ4的运算过程,在算的时候还要考虑θ2的多重解的情况。还有就是要考虑θ1的情况,每个人情况不一样,我这就先不说了。还有就是归0处理,θ2和θ3在matlab求解出来的值常常有小数点后很多位,比如(θ2 = -0.0045),这种情况在计算θ4时需要转换为0。

3 、角度选择

由于我们在前面求出了多种解,所以我们还需要确定哪种解可以用在我的机械臂上。(在这个点中,我只能按照自己在求解过程中的遇到的情况来讲解。

我遇到的一个问题是,θ3与我实际机械臂(实物)转动角度差135°,θ2和θ4则与实际转动角度互为相反数。所以大家在求解出角度后,最好在matlab上验证下求解的角度与实际角度是否存在一个固定的偏差。

还有一个就是要考虑最后实物每个轴的转动角度是否与你在matlab仿真中的轴的角度旋转方向相同,我就出现了θ2、θ4转动角度刚好相反的情况。

最后还要对算出的解根据实际电机所能转动的角度给定阈值。判断电机是否能后到达该角度。

回到正题,在解出的两个解中要选择一个正确且轨迹最短的解,我这里选择的是判断求解出的两个θ2与当前机械臂所处位置的θ2的差值大小来选择哪一组解,因为在机器人运动学中,机器臂位置改变主要考前三轴的转动来决定的。在我实践中是没用发现问题的。

三、MATLAB模拟仿真

在matlab中对我们自己设计的机械臂进行仿真,需要用到matlab机器人工具箱,这个工具真的很强大,我也只学到一点点,够用。

工具箱的具体安装教程,大家就自己搜索,这里我就直接使用我们需要的知识。

L(1)=Link('revolute','d',79.05,'a',0,'alpha',0,'modified');
L(2)=Link('revolute','d',0,'a',0,'alpha',-pi/2,'offset',0,'modified');
L(3)=Link('revolute','d',0,'a',76.89,'alpha',0,'offset',(-135/180)*pi,'modified');
L(4)=Link('revolute','d',0,'a',74.15,'alpha',0,'offset',(135/180)*pi,'modified');
L(5)=Link('revolute','d',-14.09,'a',113,'alpha',pi/2,'offset',0,'modified');
Four_dof_mod = SerialLink(L,'name','4-dof');
Four_dof_mod.base=transl(0,0,0);
Four_dof_mod.teach; 

首先我们需要在matlab中建立每个连接点(Link)的参数,其实也就是把我们之前写的D-H table转换成matlab代码。其中L(1)-L(5)就是每个轴的名称,然后(‘revolute’)表示这个连接点为转动副(移动副为‘Prismatic’)。然后转动副的θ是不确定的,这里我们就需要为它设置一个初始值(‘offset’),比如你可以设定你机械臂电机初始状态存在的位置。然后其余的(‘d’),(‘a’),('alpha')就直接照抄就行。

不知道大家有没有注意到我的角度是用弧度制表示的,因为机器人工具箱本身的原因,我们在机器人工具箱里面的所有角度都需要用弧度制。

因为我的D-H table是改进型的,所以我们在建立连接点时,需要申明该连接点为(‘modified’)

这里我机械臂为4轴,但建立了5个连接点,是因为这样可以把末端抓取的中心点包括进来,并且提高我们仿真的可视化,第5个点就是我们末端抓取物件的点。

Four_dof_mod = SerialLink(L,'name','4-dof')中,SerialLink(L,'name','4-dof')将5个连接点(Link)连接起来,组件了整个机器人的系统,并且把这个系统命名为‘4-dof’。然后就把这个系统的内容存储到Four_dof_mod中,便于我们后续对其进行操作。

Four_dof_mod.base=transl(0,0,0)   可以理解为设置机器人系统的世界坐标系的位置,也是设置机器人系统的底座位置。

Four_dof_mod.teach 机器人示教,生成一个GUI窗口,可以对我们创建的机器人进行操作控制。

当然,我们上面求解了那么久,不就是想验证和仿真到底对不对吗。

这里要用到xxx.plot()函数,将我们求解出来的角度按顺序放入plot中,示教的GUI窗口将自动移动到相应的角度。基本可以看到示教出来目标位置,与我们求解的目标位置相近(不用看左上角的X:Y:Z的值,它这里没用自动计算出最后的位置坐标)

想从示教上看到算出的位置坐标,就只能在左下角输入求解的角度,他就能显示数来了,可以看到求解出来的坐标与我们设置的坐标相近,证明我们求解的角度没问题。

四、结语 

这篇文字中,我只是分享下自己在算机器人逆运动学的一些心得和方法,该解法也有一定的局限性,我希望能给像我一样刚接触机器人运动学的新手提供一种求解思路,如果大家也有其他的好方法,希望能够一起交流学习下。

本来想把实物的运动效果也放上的,但这篇文章是放假回家写的,所以等以后再看实际效果图了。

  • 32
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
从引用中可以看出,求解四轴机械臂逆运动学可以分为以下几个步骤: 1. 计算四轴机械臂和六轴机械臂的工作空间,并找到它们的交集区域。 2. 在交集区域内设计一个点P作为输入,然后计算四轴机械臂的正运动学。 3. 利用点P的位置信息,计算六轴机械臂逆运动学。 4. 将步骤3中得到的结果作为输入,计算六轴机械臂的正运动学,并验证其与点P的位置是否一致。 对于求解四轴机械臂逆运动学,引用提到了一种解法。首先,可以通过末端点的坐标来确定关节j0,然后循环给关节j1赋值,通过余弦定理等运算推导出关节j2和j3。这样可以得到多个解,最后需要添加约束条件来找出最优解。 因此,你可以使用MATLAB编程来实现四轴机械臂逆运动学。可以先确定末端点坐标,然后通过计算得到关节j0的值。接下来,循环赋值关节j1,并利用余弦定理等运算推导出关节j2和j3。最后,根据添加的约束条件找出最优解。这样就可以得到四轴机械臂逆运动学解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [四轴六轴机械臂基础运动仿真实验(Matlab)](https://blog.csdn.net/weixin_38416334/article/details/87914069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [机器人控制算法一之四轴机械臂正、逆运动学详解](https://blog.csdn.net/yohnyang/article/details/126117662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值