本节将展示如何对现有后处理器进行微调。大多数后处理器都包含若干可轻松修改的变量,通过这些变量可更改或启用特定厂商的机器人编程功能。
举例来说,现有的库卡(KUKA)和 ABB 后处理器将做如下改动:
●为每个仿真程序分别生成文件,并且强制每个文件不超过3000行指令。较大的程序将被分割为多个子程序并依次被调用。
●设置一个关节运动,使用角度信息生成运动指令。
●将速度最大值限制为500 mm/s。即使机器人仿真程序中的速度设置超过这个值,也会被后置处理器限制在500 mm/s之内。
下文将介绍如何在文本编辑器上进行更改。
本示例将展示如何修改库卡(KUKA)KRC4后置处理器的默认设置,实现在同一文件中生成主程序及其子程序。
确保已启用后处理器编辑器插件,并按照以下步骤对后处理器进行修改:
1.菜单栏选择:程序➔ Post Processor Editor
2.选择要自定义的后处理器:KUKA KRC4
3.选择 "确定"。这时会打开一个新窗口,你会看到可以修改的变量,如下图所示
4.将 " INCLUDE SUB PROGRAMS "变量设置为 "True"
5.选择将后处理器另存为Save Post Processor as...
6.输入新名称保存(默认名称使用修改日期)。

现在,你会在RoboDK的Posts文件夹中找到一个新的后置处理器。接下来,你可以按照以下步骤更新项目以使用这个新的后置处理器
1.右键点击机器人。
2.选择"选择后处理程序"。
3.选择你创建的新后处理器。
4.再次生成程序,查看结果。
你也可以使用文本编辑器进行这些更改。按照以下步骤修改后处理器的默认Python代码:
1.菜单栏选择:程序➔ 添加/编辑后处理程序
2.选择你的后处理器。例如,对于库卡(KUKA)KRC4,请选择KUKA_KRC4。
3.选择 "确定"。后处理器将显示在文本编辑器中。
4.将变量MAX_LINES_X_PROG 设置为 3000。
5.将变量INCLUDE_SUB_PROGRAMS 设为True。

本示例将向你展示在使用 RoboDK 生成程序时,如何将速度限制为 500 mm/s,避免在RoboDK中仿真时设置的速度值过大。
在本示例中,我们假设使用的是库卡(KUKA)KRC2 或 KRC4 控制器:
1.选择程序➔ 添加/编辑后处理程序
2.选择你的后处理器。例如,对于库卡(KUKA)KRC4,请选择KUKA_KRC4。
3.选择 "确定"。后处理器将显示在文本编辑器中。
4.查找setSpeed 函数定义(def setSpeed)
5.添加以下插件,使最高速度达到 500 mm/s。这一行需要在生成 $VEL.CP 输出之前添加,输出将以 m/s 为单位改变速度:
speed_mms = min(speed_mms, 500)

