Postprozessoren für Roboter 3D Druck

Dieser Abschnitt beschreibt, wie ein Roboter Postprozessorbearbeitet werden muss, um die Zufuhr des Extruders, vor der jeweiligen Bewegung, zu berechnen. Alternativ können diese Berechnungen auch auf dem Roboter Controller gemacht werden.

Der erste Schritt besteht darin, die Extruder-Aufrufe abzufangen und die neuen Extruder-Werte (E-Werte) aus dem RunCode-Abschnitt im Postprozessor zu lesen:

    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)

                # 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)

Der Extruder-Wert wird als NEW_E_LENGTH-Variable gespeichert. Anschließend muss man ein neues Verfahren definieren, das Extruder-Vorschubbefehle entsprechend dem Abstand zwischen den Bewegungen, der Robotergeschwindigkeit und der Roboterbeschleunigung erzeugt. Dies setzt voraus, dass die Extruderzufuhr durch eine spezifische analoge Ausgabe von der Robotersteuerung (in diesem Beispiel den analogen Ausgang Nummer 5) angetrieben wird

    def new_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)

Schließlich müssen wir den Befehl new_move mit jeder neuen Bewegungsinstruktion ausführen. Wir können diesen Aufruf am Anfang des MoveL-Befehls hinzufügen:

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

        """Add a linear movement"""

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