Custom filter for frames

This section shows how you can customize setting the reference frame of an existing post processor. For example, setting a custom reference frame for a KUKA robot.

You can use compiled post processors and easily reimplement only necessary functions (for example, setFrame setTool or setSpeed).

In this example, we assume that we want to customize how the base is defined for a KUKA controller. For example, if you want to output the following line when setting the reference frame:

BASE_DATA[8] = {FRAME: X:2000, Y:0, Z:0, A:0, B:0, C:0}

BAS (#BASE,8)

You simply need to create a new file called KUKA_Custom_Post.py in the C:/RoboDK/Posts/ folder with this the following few lines, which uses the default KUKA_KRC2 post processor and overrides setting the reference frame (setFrame function):

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

However, we could add custom filters based on certain criteria to filter between using the default behavior and using a custom implementation. The post processor file could then be modified as follows:

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('; --------------------------')

When you generate programs for KUKA KRC controllers, there are many ways you can set your coordinate system or reference frame. The following definition of setFrame shows an alternative implementation with different options:

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('; --------------------------')