2021-08-23

KUKA机器人运动指令

DECL
KUKA机器人的资料网上太少了,KUKA的文档也写得有点绕,我决定把这块补齐,可能不够全面深入,但基本能用(欢迎指出不足)。刚入门的工程师查不到资料,那可太艹了。
可以转载,但一定要通知作者 @Alef 。发现侵权,律师函警告.JPG。不是开玩笑的。
BEGIN
此次主要分享以下内容:
1.直线运动
2.点到点
3.圆弧运动
4.参数变量解释
5.其他的不常用的运动

KUKA机器人的运动大致分为3类,分别是直线运动,点到点(P-to-P),以及圆弧运动。
在介绍指令之前,我们需要了解kuka程序的2类文件。
第1类是“.SRC文件”,这里是程序主体,运动指令在此创建和执行。示教器R1目录下,很直观的能见到。
第2类是“.DAT文件”,也就是数据文件,运动指令相关参数一般声明在此。如在示教器上不可见,在专家以或以上权限,“过滤”-“全部”即可看到。
一般在示教器新建“Modul”时会自动生成同名的2个文件。
下面回到主题,讲解运动指令

一 .直线运动
1.LIN 指令。
在示教器上折叠状态是“LIN P1 Vel=2 m/s CPDAT1 Tool[1] Base[0]”,在展开之后是下列一串指令。

