Post-Procesador para impresión 3D robótica

Esta sección muestra cómo modificar un  post-procesadorrobótico para calcular la alimentación de la extrusora antes ejecutar cada movimiento. Alternativamente, estos cálculos se pueden hacer en el controlador del robot.

El primer paso es interceptar las llamadas de la Extrusora y leer los nuevos valores de Extrusora (valores E) desde la sección RunCode en el postprocesador:

    def RunCode(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)

                # extraemos el número como una cadena

                # y convertirlo a un número

                Self.PRINT_E_NEW = float(code[9:-1])

                # Skip the program call generation

                return

            else:

                self.addline(code + "()")

        else:

            # Output program code

            self.addline(code)

El valor de la Extrusora (longitud) se guarda como ela variable PRINT_E_NEW. Entonces, necesitamos definir un nuevo procedimiento que genere comandos de alimentación de extrusoras según la Distancia entre movimientos, la velocidad del robot y la aceleración del robot. Este asume que la alimentación de la extrusora es conducida por una salida analógica específica desde el controlador del robot (salida analógica número 5 en este ejemplo).

    def new_move(self, pose2):

        '''Output the Extruder signal to have a constant flow

        Dada la cantidad de material que necesita ser extruido,

        la distancia entre los 2 puntos y la velocidad del robot ' ' ' '

        if self.PRINT_POSE_LAST is None:

            self.PRINT_POSE_LAST = pose2

            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.PRINT_E_NEW - self.PRINT_E_LAST

        self.PRINT_E_LAST = self.PRINT_E_NEW

           

        if add_material > 0:

            distance_mm = norm(subs3(self.PRINT_POSE_LAST.Pos(), pose2.Pos()))

            # calculate movement time in seconds

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

            # add material

            Señal = Min(Automático.PRINT_FLOW_MAX_SIGNAL , Automático.PRINT_FLOW_2_SIGNAL * add_material/time_s)

            self.setDO(self.PRINT_E_AO,"%.3f" %(signal))

        else:

            # DO not add material

            self.setDO(self.PRINT_E_AO,"0")

       

        # Remember the last position

        self.PRINT_POSE_LAST = pose2

Debemos añadir las siguientes variables en la cabecera del postprocesador para que el código anterior funcione:

# Clase de objeto que maneja las instrucciones/Syntax del robot

Clase RobotPost(Objeto):

    """Robot post object"""

   

    ...

   

    # 3D Printing Extruder Setup Parameters:

    PRINT_E_AO = 5 # Analog ID de salida para ordenar el flujo de extrusora

    PRINT_FLOW_2_SIGNAL = 0,05 # Ratio para convertir el flujo a una señal analógica

    PRINT_FLOW_MAX_SIGNAL = 24 # Señal máxima para proporcionar a la extrusora

    PRINT_ACCEL_MMSS = 1E9 # Acceleration (asuma la velocidad constante si utilizamos el redondeo/la mezcla)   

   

    # Internal 3D Printing Parameters

    PRINT_POSE_LAST = Ninguno # Última pose impresa

    PRINT_E_LAST = 0 # Última longitud del estirador

    PRINT_E_NEW = 0 # Nueva longitud del estirador

   

    ...

   

Finalmente, también necesitamos disparar el comando new_move con cada nueva instrucción de movimiento. Podemos añadir esta llamada en el principio del comando MoveL:

    def MoveL(self, pose, joints, conf_RLF=None):

        """Add a linear movement"""

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