Note:如果没有后处理器的源代码,你仍可添加自定义函数来覆盖默认行为。
本节介绍如何为现有后处理器自定义设置参考坐标系。例如,为KUKA机器人设置自定义参考坐标系。
你可以使用已编译的后置处理器,并仅重新实现必要的功能数(例如setFrame setTool 或 setSpeed)。
Note:请确保你的自定义后处理器名称与引用的原始后处理器名称不同。当你更新RoboDK时,安装程序会将默认后处理器覆盖回原始版本,但不会删除或修改Posts文件夹中的自定义后处理器。
在本示例中,我们假设需要自定义库卡(KUKA)控制器的基座定义方式。例如,当设置参考坐标系时,若需输出以下指令:
base_data[8] = {frame:x:2000, y:0, z:0, a:0, b:0, c:0}
BAS (#BASE,8)
你只需在C:/RoboDK/Posts/文件夹中创建一个名为KUKA_Custom_Post.py的新文件,并写入以下代码行,该文件将使用默认的KUKA_KRC2后处理器并覆盖设置参考坐标系(setFrame函数)的功能::
from KUKA_KRC2 import RobotPost as MainPost
class RobotPost(MainPost):
def setFrame(self, pose, frame_id, frame_name):
"""Change the robot reference frame"""
self.addline('; BASE_DATA[8] = {FRAME: %s}' % (self.pose_2_str(pose)))
self.addline('BAS (#BASE,8)')
不过,我们可以根据特定条件添加自定义过滤器,从而在使用默认行为和自定义实现之间进行筛选。后处理器文件可按如下方式修改:
from KUKA_KRC2 import RobotPost as MainPost
class RobotPost(MainPost):
def setFrame(self, pose, frame_id, frame_name):
"""Change the robot reference frame"""
if frame_name == "Frame 4": # Enter any condition here
# Trigger the call to the default method (same as not overriding the function)
super(MainPost, self).setFrame(pose, frame_id, frame_name)
return
# Implement a custom setFrame
self.addline('; ---- Setting reference: %s ----' % frame_name)
self.addline('; BASE_DATA[8] = {FRAME: %s}' % (self.pose_2_str(pose)))
self.addline('BAS (#BASE,8)')
self.addline('; --------------------------')
为库卡(KUKA)控制器生成程序时,可通过多种方式设置坐标系或参考框架。以下setFrame定义展示了一种具有不同选项的替代实现方案:
def setFrame(self, pose, frame_id, frame_name):
"""Change the robot reference frame"""
self.addline('; ---- Setting reference: %s ----' % frame_name)
# option 1: Build the kinematics based on the MACHINE_DEF array and the provided offset
#self.addline('$BASE = EK (MACHINE_DEF[2].ROOT, MACHINE_DEF[2].MECH_TYPE, { %s })' % self.pose_2_str(pose))
# option 2: Build the kinematics based on the EX_AX_DATA array and the provided offset
#self.addline('$BASE=EK(EX_AX_DATA[1].ROOT,EX_AX_DATA[1].EX_KIN, { %s })' % self.pose_2_str(pose))
# Option 3: Build the kinematics based on the EX_AX_DATA array and the pre-defined offset
#self.addline('; Using external axes')
#self.addline('; $BASE=EK(EX_AX_DATA[1].ROOT,EX_AX_DATA[1].EX_KIN,EX_AX_DATA[1].OFFSET)')
#self.addline('; $ACT_EX_AX= %i' % (self.nAxes - 6))
# Option 4: Use the BAS(#ex_BASE) init function from the BAS.src file
#self.addline('; BASE_DATA[%i] = {FRAME: %s}' % (self.BASE_ID, self.pose_2_str(pose)))
#self.addline('BAS(#ex_BASE,%i)' % self.BASE_ID)
# Option 5: Use the BAS(#BASE) init function from the BAS.src file
self.addline('; BASE_DATA[%i] = {FRAME: %s}' % (self.BASE_ID, self.pose_2_str(pose)))
self.addline('BAS (#BASE,%i)' % self.BASE_ID)
# Option 6: Directly take the base from the BASE_DATA array (usually what the BAS(#BASE) does)
# self.addline('$BASE=BASE_DATA[%i]' % self.BASE_ID)
self.addline('; --------------------------')
本节将介绍如何修改现有后处理器,以通过关节值而非笛卡尔值强制实现轴向运动。
在本示例中,我们将此变更应用于ABB IRC5机器人控制器。
1.找到机器人控制器的使用手册。在本范例中我们使用的是ABB IRC5 RAPID编程手册。
2.找到关节运动的指令。本范例中ABB的关节运动绝对值指令为MoveAbsJ。该指令使用jointtarget变量来定义关节轴数值。

1.选择程序➔ 添加/编辑后处理程序,选择当前的后处理器并修改它。如果你当前使用的是自定义的后处理器,它会被(在默认状态下)选中。
2.在后处理器中找到MoveJ函数。该函数定义了后处理器如何生成机器人关节运动的指令。另外, RoboDK使用MoveL定义线性运动。使用Python编程语言,修改给机器人程序添加轴角度信息的那行指令,如下图所示。

1.最后,修改后处理器将关节轴角度值或者姿态值转化为字符串的方式。函数angles_2_str与pose_2_str分别负责将关节轴角度值与姿态值转化为文本文字。

大部分RoboDK后处理器都使用关节轴角度值设置关节运动,以及笛卡尔坐标值设置线性运动。我们建议总是将一系列线性运动的起点(第一段运动)设置为关节运动(用角度值定义)。这样可以避免运动开始前错误的机器人位姿导致机器人进入奇异状态,或者达到轴极限。
Note:不同的机器人生产商可能使用同一种欧拉角公式。例如,发那科(Fanuc)和安川(Motoman)都使用相同的 X Yàà Z 符号,史陶比尔(Stäubli)和Mecademic使用相同的 X➔ Y'➔ Z'' 符号,等等。
Important:如果用户使用一个姿态来定义运动(例如,使用笛卡尔线性坐标与欧拉角或者四元数作为旋转信息),机器人实际所达到的位姿将由当前机器人工具以及参考坐标系所决定。机器人工具与参考坐标系的姿态必须在仿真程序中准确地定义。这可以通过setTool与setFrame函数来实现。