#版权2017-机器人DK软件S.L网站s/m.sinclairbody.com/#Apache牌照2.0版#你可能不使用此文件,除非符合许可i/licenses/LICENSE-2.0##见许可特定语言约束权限和#限制2022世界杯8强赛时间#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------本文件---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#你可以使用文本编辑器或Python编辑器编辑此文件ython编辑器允许快速评价文件尾端样本程序2022世界杯8强赛时间# Python should be automatically installed with RoboDK # # You can also edit the POST PROCESSOR manually: # 1- Open the *.py file with Python IDLE (right click -> Edit with IDLE) # 2- Make the necessary changes # 3- Run the file to open Python Shell: Run -> Run module (F5 by default) # 4- The "test_post()" function is called automatically # Alternatively, you can edit this file using a text editor and run it with Python # # To use a POST PROCESSOR file you must place the *.py file in "C:/RoboDK/Posts/" # To select one POST PROCESSOR for your robot in RoboDK you must follow these steps: # 1- Open the robot panel (double click a robot) # 2- Select "Parameters" # 3- Select "Unlock advanced options" # 4- Select your post as the file name in the "Robot brand" box # # To delete an existing POST PROCESSOR script, simply delete this file (.py file) # # ---------------------------------------------------- # More information about RoboDK Post Processors and Offline Programming here: # //m.sinclairbody.com/help#PostProcessor # //m.sinclairbody.com/doc/en/PythonAPI/postprocessor.html # ---------------------------------------------------- # ---------------------------------------------------- # Import RoboDK tools from robodk import * HEADER = ''';FOLD INI BAS (#INITMOV,0 ) ;ENDFOLD (INI) ;FOLD STARTPOS $BWDSTART = FALSE PDAT_ACT = {VEL 50,ACC 100,APO_DIST 10} BAS(#PTP_DAT) FDAT_ACT = {TOOL_NO 0,BASE_NO 0,IPO_FRAME #BASE} BAS (#FRAMES) BAS (#VEL_PTP,50) ;ENDFOLD ;FOLD SET DEFAULT SPEED $VEL.CP=0.2 BAS(#VEL_PTP,50) BAS(#TOOL,0) BAS(#BASE,0) ;ENDFOLD ;FOLD PTP FIRST POSITION $BWDSTART = FALSE PDAT_ACT = {VEL 50,ACC 100,APO_DIST 10} FDAT_ACT = {TOOL_NO 0,BASE_NO 0,IPO_FRAME #BASE} BAS(#FRAMES) $ADVANCE = 5 ;ENDFOLD PTP $AXIS_ACT !skip BCO quickly ''' # ---------------------------------------------------- def pose_2_str(pose): """Converts a pose target to a string""" # [x,y,z,w,p,r] = Pose_2_KUKA(pose) # return ('X %.3f, Y %.3f, Z %.3f, A %.3f, B %.3f, C %.3f' % (x,y,z,r,p,w)) # old version had to be switched [x, y, z, r, p, w] = pose_2_xyzrpw(pose) return ('X %.3f,Y %.3f,Z %.3f,A %.3f,B %.3f,C %.3f' % (x, y, z, w, p, r)) def pose_2_str_ext(pose, joints): njoints = len(joints) if njoints <= 6: return pose_2_str(pose) else: extaxes = '' for i in range(njoints - 6): extaxes = extaxes + (',E%i %.5f' % (i + 1, joints[i + 6])) return pose_2_str(pose) + extaxes def angles_2_str(angles): """Prints a joint target""" str = '' data = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6'] for i in range(len(angles)): str = str + ('%s %.5f,' % (data[i], angles[i])) str = str[:-1] return str def conf_2_str(confRLF): if confRLF is None: return "'B010'" strconf = "" if confRLF[2] > 0: strconf = strconf + '1' else: strconf = strconf + '0' if confRLF[1] == 0: strconf = strconf + '1' else: strconf = strconf + '0' if confRLF[0] > 0: strconf = strconf + '1' else: strconf = strconf + '0' return "'B%s'" % strconf def joints_2_turn_str(joints): if joints is None: return "'B000000'" strturn = "" for i in range(len(joints)): if joints[i] < 0: strturn = '1' + strturn else: strturn = '0' + strturn return "'B%s'" % strturn # ---------------------------------------------------- # Object class that handles the robot instructions/syntax class RobotPost(object): """Robot post object""" PROG_EXT = 'src' # set the program extension # other variables ROBOT_POST = '' ROBOT_NAME = '' PROG_FILES = [] PROG = '' LOG = '' nAxes = 6 APO_VALUE = 1 C_DIS = ' C_DIS' C_PTP = ' C_PTP' def __init__(self, robotpost=None, robotname=None, robot_axes=6, **kwargs): self.ROBOT_POST = robotpost self.ROBOT_NAME = robotname self.PROG = '' self.LOG = '' self.nAxes = robot_axes def ProgStart(self, progname): self.addline('DEF %s ( )' % progname) self.PROG = self.PROG + HEADER # if self.nAxes > 6: # self.addline('$ACT_EX_AX = %i' % (self.nAxes-6)) def ProgFinish(self, progname): self.addline('END') def ProgSave(self, folder, progname, ask_user=False, show_result=False): progname = progname + '.' + self.PROG_EXT if ask_user or not DirExists(folder): filesave = getSaveFile(folder, progname, 'Save program as...') if filesave is not None: filesave = filesave.name else: return else: filesave = folder + '/' + progname fid = open(filesave, "w") fid.write(self.PROG) fid.close() print('SAVED: %s\n' % filesave) # tell RoboDK the path of the saved file self.PROG_FILES = filesave # open file with default application if show_result: if type(show_result) is str: # Open file with provided application import subprocess p = subprocess.Popen([show_result, filesave]) elif type(show_result) is list: import subprocess p = subprocess.Popen(show_result + [filesave]) else: # open file with default application import os os.startfile(filesave) if len(self.LOG) > 0: mbox('Program generation LOG:\n\n' + self.LOG) def ProgSendRobot(self, robot_ip, remote_path, ftp_user, ftp_pass): """Send a program to the robot using the provided parameters.方法在ProgSave后立即执行,如果我们选择选项“发送程序转机器人”。The connection parameters must be provided in the robot connection menu of RoboDK""" UploadFTP(self.PROG_FILES, robot_ip, remote_path, ftp_user, ftp_pass) def MoveJ(self, pose, joints, conf_RLF=None): """Add a joint movement""" self.addline('PTP {' + angles_2_str(joints) + '}' + self.C_PTP) def MoveL(self, pose, joints, conf_RLF=None): """Add a linear movement""" # self.addline('LIN {' + pose_2_str_ext(pose,joints) + '}' + self.C_DIS) self.addline('LIN {%s, S %s, T %s}%s' % ( pose_2_str_ext(pose, joints), conf_2_str(conf_RLF), joints_2_turn_str(joints), self.C_DIS)) # !PTP {POS:X 2318.172,Y -484.024,Z 1193.129,A 146.186,B -5.002,C 152.404,S 'B010',T 'B101010'} def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None): """Add a circular movement""" # self.addline('CIRC {' + pose_2_str_ext(pose1,joints1) + '},{' + pose_2_str_ext(pose2,joints2) + '}' + self.C_DIS) self.addline('CIRC {%s},{%s, S %s, T %s}%s' % ( pose_2_str_ext(pose1, joints1), pose_2_str_ext(pose2, joints2), conf_2_str(conf_RLF_2), joints_2_turn_str(joints2), self.C_DIS)) def setFrame(self, pose, frame_id=None, frame_name=None): """Change the robot reference frame""" self.addline('$BASE = {FRAME: ' + pose_2_str(pose) + '}') def setTool(self, pose, tool_id=None, tool_name=None): """Change the robot TCP""" self.addline('$TOOL = {FRAME: ' + pose_2_str(pose) + '}') def Pause(self, time_ms): """Pause the robot program""" if time_ms <= 0: self.addline('HALT') else: self.addline('WAIT SEC %.3f' % (time_ms * 0.001)) def setSpeed(self, speed_mms): """Changes the robot speed (in mm/s)""" self.addline('$VEL.CP = %.5f' % (speed_mms / 1000.0)) def setAcceleration(self, accel_mmss): """Changes the current robot acceleration""" self.addlog('setAcceleration not defined') def setSpeedJoints(self, speed_degs): """Changes the robot joint speed (in deg/s)""" self.addlog('setSpeedJoints not defined') def setAccelerationJoints(self, accel_degss): """Changes the robot joint acceleration (in deg/s2)""" self.addlog('setAccelerationJoints not defined') def setZoneData(self, zone_mm): """Changes the zone data approach (makes the movement more smooth)""" self.APO_VALUE = zone_mm if zone_mm >= 0: self.addline('$APO.CPTP = %.3f' % zone_mm) self.addline('$APO.CDIS = %.3f' % zone_mm) C_DIS = ' C_DIS' C_PTP = ' C_PTP' else: C_DIS = '' C_PTP = '' def setDO(self, io_var, io_value): """Sets a variable (output) to a given value""" if type(io_var) != str: # set default variable name if io_var is a number io_var = '$OUT[%s]' % str(io_var) if type(io_value) != str: # set default variable value if io_value is a number if io_value > 0: io_value = 'TRUE' else: io_value = 'FALSE' # at this point, io_var and io_value must be string values self.addline('%s=%s' % (io_var, io_value)) def waitDI(self, io_var, io_value, timeout_ms=-1): """Waits for an input io_var to attain a given value io_value.Optionally, a timeout can be provided.""" if type(io_var) != str: # set default variable name if io_var is a number io_var = '$IN[%s]' % str(io_var) if type(io_value) != str: # set default variable value if io_value is a number if io_value > 0: io_value = 'TRUE' else: io_value = 'FALSE' # at this point, io_var and io_value must be string values if timeout_ms < 0: self.addline('WAIT FOR (%s==%s)' % (io_var, io_value)) else: self.addline('START_TIMER:') self.addline('$TIMER_STOP[1]=TRUE') self.addline('$TIMER_FLAG[1]=FALSE') self.addline('$TIMER[1]=%.3f' % (float(timeout_ms) * 0.001)) self.addline('$TIMER_STOP[1]=FALSE') self.addline('WAIT FOR (%s==%s OR $TIMER_FLAG[1])' % (io_var, io_value)) self.addline('$TIMER_STOP[1]=TRUE') self.addline('IF $TIMER_FLAG[1]== TRUE THEN') self.addline(' HALT !Timed out!') self.addline(' GOTO START_TIMER') self.addline('ENDIF') def RunCode(self, code, is_function_call=False): """Adds code or a function call""" if is_function_call: code.replace(' ', '_') if not code.endswith(')'): code = code + '()' self.addline(code) else: self.addline(code) def RunMessage(self, message, iscomment=False): """Add a comment or a popup message""" if iscomment: self.addline('!' + message) else: self.addline('Wait for StrClear($LOOP_MSG[])') self.addline('$LOOP_CONT = TRUE') self.addline('$LOOP_MSG[] = "%s"' % message) # ------------------ private ---------------------- def addline(self, newline): """Add a program line""" self.PROG = self.PROG + newline + '\n' def addlog(self, newline): """Add a log message""" self.LOG = self.LOG + newline + '\n' # ------------------------------------------------- # ------------ For testing purposes --------------- def Pose(xyzrpw): [x, y, z, r, p, w] = xyzrpw a = r * math.pi / 180 b = p * math.pi / 180 c = w * math.pi / 180 ca = math.cos(a) sa = math.sin(a) cb = math.cos(b) sb = math.sin(b) cc = math.cos(c) sc = math.sin(c) return Mat([[cb * ca, ca * sc * sb - cc * sa, sc * sa + cc * ca * sb, x], [cb * sa, cc * ca + sc * sb * sa, cc * sb * sa - ca * sc, y], [-sb, cb * sc, cc * cb, z], [0, 0, 0, 1]]) def test_post(): """Test the post with a basic program""" robot = RobotPost('Kuka_custom', 'Generic Kuka') robot.ProgStart("Program") robot.RunMessage("Program generated by RoboDK", True) robot.setFrame(Pose([807.766544, -963.699898, 41.478944, 0, 0, 0])) robot.setTool(Pose([62.5, -108.253175, 100, -60, 90, 0])) robot.MoveJ(Pose([200, 200, 500, 180, 0, 180]), [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752]) robot.MoveL(Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418]) robot.MoveL(Pose([200, 200, 262.132034, 180, 0, -150]), [-43.73892, -3.91728, -35.77935, 58.57566, 54.11615, -253.81122]) robot.RunMessage("Setting air valve 1 on") robot.RunCode("TCP_On", True) robot.Pause(1000) robot.MoveL(Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418]) robot.MoveL(Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677]) robot.MoveL(Pose([250, 250, 191.421356, 180, 0, -150]), [-39.75778, -1.04537, -40.37883, 52.09118, 54.15317, -246.94403]) robot.RunMessage("Setting air valve off") robot.RunCode("TCP_Off", True) robot.Pause(1000) robot.MoveL(Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677]) robot.MoveL(Pose([250, 200, 278.023897, 180, 0, -150]), [-41.85389, -1.95619, -34.89154, 57.43912, 52.34162, -253.73403]) robot.MoveL(Pose([250, 150, 191.421356, 180, 0, -150]), [-43.82111, 3.29703, -40.29493, 56.02402, 56.61169, -249.23532]) robot.ProgFinish("Program") # robot.ProgSave(".","Program",True) print(robot.PROG) if len(robot.LOG) > 0: mbox('Program generation LOG:\n\n' + robot.LOG) input("Press Enter to close...") if __name__ == "__main__": """Function to call when the module is executed by itself: test""" test_post()