ABB机器人|带连杆的机器人正运动学计算
1. IRB1410 机器人为典型的带连杆的ABB机器人,J3电机如图所示。J3电机置于底部,可以减轻上部的机构重量
2. 运动时,J3电机带动J3连杆。3轴,J3连杆,上臂和后端连杆构成如图的平行四边形结构。
3. 所以,若2轴电机转动,但3轴电机不转动,此时3轴和大臂的夹角会变化(没有连杆的机器人,2轴电机转动,3轴电机不转动,3轴和大臂夹角不会变化)
以上两幅图片,3轴均为0度,但由于2轴转动,3轴与大臂夹角不一样
4. 对于不带连杆的机器人正运动学,可以通过dh参数转化为各个轴的位姿矩阵,将6个位姿矩阵右乘即可得到当前机器人末端的笛卡尔坐标,具体参见
5. 但对于带连杆机器人,2轴的变化会导致3轴与大臂夹角发生变化。由于平行四边形结构的缘故,实质3轴与大臂夹角变化刚好等于2轴变化角度的负数。
6. 故在位姿矩阵右乘时,只需在右乘到轴3 矩阵后,再右乘一个旋转矩阵,将夹角补偿回来即可。
7. 1410机器人DH参数如下
αi (twist) |
ai(mm) length |
Θi Rotation |
di(mm) offset |
|
1 |
0 |
0 |
0 |
475 |
2 |
-π/2 |
150 |
-π/2 |
0 |
3 |
0 |
600 |
0 |
0 |
4 |
-π/2 |
120 |
0 |
720 |
5 |
π/2 |
0 |
-π |
0 |
6 |
π/2 |
0 |
0 |
85 |
8. 针对1410类似带连杆机器人,机器人正运动学RAPID实现方法如下
ant; overflow-wrap: break-word ! import ant;">=[0,-90,0,-90,90,90]; : import
ant; overflow-wrap: break-word ! import ant;">=[0,150,600,120,0,0]; : import
ant; overflow-wrap: break-word ! import ant;">=[0,-90,0,0,-180,0]; : import
ant; overflow-wrap: break-word ! import ant;">=[475,0,0,720,0,85]; : import
ant; overflow-wrap: break-word ! import ant;">!1410 机器人DH参数 import
ant; overflow-wrap: break-word ! import ant;"> import
ant; overflow-wrap: break-word ! import ant;">VAR num no_dependent; import
ant; overflow-wrap: break-word ! import ant;">!3轴与大臂夹角 import
ant; overflow-wrap: break-word ! import ant;"> PROC test_dh_pose() import
ant; overflow-wrap: break-word ! import ant;">=[0,0,0,0,0,0]; : import
ant; overflow-wrap: break-word ! import ant;"> VAR pose pose10{6}; import
ant; overflow-wrap: break-word ! import ant;">=[[0,0,0],[1,0,0,0]]; : import
ant; overflow-wrap: break-word ! import ant;"> VAR jointtarget jtmp; import
ant; overflow-wrap: break-word ! import ant;">=CJointT(); : import
ant; overflow-wrap: break-word ! import ant;">=jtmp.robax.rax_1; : import
ant; overflow-wrap: break-word ! import ant;">=jtmp.robax.rax_2; : import
ant; overflow-wrap: break-word ! import ant;">=jtmp.robax.rax_3; : import
ant; overflow-wrap: break-word ! import ant;">=jtmp.robax.rax_4; : import
ant; overflow-wrap: break-word ! import ant;">=jtmp.robax.rax_5; : import
ant; overflow-wrap: break-word ! import ant;"> =jtmp.robax.rax_6; : import
ant; overflow-wrap: break-word ! import ant;"> FOR i FROM 1 TO 6 DO import
ant; overflow-wrap: break-word ! import ant;">3 THEN = import
ant; overflow-wrap: break-word ! import ant;">=-curr_angle{2}; : import
ant; overflow-wrap: break-word ! import ant;"> !夹角等于2轴运动的负数 import
ant; overflow-wrap: break-word ! import ant;"> endif import
ant; overflow-wrap: break-word ! import ant;">=f_dh2pose(i,alpha{i},a{i},theta{i}+curr_angle{i},d{i}); : import
ant; overflow-wrap: break-word ! import ant;"> ENDFOR import
ant; overflow-wrap: break-word ! import ant;"> FOR i FROM 1 TO 6 DO import
ant; overflow-wrap: break-word ! import ant;">=PoseMult(pose_cal,pose10{i}); : import
ant; overflow-wrap: break-word ! import ant;"> ENDFOR import
ant; overflow-wrap: break-word ! import ant;">ENDPROC import
ant; overflow-wrap: break-word ! import ant;"> import
ant; overflow-wrap: break-word ! import ant;"> FUNC pose f_dh2pose(num i,num alpha,num a,num theta,num d) import
ant; overflow-wrap: break-word ! import ant;">=[[0,0,0],[1,0,0,0]]; : import
ant; overflow-wrap: break-word ! import ant;">=PoseMult(pose1,[[0,0,0],orientzyx(0,0,alpha)]); : import
ant; overflow-wrap: break-word ! import ant;">=PoseMult(pose1,[[a,0,0],orientzyx(0,0,0)]); : import
ant; overflow-wrap: break-word ! import ant;">=PoseMult(pose1,[[0,0,0],orientzyx(theta,0,0)]); : import
ant; overflow-wrap: break-word ! import ant;">=PoseMult(pose1,[[0,0,d],orientzyx(0,0,0)]); : import
ant; overflow-wrap: break-word ! import ant;">3 THEN = import
ant; overflow-wrap: break-word ! import ant;">=PoseMult(pose1,[[0,0,0],orientzyx(no_dependent,0,0)]); : import
ant; overflow-wrap: break-word ! import ant;"> endif import
ant; overflow-wrap: break-word ! import ant;"> !针对轴3坐标系,需要再多乘一次旋转,将夹角补偿回来 import
ant; overflow-wrap: break-word ! import ant;"> RETURN pose1; import
ant; overflow-wrap: break-word ! import ant;"> ENDFUNC import