程序过滤

校准机器人后,您可以通过不同的方式使用机器人校准:

过滤现有程序:修改程序内的所有机器人目标,以提高机器人的精度。可以手动完成,也可以使用 API。

使用 RoboDK for Offline Programming 生成准确的程序(生成的程序已被过滤,包括使用 API 生成的程序)。

要手动过滤现有程序:将机器人程序文件拖放到 RoboDK 的主屏幕上(或选择文件➔ 打开),然后选择仅过滤。程序将被过滤并保存在同一文件夹中。过滤摘要将提及过滤算法是否存在问题。如果您想在 RoboDK 中模拟程序,也可以选择导入程序。如果程序有任何依赖关系(工具坐标系或基本坐标系定义、子程序......),它们必须位于导入第一个程序的同一目录中。

Robot Calibration LaserTracker - 图片 35

Robot Calibration LaserTracker - 图片 36

将程序导入RoboDK后,您可以在有或没有绝对精度的情况下重新生成程序。在RoboDK的主要精度设置中(工具➔ 选项➔ 精度),您可以决定是否始终使用精确运动学生成程序,是否希望RoboDK每次都询问,或者是否希望使用当前的机器人运动学。右击机器人,激活/禁用 "使用精确运动学 "标签,即可更改当前机器人运动学。如果激活,则会看到一个绿点;如果未激活,则会看到一个红点。

Robot Calibration LaserTracker - 图片 37

Robot Calibration LaserTracker - 图片 38

使用 API 过滤程序

在给定校准过的机器人和机器人程序的情况下,使用RoboDK可以通过调用FilterProgram过滤整个程序:

robot.FilterProgram(file_program)

在资源库的 "宏 "部分,有一个名为 "过滤程序"(FilterProgram)的宏示例。以下代码是使用 RoboDK API 过滤程序的 Python 脚本示例。

from robolink import *     # 与 RoboDK 通信的 API

from RoboDK import *       # 基本矩阵运算

导入 os                 # 路径操作

 

# 获取当前工作目录

CWD= os.path.dirname(os.path.realpath(__file__))

 

# 如果 RoboDK 没有运行,则启动它,并链接到 API

RDK = Robolink()

# 可选:提供以下参数,以便在幕后运行

#RDK= Robolink(args='/NOSPLASH /NOSHOW /HIDDEN')

 

# 获取校准后的工作站(.rdk 文件)或机器人文件(.robot):

# 提示:校准后,右键单击机器人,选择 "另存为 .机器人"。

calibration_file= CWD+ '/KUKA-KR6.rdk'

 

# 获取程序文件:

file_program= CWD+ '/Prog1.src'

 

# 载入 RDK 文件或机器人文件:

calib_item= RDK.AddFile(calibration_file)

if not calib_item.Valid():

    raise Exception("Something went wrong loading "+ calibration_file)

 

# 检索机器人(如果只有一个机器人,则无弹出窗口):

机器人= RDK.ItemUserPick('Select a robot to filter', ITEM_TYPE_ROBOT)

if not robot.Valid():

    raise Exception("未选择机器人或机器人不可用")

 

# 激活精度

机器人.setAccuracyActive(1)

# 筛选程序:这将自动保存一份程序副本

# 根据机器人品牌重命名文件

status, summary= robot.FilterProgram(file_program)

 

如果 status== 0

    print("Program filtering succeeded")

    print(summary)

calib_item.Delete()

RDK.CloseRoboDK()

否则

    print("Program filtering failed! Error code: %i" % status)

    print(summary)   

RDK.ShowRoboDK()

使用 API

以下代码是一个 Python 脚本示例,使用 FilterTarget 命令,利用 RoboDK API 过滤目标(位姿目标或关节目标):

pose_filt,关节 = robot.FilterTarget(nominal_pose, estimated_joints)

如果第三方应用程序(RoboDK 除外)使用位姿目标生成机器人程序,本示例将非常有用。

注意:如果程序是使用 API 自动生成的,则不需要这样做。

from robolink import *     # 与 RoboDK 通信的 API

from RoboDK import *       # 基本矩阵运算

 

def XYZWPR_2_Pose(xyzwpr):

    return KUKA_2_Pose(xyzwpr) # 将 X、Y、Z、A、B、C 转换为位姿

   

def Pose_2_XYZWPR(pose):

    return Pose_2_KUKA(pose) # 将位姿转换为 X、Y、Z、A、B、C

 

# 启动 RoboDK API 并获取机器人:

RDK= Robolink()

机器人= RDK.Item('', ITEM_TYPE_ROBOT)

if not robot.Valid():

    raise Exception("机器人不可用")

 

pose_tcp= XYZWPR_2_Pose([0, 0, 200, 0, 0, 0]) # 定义 TCP

 

pose_ref= XYZWPR_2_Pose([400, 0, 0, 0, 0, 0]) # 定义基准坐标系

 

# 更新机器人 TCP 和参考坐标系

robot.setTool(pose_tcp)

robot.setFrame(pose_ref)

 

# 对 SolveFK 和 SolveIK(正向/逆向运动学)非常重要

robot.setAccuracyActive(False) # 精度可开可关

 

# 在关节空间中定义一个名义目标:

关节= [0, 0, 90, 0, 90, 0]

 

# 计算关节目标的机器人标称位置:

pose_rob= robot.SolveFK(joints) # 相对于机器人基座的机器人凸缘

 

# 计算 pose_target:相对于参考坐标系的 TCP

pose_target= invH(pose_ref)*pose_rob*pose_tcp

 

print('Target not filtered:')

print(Pose_2_XYZWPR(pose_target))

 

joints_approx= joints # joints_approx 必须在 20 度以内

pose_target_filt, real_joints= robot.FilterTarget(pose_target, joints)

print('Target filtered:')

print(real_joints.tolist())

print(Pose_2_XYZWPR(pose_target_filt))