$BWDSTART =FALSE
LDAT_ACT = LCPDAT1
FDAT_ACT = FP1
BAS(#CP_PARAMS,2.0)
SET_CD_PARAMS(0)
LIN XP1
我们现在来解析这一串指令:在“LIN XP1”之前的都是LIN指令参数的设置,“LIN XP1”运动到“XP1”这个位置。
$BWDSTART =FALSE—>开始动作的说明,无特殊含义。
LDAT_ACT = LCPDAT1—> 加载LCPDAT1中数据至临时变量:含速度,加速度,圆滑过渡等参数。
FDAT_ACT = FP1—>加载FP1中数据至临时变量:含工具,坐标等参数。
BAS(#CP_PARAMS,2.0)—>函数运行后,会检查计算临时变量里的数值,并设定2.0的速度。
LIN XP1 —>根据以上参数,机器人执行运动。

2.SLIN指令。
在示教器上折叠状态是“SLIN P1 Vel=2 m/s CPDAT2 Tool[2] Base[0]”,在展开之后是一条长指令。

SLIN XP1 WITH $VEL =SVEL_CP(2.0, LCPDAT2), $TOOL =STOOL2(FP2), $BASE =SBASE(FP2.BASE_NO), $IPO_MODE =SIPO_MODE(FP2.IPO_FRAME), $LOAD =SLOAD(FP2.TOOL_NO), $ACC =SACC_CP(LCPDAT2), $ORI_TYPE =SORI_TYP(LCPDAT2), $APO =SAPO(LCPDAT2), $JERK =SJERK(LCPDAT2), $COLLMON_TOL_PRO[1]=USE_CM_PRO_VALUES(0)
我们手动把每个逗号换行来看
SLIN XP1 —>本次运动目标为XP1
WITH —>后面都是参数修饰
$VEL =SVEL_CP(2.0, LCPDAT2)—>使用LCPDAT2中的速度 和其他参数
$TOOL =STOOL2(FP2)—>使用FP2中的工具
$BASE =SBASE(FP2.BASE_NO)—>使用FP2中的基坐标
$IPO_MODE =SIPO_MODE(FP2.IPO_FRAME)—>使用FP2中的IPO模式设置
$LOAD =SLOAD(FP2.TOOL_NO)—>使用FP2中的负载
$ACC =SACC_CP(LCPDAT2)—>使用LCPDAT2中的加速度
$ORI_TYPE =SORI_TYP(LCPDAT2)—>使用LCPDAT2中的回转设置
$APO =SAPO(LCPDAT2)—>使用LCPDAT2中的圆滑距离
$JERK =SJERK(LCPDAT2)—>使用LCPDAT2中的加加速度
$COLLMON_TOL_PRO[1]=USE_CM_PRO_VALUES(0)—>使用碰撞监控表0的数据

明后天续后面的,写完P2P,圆弧,再具体说下运动参数。今天先这样。
2021.08.22.22.33更
开始续杯 …

二. 点到点运动
1.PTP 指令。
在示教器上折叠状态是“PTP p3 CONT Vel=100 % PDAT4 Tool[3] Base[0] ColDetect[1]”,在展开之后是下列一串指令。

$BWDSTART = FALSE PDAT_ACT = PPDAT4 FDAT_ACT = Fp3 BAS(#PTP_PARAMS, 100.0) SET_CD_PARAMS (1) PTP Xp3 C_DIS
我们现在来解析这一串指令:在“PTP XP3”之前,都是PTP指令参数的设置,“PTP XP3”,运动到“XP3”这个位置。
$BWDSTART =FALSE—>开始动作的说明,无特殊含义。
PDAT_ACT = PPDAT4—> 加载LCPDAT4中数据至临时变量:含速度,加速度,圆滑过渡等参数。
FDAT_ACT= FP3—>加载FP3中数据至临时变量:含工具,坐标等参数。
BAS(#PTP_PARAMS,100.0)—>函数运行后,会检查计算临时变量里的数值,并设定100%的速度。
SET_CD_PARAMS (1)—>使用碰撞监控表1的数据,
PTP XP4 —>根据以上参数,机器人执行运动。
C_DIS —>启用圆滑过渡

2.SPTP指令。
在示教器上折叠状态是“SPTP p4 CONT Vel=100 % PDAT4 Tool[4] Base[0] ColDetect[1]”,在展开之后是一条长指令。

SPTP Xp4 WITH $VEL_AXIS[1]=SVEL_JOINT(100.0), $TOOL =STOOL2(Fp4), $BASE =SBASE(Fp4.BASE_NO), $IPO_MODE =SIPO_MODE(Fp4.IPO_FRAME), $LOAD =SLOAD(Fp4.TOOL_NO), $ACC_AXIS[1]=SACC_JOINT(PPDAT4), $APO =SAPO_PTP(PPDAT4), $GEAR_JERK[1]=SGEAR_JERK(PPDAT4), $COLLMON_TOL_PRO[1]=USE_CM_PRO_VALUES(1) C_Spl
我们手动把每个逗号换行来看
SPTP XP4 —>本次运动目标为XP4
WITH —>后面都是参数修饰
$VEL_AXIS[1] = SVEL_JOINT(100.0)—>将100(%)的轴速度,分配到6个轴
$TOOL = STOOL2(FP4) —>使用FP4中的工具
$BASE = SBASE(FP4.BASE_NO) —>使用FP4中的基坐标
$IPO_MODE = SIPO_MODE(FP4.IPO_FRAME) —>使用FP4中的
$LOAD = SLOAD(FP4.TOOL_NO) —>使用FP4中的负载
$ACC_AXIS[1] = SACC_JOINT(PPDAT4) —>使用PPDAT4中的轴加速度
$APO = SAPO_PTP(PPDAT4) —>使用FP4中的圆滑距离
$GEAR_JERK[1] = SGEAR_JERK(PPDAT4) —>使用PPDAT4中的轴加加速度
$COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(1) —>使用碰撞监控表1的数据
C_SPL —>本次运动启用圆滑过渡

三.圆弧运动
1.CIRC 指令。
在示教器上折叠状态是“CIRC p7 p8 CONT Vel=2 m/s CPDAT6 Tool[4] Base[0] ColDetect[1]”,在展开之后是下列一串指令。

$BWDSTART =FALSE
LDAT_ACT = LCPDAT6
FDAT_ACT = Fp8
BAS(#CP_PARAMS,2)
SET_CD_PARAMS(1)
CIRC Xp7, Xp8 C_Dis C_Dis
我们现在来解析这一串指令:在“CIRC Xp7, Xp8”之前的都是CIRC指令参数的设置,“CIRC Xp7, Xp8”,从当前点经过XP7, XP8生成圆弧路径。
$BWDSTART =FALSE—>开始动作的说明,无特殊含义。
LDAT_ACT = LCPDAT6—> 加载LCPDAT1中数据至临时变量:含速度,加速度,圆滑过渡等参数。
FDAT_ACT = FP8—>加载FP8中数据至临时变量:含工具,坐标等参数。
BAS(#CP_PARAMS,2)—>函数运行后,会检查计算临时变量里的数值,并设定2.0的速度。
SET_CD_PARAMS(1)—>使用碰撞监控表1的数据
CIRC Xp7, Xp8 —>从当前点经过XP7,XP8执行圆弧运动。
C_Dis C_Dis —>本次运动启用圆滑过渡
2.SCIRC指令。
在示教器上折叠状态是“SCIRC p7 p8 CONT Vel=2 m/s CPDAT6 ANGLE=90° Tool[4] Base[0] ColDetect[1]”,在展开之后是一条长指令。

SCIRC Xp7, Xp8, CA 90 WITH $VEL =SVEL_CP(2.0, LCPDAT6), $TOOL =STOOL2(Fp8), $BASE =SBASE(Fp8.BASE_NO), $IPO_MODE =SIPO_MODE(Fp8.IPO_FRAME), $LOAD =SLOAD(Fp8.TOOL_NO), $ACC =SACC_CP(LCPDAT6), $ORI_TYPE =SORI_TYP(LCPDAT6), $CIRC_TYPE =SCIRC_TYP(LCPDAT6), $APO =SAPO(LCPDAT6), $CIRC_MODE =SCIRC_M(LCPDAT6), $JERK =SJERK(LCPDAT6), $COLLMON_TOL_PRO[1]=USE_CM_PRO_VALUES(1) C_Spl
我们手动把每个逗号换行来看
SCIRC Xp7, Xp8, CA 90 —>本次运动目标为 经过XP7,XP8 的圆弧,长度为90°(π/4)
WITH —>后面都是参数修饰
$VEL =SVEL_CP(2.0, LCPDAT6)—>2M/S的速度,使用LCPDAT6中的速度 和其他参数
$TOOL =STOOL2(Fp8)—>使用FP8中的工具
$BASE =SBASE(Fp8.BASE_NO)—>使用FP8中的基坐标
$IPO_MODE =SIPO_MODE(Fp8.IPO_FRAME)—>使用FP8中的IPO模式设置
$LOAD =SLOAD(Fp8.TOOL_NO)—>使用FP8中的负载
$ACC =SACC_CP(LCPDAT6)—>使用LCPDAT6中的加速度
$ORI_TYPE =SORI_TYP(LCPDAT6)—>使用LCPDAT6中的回转设置
$CIRC_TYPE =SCIRC_TYP(LCPDAT6)—>使用LCPDAT6中的姿态引导
$APO =SAPO(LCPDAT6)—>使用LCPDAT6中的圆滑距离
$CIRC_MODE =SCIRC_M(LCPDAT6)—>使用LCPDAT6中姿态参考模式
$JERK =SJERK(LCPDAT6)—>使用LCPDAT6中加加速度
$COLLMON_TOL_PRO[1]=USE_CM_PRO_VALUES(1)—>使用碰撞监控表1的数据
C_Spl —>本次运动启用圆滑过渡

四.参数变量解释
1.点位
有两种表达方式,1是以笛卡尔坐标系来描述的POS一般含6个元素 {x ,y ,z ,a ,b ,c },E6POS还额外含{s,t,e1,e2,e3,e4,e5,e6}。2是以轴坐标系描述AXIS {A1,A2,A3,A4,A5,A6},E6AXIS 也额外包含了{e1,e2,e3,e4,e5,e6}。当然也可用FRAME等其他方式定义。
我们通过示教生成的点位都是E6POS的结构,系统还会在点位名前自动加一个 ‘X’ ,如示教一个叫’pos_temp’的点位,那么实际出来的变量名是’Xpos_team’ 。
2.参考坐标
$TOOL :参考的工具坐标
$BASE :参考的基坐标
3.速度
$VEL:插补(直线,圆弧)速度,单位M/S
$ACC:插补加速度
$VEL_AXIS[n]:第n个轴的速度
$ACC_AXIS[1] :第n个轴的加速度
$GEAR_JERK[1] :第n个轴的加加速度
4.其他参数
$IPO_MODE:工具状态(在外部或是在TCP上)
$LOAD:负载参数
$ORI_TYPE :回转时,方向引导的设置(恒定或是变化)
$APO :圆滑距离,单位mm
$COLLMON_TOL_PRO[n] : 第n个轴的碰撞识别数值
以上是在做项目时非常具体参数,至于更多的参数解释需要翻看说明书。一般的参数阅读说明文档《机器人编程2》第5章可查到。更多解释需要看说明文档《system Variables》,目前中文译本较旧,英文版较新。

五.不常用的运动指令
1.偏移(这个相对常用)
LIN {X 10,Y 20,Z 0,A 0,B 0,C 0}:XP1
PTP {X 10,Y 20,Z 0,A 0,B 0,C 0}:XP1
SLIN {X 10,Y 20,Z 0,A 0,B 0,C 0}:XP1
SPTP {X 10,Y 20,Z 0,A 0,B 0,C 0}:XP1
以上都表示,在运动至XP1点的 x 方向10mm,y 方向 20 mm 的位置
2.绝对定位
PTP {A1 0, A2 -80, A3 75, A4 30, A5 30, A6 110},
表示 运动到此 轴坐标;

PTP {A1 30} ,
仅 A1 移动至 30° ;

PTP {X 100, Y -50, Z 1500, A 0, B 0, C 90, S 3, T3 35},
表示 运动到此 笛卡尔坐标(同时也需参考基坐标和工具坐标);

END
欢迎指出不足,有疑问也可私信交流,mythalef@foxmail.com。
2021.08.23.22.10更

  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用 Java 中的 LocalDateTime 类来处理时间。 首先,我们需要将给定的时间段转换为 LocalDateTime 对象: ```java LocalDateTime start = LocalDateTime.of(2020, 11, 20, 0, 0, 0); LocalDateTime end = LocalDateTime.of(2021, 10, 9, 23, 59, 59); ``` 这里将结束时间设置为 23:59:59 是因为我们想要包含该日期的所有时间。 接下来,我们可以使用一个循环来遍历时间段中的每一天,并获取该天的开始时间和结束时间: ```java LocalDateTime current = start; while (!current.isAfter(end)) { LocalDateTime dayStart = current.withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime dayEnd = current.withHour(23).withMinute(59).withSecond(59).withNano(999999999); System.out.println("Day " + current.toLocalDate() + " starts at " + dayStart + " and ends at " + dayEnd); current = current.plusDays(1); } ``` 这里,我们使用 `withHour`、`withMinute`、`withSecond` 和 `withNano` 方法来设置每天的开始时间和结束时间。然后,我们可以使用 `plusDays` 方法来增加 `current` 对象的日期,以便遍历整个时间段。 完整代码如下: ```java import java.time.LocalDateTime; public class Main { public static void main(String[] args) { LocalDateTime start = LocalDateTime.of(2020, 11, 20, 0, 0, 0); LocalDateTime end = LocalDateTime.of(2021, 10, 9, 23, 59, 59); LocalDateTime current = start; while (!current.isAfter(end)) { LocalDateTime dayStart = current.withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime dayEnd = current.withHour(23).withMinute(59).withSecond(59).withNano(999999999); System.out.println("Day " + current.toLocalDate() + " starts at " + dayStart + " and ends at " + dayEnd); current = current.plusDays(1); } } } ``` 输出结果如下: ``` Day 2020-11-20 starts at 2020-11-20T00:00 and ends at 2020-11-20T23:59:59.999999999 Day 2020-11-21 starts at 2020-11-21T00:00 and ends at 2020-11-21T23:59:59.999999999 Day 2020-11-22 starts at 2020-11-22T00:00 and ends at 2020-11-22T23:59:59.999999999 ... Day 2021-10-07 starts at 2021-10-07T00:00 and ends at 2021-10-07T23:59:59.999999999 Day 2021-10-08 starts at 2021-10-08T00:00 and ends at 2021-10-08T23:59:59.999999999 Day 2021-10-09 starts at 2021-10-09T00:00 and ends at 2021-10-09T23:59:59.999999999 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值