计算ABB机器人轴配置cfx参数

[复制链接]
查看42801 | 回复0 | 前天 06:52 | 显示全部楼层 |阅读模式






       机器人如何从各轴角度算出当前XYZ 一文介绍过ABB机器人获取DH参数和运动学正解方法,注意在使用如下DH参数时,平移和旋转顺序为

,即先绕当前x轴旋转α度,再沿新的x轴平移a,再绕新的Z轴旋转θ度,再沿新的Z轴平移d

     以下距离IRB120机器人DH参数:

αi   (twist)

ai(mm)  length

Θi  Rotation

di(mm) offset

1

0

0

0

290

2

-π/2

0

-π/2

0

3

0

270

0

0

4

-π/2

70

0

302

5

π/2

0



0

6

π/2

0

0

72

故按照上式定义计算后整理,可以用得到基于DH参数的位姿矩阵如下:



      上式称为位姿矩阵。其中左上角为旋转矩阵。对于旋转矩阵,可以采用四元数的简化表达方式。所以上述位姿矩阵可以转化为ABB机器人使用的POSE数据类型[[x,y,z],[q1,q2,q3,q4]]

      对于

,则可以将每一次平移和旋转作为一个Pose数据的右乘。

      ABB机器人的点位信息robtarget,除了有Pose数据,还有轴配置信息。

      Confdata包括cf1,cf4,cf6和cfx。对于cf1,若当前1轴角度为0-90,则cf1为0,1轴角度90-180,cf1为1,1轴角度为-90~0°,则cf1为-1,其他以此类推。Cf4和cf6同理。具体可以参考轴配置confdata解释 一文

对于cfx,介绍如下。





注:

1. “相对于轴1 的腕中心”:意义为当前5轴坐标系在1轴坐标系下的关系。轴1坐标系会随着1轴转动而转动,轴5坐标系也会随着其他轴转动而转动。“在前面”的意思是轴5坐标系在轴1坐标系下的前方,即在轴1坐标系下的轴5坐标系位置的x为正

2. “相对于下臂的腕中心”:意义为当前5轴坐标系在2轴坐标系下的关系。轴2坐标系会随着2轴转动而转动,轴5坐标系也会随着其他轴转动而转动。“在前面”的意思是轴5坐标系在轴2坐标系下的前方,即在轴2坐标系下的轴5坐标系位置的y为正(轴2坐标系如图,前方为Y方向)



代码如下:
  LOCALVAR num alpha{6}:=[0,-90,0,-90,90,90];   LOCALVAR num a{6}:=[0,0,270,70,0,0];   LOCALVAR num theta{6}:=[0,-90,0,0,-180,0];   LOCALVAR num d{6}:=[290,0,0,302,0,72];!以上为IRB120机器人 DH参数
funcnum n_cal_cfg(jointtarget j1)       VAR num n_cfx;       VAR robtarget ptmp;       VAR pose pose1{6};       VAR pose pose10{6};       VAR pose pose3_5:=[[0,0,0],[1,0,0,0]];       VAR pose pose2_5:=[[0,0,0],[1,0,0,0]];       VAR pose pose6:=[[0,0,0],[1,0,0,0]];       VAR jointtarget jtmp:=[[0,0,0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];       jtmp:=j1;       curr_angle{1}:=jtmp.robax.rax_1;       curr_angle{2}:=jtmp.robax.rax_2;       curr_angle{3}:=jtmp.robax.rax_3;       curr_angle{4}:=jtmp.robax.rax_4;       curr_angle{5}:=jtmp.robax.rax_5;       curr_angle{6}:=jtmp.robax.rax_6;       FOR i FROM 1 TO 6 DO           pose1{i}:=f_dh2pose(alpha{i},a{i},theta{i}+curr_angle{i},d{i});          !获取各轴坐标系的位姿矩阵       ENDFOR       pose3_5:=[[0,0,0],[1,0,0,0]];       FOR i FROM 3 TO 5 DO           pose3_5:=PoseMult(pose3_5,pose1{i});       ENDFOR       !计算轴3坐标系到轴5坐标系的变化,即轴5坐标系在2轴坐标系的位姿       pose2_5:=[[0,0,0],[1,0,0,0]];       FOR i FROM 2 TO 5 DO           pose2_5:=PoseMult(pose2_5,pose1{i});       ENDFOR       !计算轴2坐标系到轴5坐标系的变化,即轴5坐标系在1轴坐标系的位姿
       IF pose2_5.trans.x>0 THEN           !判断腕坐标系在轴1坐标系的前后
               IF pose3_5.trans.y>0 THEN           !判断腕坐标系在轴2坐标系的前后,轴2坐标系前方为y方向               IF jtmp.robax.rax_5>0 THEN           !判断5轴角度                   n_cfx:=0;               ELSE                   n_cfx:=1;               ENDIF           ELSE               IF jtmp.robax.rax_5>0 THEN                   n_cfx:=2;               ELSE                   n_cfx:=3;               ENDIF           ENDIF       ELSE           IF pose3_5.trans.y>0 THEN               IF jtmp.robax.rax_5>0 THEN                   n_cfx:=4;               ELSE                   n_cfx:=5;               ENDIF           ELSE               IF jtmp.robax.rax_5>0 THEN                   n_cfx:=6;               ELSE                   n_cfx:=7;               ENDIF           ENDIF       ENDIF       return n_cfx;ENDFUNC
FUNCpose f_dh2pose(num alpha,num a,num theta,num d)       VAR pose pose1:=[[0,0,0],[1,0,0,0]];      !计算各轴位姿矩阵并转化为Pose      !顺序为先绕当前x轴旋转α度,再沿新的x轴平移a,再绕新的Z轴旋转θ度,再沿新的Z轴平移dpose1:=PoseMult(pose1,[[0,0,0],orientzyx(0,0,alpha)]);       pose1:=PoseMult(pose1,[[a,0,0],orientzyx(0,0,0)]);       pose1:=PoseMult(pose1,[[0,0,0],orientzyx(theta,0,0)]);       pose1:=PoseMult(pose1,[[0,0,d],orientzyx(0,0,0)]);       RETURN pose1;  ENDFUNC


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则