本节介绍如何修改机器人后处理器,以便在执行 3D 打印的运动指令前计算挤出机速度。另外,也可以在机器人控制器上通过挤出机程序调用(驱动挤出机的默认指令)进行这些操作。
通过定制机器人后处理器,可以在将程序发送给机器人之前,更轻松地集成用于 3D 打印的挤出机。为了完成这样的任务,我们需要进行一些计算,并在机器人后处理器中生成程序时输出定制代码。
注:某些后处理器,如 ABB RAPID IRC5、库卡(Kuka)KRC2 和柯马(Comau)后处理器默认执行这些建议的修改。
第一步是拦截挤出机调用,并在后处理器的 RunCode 部分内读取新的挤出机值(E 值)。下面的部分将处理为程序生成的所有程序调用:
def RunCode(self, code, is_function_call= False):
if is_function_call:
if code.startswith("Extruder("):
# 拦截挤压机指令。
# 如果程序调用的是 Extruder(123.56)
# 我们将数字提取为字符串
# 并将其转换为数字
self.PRINT_E_NEW= float(code[9:-1])
# 跳过程序调用生成
返回
否则
self.addline(code + "()")
否则
# 输出程序代码
self.addline(code)
挤出机值(length/E)在机器人后处理器中保存为 PRINT_E_NEW 变量。
我们需要在每一条新的线性移动指令中触发名为new_move 的函数调用。我们可以在MoveL 指令的开头添加这一调用插件:
def MoveL(self, pose, joints, conf_RLF= None):
"""添加一个线性移动""
# 处理 3D 打印挤出机集成
self.new_move(pose)
...
我们还必须在后处理器的头部添加以下变量,以计算挤出机增量:
# 3D 打印挤出机设置参数:
PRINT_E_AO= 5 # 模拟输出 ID,用于指挥挤出机流量
PRINT_SPEED_2_SIGNAL= 0.10 # 将速度/流量转换为模拟输出信号的比率
PRINT_FLOW_MAX_SIGNAL= 24 # 向挤出机提供的最大信号
PRINT_ACCEL_MMSS= -1 # 加速度,如果使用四舍五入/混合法,-1 假设为恒速
# 内部 3D 打印参数
PRINT_POSE_LAST= 无 # 最后打印的位姿
PRINT_E_LAST= 0 # 最后挤出机长度
PRINT_E_NEW= 无 # 新挤出机长度
PRINT_LAST_SIGNAL= 无 # 最后一个挤出机信号
最后,我们需要定义一个新的程序,该程序将根据运动间距、机器人速度和机器人加速度生成适当的挤出机进给指令。这需要假设挤出机进给是由特定的模拟输出或自定义程序调用驱动的。
我们需要在 def MoveL 程序定义前添加以下代码。
重要提示: 在 RoboDK 中对机器人进行程序设计时,使用四舍五入值将有助于保持速度恒定,并尽量减少加速度的行为。在这种情况下,时间可按距离/速度计算。
def calculate_time(self, distance, Vmax, Amax=-1):
""计算以最大加速度和最大速度移动一段距离所需的时间""
如果 Amax< 0:
# 假设速度恒定(必须设置适当的平滑/圆整参数)
Ttot= 距离/最大值
否则
# 假设我们加速和减速
tacc= Vmax/Amax;
Xacc= 0.5*Amax*tacc*tacc;
如果距离<= 2*Xacc:
# 未达到最大值
tacc= sqrt(距离/最大值)
Ttot= tacc*2
否则
# 达到最大值
Xvmax= 距离 - 2*Xacc
Tvmax= Xvmax/Vmax
Ttot= 2*tacc+ Tvmax
返回 Ttot
def new_move(self, new_pose):
""在挤出机上执行 3D 打印操作(如适用)""
如果 self.PRINT_E_NEW 为 None 或 new_pose 为 None:
返回
# 跳过第一个动作,记住位姿
如果 self.PRINT_POSE_LAST 为 None:
self.PRINT_POSE_LAST= new_pose
返回
# 计算下一次移动的材料增加量
add_material= self.PRINT_E_NEW - self.PRINT_E_LAST
self.PRINT_E_LAST= self.PRINT_E_NEW
# 计算机器人速度和挤出机信号
挤出机信号= 0
如果 add_material> 0:
distance_mm= norm(subs3(self.PRINT_POSE_LAST.Pos(), new_pose.Pos()))
# 以秒为单位计算移动时间
time_s= self.calculate_time(distance_mm, self.SPEED_MMS, self.PRINT_ACCEL_MMSS)
# 避免除以 0
如果 time_s> 0:
# 这看起来是多余的,但它可以让你考虑加速度,我们可以对速度进行小幅调整
speed_mms= distance_mm / time_s
# 计算挤出机速度,单位为 RPM*Ratio (PRINT_SPEED_2_SIGNAL)
挤出机信号= speed_mms * self.PRINT_SPEED_2_SIGNAL
# 确保信号在可接受的值范围内
extruder_signal= max(0,min(self.PRINT_FLOW_MAX_SIGNAL, extruder_signal))
# 必要时更新挤出机速度
如果 self.PRINT_LAST_SIGNAL 为 None 或 abs(extruder_signal - self.PRINT_LAST_SIGNAL)> 1e-6:
self.PRINT_LAST_SIGNAL= extruder_signal
# 使用内置 setDO 功能设置模拟输出
self.setDO(self.PRINT_E_AO, "%.3f" % extruder_signal)
# 或者,调用程序并处理与机器人控制器的集成
#self.addline('ExtruderSpeed(%.3f)' % extruder_signal)
# 记住最后一个位姿
self.PRINT_POSE_LAST= new_pose