校准机器人后,您有两种选择,可使用校准后机器人的绝对精度生成程序:
●过滤现有程序:修改程序内的所有机器人目标,以提高机器人的精度。可以手动完成,也可以使用 API。
●使用 RoboDK for Offline Programming 生成准确的程序(生成的程序已被过滤,包括使用 API 生成的程序)。
要手动过滤现有程序:将机器人程序文件拖放到 RoboDK 的主屏幕上(或选择文件➔ 打开),然后选择仅过滤。程序将被过滤并保存在同一文件夹中。过滤摘要将提及过滤算法是否存在问题。如果您想在 RoboDK 中模拟程序,也可以选择导入程序。如果程序有任何依赖关系(工具坐标系或基本坐标系定义、子程序......),它们必须位于导入第一个程序的同一目录中。
将程序导入RoboDK后,您可以使用或不使用绝对精度重新生成程序。在RoboDK的主精度设置中(工具➔ 选项➔ 精度),您可以决定是否始终使用精确运动学生成程序,是否每次都询问,或者是否使用当前的机器人运动学。右击机器人,激活/禁用 "使用精确运动学 "标签,即可更改当前机器人运动学。如果激活,则会看到一个绿点;如果未激活,则会看到一个红点。
在已校准机器人和机器人程序的情况下,使用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()
以下代码是一个 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))