Robot 3D Printing Project

3D打印或增材制造是一个以数字模型文件为基础,构造三维立体物体的技术。配合使用RoboDK,您的工业机器人手臂即可成为三轴或五轴的3D打印机。下面的视频展示了如何使用RoboDK离线设置3D打印:观看视频 watch video

使用机器人进行3D打印的其中一种方法:

   通过RoboDK直接将G-code程序(NC文件)转换为机器人程序,相关内容如机器人加工项目Robot Machining project 所示。物料流动速率(挤出机指令E)会适当地考虑每个运动,然后它会作为一个“程序事件Program Event”集合生成到程序中。G-codeRoboDK支持的一种NC文件,也是许多3D打印机支持的文件格式。大多数切片器软件都可以由给定STL文件生成G-code

注意:切片器会依据3D模型,为加工(G-code)创建指令。该指令会定义挤出机刀具轨迹的流量。您需要结合RoboDK与切片器软件,即可正确地使用机器人完成3D打印。

提示:RoboDK中右键单击一个对象,即可将其保存为STL格式。

   选择“实用程序Utilities 3D打印项目3D Print Project”,即可打开3D打印设置。这个设置和机器人加工项目 Robot Machining Project 相同。唯一不同点是这里的“导入路径Path input”下的选项被预设为“3D打印对象3D print object”。单击“3D打印选项3D printing options”即可打开Slic3r软件。

Robot Machining - 图片 31

重要提示:当您选择“3D打印对象3D print object”选项时,将会默认使用 Slic3r 切片器将对象转换为刀具轨迹。您也可以使用其他切片器生成G-code程序并转换为机器人程序,相关内容如机器人加工项目 Robot Machining project 所示。

Robot Machining - 图片 32

默认情况下,RoboDK会将指令E的程序调用转换到一个名为“挤压机Extruder的程序下,并且将E值作为参数传递。选择“程序事件Program Events即可更改此行为。

Robot Machining - 图片 33

挤出机的值(E)表示每次移动前需要挤出的物料值。通过这个值,可以分析出机器人的速度和点与点之间的距离,然后驱动机器人挤出机的进给。

您也可以使用后置处理器计算挤出机进给,并且将依次得到相应的匹配代码。下一个小节提供了一个相关示例。

注意:一些机器人控制器可以同步挤出机的自动进给和刀具的运动。

Post Processor for robot 3D printing

本节将展示在执行每一个动作之前如何修改机器人后置处理器 post processor 来计算挤出机进给。此外,您也可以在机器人控制器上进行计算。

第一步是拦截挤出机调用,并从后置处理器的RunCode部分读取新的挤出机值(E值):

defRunCode(self, code, is_function_call = False):

    if is_function_call:

        if code.startswith("Extruder("):

            # Intercept the extruder command.

            # if the program call is Extruder(123.56)

            # we extract the number as a string

            # and convert it to a number

            self.NEW_E_LENGTH = float(code[9:-1])

            # Skip the program call generation

            return

        else:

            self.addline(code + "()")

    else:

        # Output program code

        self.addline(code)

挤出机的值被保存为NEW_E_LENGTH变量。然后,我们需要根据移动距离、机器人速度和机器人加速度定义一个新步骤,从而生成合适的挤出机进给命令。这个步骤假设挤出机进给是由机器人控制器中特定的模拟输出驱动的(本例中的模拟输出数字5)。

defnew_move(self, pose1, pose2):

    if pose1 isNone:

        return

       

    def Calculate_Time(Dist, Vmax, Amax):

        '''Calculate the time to move Dist with Amax acceleration and Vmax speed'''

        tacc = Vmax/Amax;

        Xacc = 0.5*Amax*tacc*tacc;

        if Dist <=2*Xacc:

            # Vmax is not reached

            tacc = sqrt(Dist/Amax)

            Ttot = tacc*2

        else:

            # Vmax is reached

            Xvmax = Dist -2*Xacc

            Tvmax = Xvmax/Vmax

            Ttot = 2*tacc + Tvmax

        return Ttot

       

    add_material = self.NEW_E_LENGTH - self.LAST_E_LENGTH

    self.LAST_E_LENGTH = self.NEW_E_LENGTH

   

    if add_material >0:

        distance_mm = norm(subs3(pose1.Pos(), pose2.Pos()))

        # calculate movement time in seconds

        time_s = Calculate_Time(distance_mm, self.SPEED_MMS, self.ACCEL_MMSS)

        # add material

        self.setDO(5, (add_material/time_s))

    else:

        # DO not add material

        self.setDO(5,0)

重要提示:使用舍入值 rounding value 有助于保持恒定速度并且最小化加速度行为。这种情况下,时间可以计算为距离/速度。

最后,需要对新的运动指定触发new_move命令。我们可以在MoveL命令开始的时候加入这个调用。

defMoveL(self, pose, joints, conf_RLF=None):

    """Add a linear movement"""

    self.new_move(self.LAST_POSE, pose) # used for 3D printing