Siemens_840D_PKM.py
Go to the documentation of this file.
1 # Copyright 2017 - RoboDK Software S.L. - http://www.robodk.com/
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at
5 # http://www.apache.org/licenses/LICENSE-2.0
6 # Unless required by applicable law or agreed to in writing, software
7 # distributed under the License is distributed on an "AS IS" BASIS,
8 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9 # See the License for the specific language governing permissions and
10 # limitations under the License.
11 
12 # ----------------------------------------------------
13 # This file is a sample POST PROCESSOR script to generate robot programs for a
14 # Siemens controller (Siemens Sinumerik programming language)
15 #
16 # To edit/test this POST PROCESSOR script file:
17 # Select "Program"->"Add/Edit Post Processor", then select your post or create a new one.
18 # You can edit this file using any text editor or Python editor. Using a Python editor allows to quickly evaluate a sample program at the end of this file.
19 # Python should be automatically installed with RoboDK
20 #
21 # You can also edit the POST PROCESSOR manually:
22 # 1- Open the *.py file with Python IDLE (right click -> Edit with IDLE)
23 # 2- Make the necessary changes
24 # 3- Run the file to open Python Shell: Run -> Run module (F5 by default)
25 # 4- The "test_post()" function is called automatically
26 # Alternatively, you can edit this file using a text editor and run it with Python
27 #
28 # To use a POST PROCESSOR file you must place the *.py file in "C:/RoboDK/Posts/"
29 # To select one POST PROCESSOR for your robot in RoboDK you must follow these steps:
30 # 1- Open the robot panel (double click a robot)
31 # 2- Select "Parameters"
32 # 3- Select "Unlock advanced options"
33 # 4- Select your post as the file name in the "Robot brand" box
34 #
35 # To delete an existing POST PROCESSOR script, simply delete this file (.py file)
36 #
37 # ----------------------------------------------------
38 # More information about RoboDK Post Processors and Offline Programming here:
39 # http://www.robodk.com/help#PostProcessor
40 # http://www.robodk.com/doc/en/PythonAPI/postprocessor.html
41 # ----------------------------------------------------
42 
43 
44 # Customize the following parameters:
45 M_WAIT_DI = 'M66' # Provide the M code to wait for a digital input
46 M_SET_DO_HIGH = 'M62' # Provide the M code to set a digital output HIGH (1 or True)
47 M_SET_DO_LOW = 'M62' # Provide the M code to set a digital output LOW (0 or False)
48 
49 MM_2_UNITS = 1.0 # Use Millimeter units
50 #MM_2_UNITS = 1.0/25.4 # Use Inch units
51 
52 
53 # ----------------------------------------------------
54 # Import RoboDK tools
55 from robodk import *
56 
57 def conf_2_STAT(confRLF):
58  if confRLF is None:
59  return 2 #"'B010'"
60  config = 0
61  if confRLF[2] > 0:
62  config = config + 4
63 
64  if confRLF[1] == 0:
65  config = config + 2
66 
67  if confRLF[0] > 0:
68  config = config + 1
69 
70  return config
71 
72 def joints_2_TU(joints):
73  if joints is None:
74  return 0 # "'B000000'"
75 
76  turn = 0
77  njoints = len(joints)
78  for i in range(njoints):
79  if joints[i] < 0:
80  turn = turn + 2**(njoints-1-i)
81  return turn
82 
83 
84 # ----------------------------------------------------
85 # Object class that handles the robot instructions/syntax
86 class RobotPost(object):
87  """Robot post object"""
88  PROG_EXT = 'mpf' # set the program extension
89 
90  # other variables
91  ROBOT_POST = ''
92  ROBOT_NAME = ''
93  PROG_FILES = []
94 
95  PROG = ''
96  PROG_COUNT = 0
97  LOG = ''
98  nAxes = 6
99  nId = 0
100  REF_FRAME = eye(4)
101  INV_TOOL_FRAME = eye(4) # Force TC_DCP to 0 by post multiplying poses
102 
103  SPEED_UNITS_MIN = 5000 * MM_2_UNITS
104  SPEED_DEG_MIN = 2000
105  Nline = 0
106 
107  LAST_X = None
108  LAST_Y = None
109  LAST_Z = None
110  LAST_POSE = None
111  TRAORI = None
112 
113 
114  # ----------------------------------------------------
115  def pose_2_str(self, pose, remember_last=False, joints=None):
116  """Prints a pose target"""
117  x,y,z = pose.Pos()
118  i,j,k = pose.VZ()
119  x = x * MM_2_UNITS
120  y = y * MM_2_UNITS
121  z = z * MM_2_UNITS
122  strjnts = ''
123  if joints is not None and len(joints) > 5:
124  strjnts = " Y2=%.3f" % joints[5]
125 
126  if remember_last:
127  G_LINE = ''
128  if self.LAST_X != x:
129  G_LINE += 'X%.3f ' % x
130  if self.LAST_Y != y:
131  G_LINE += 'Y%.3f ' % y
132  if self.LAST_Z != z or len(G_LINE) == 0:
133  G_LINE += 'Z%.3f ' % z
134  G_LINE += 'A3=%.3f ' % i
135  G_LINE += 'B3=%.3f ' % j
136  G_LINE += 'C3=%.3f ' % k
137  self.LAST_X = x
138  self.LAST_Y = y
139  self.LAST_Z = z
140  G_LINE = G_LINE[:-1]
141  return G_LINE + strjnts
142  else:
143  return ('X%.3f Y%.3f Z%.3f A3%.3f B3%.3f C3%.3f%s' % (x,y,z,i,j,k,strjnts))
144 
145  def joints_2_str(self, joints):
146  """Prints a joint target"""
147  str = ''
148  data = ['ST1','ST2','ST3','A','C','G','H','I','J','K','L']
149  for i in range(len(joints)):
150  str = str + ('%s=%.6f ' % (data[i], joints[i]))
151  str = str[:-1]
152  return str
153 
154 
155  def __init__(self, robotpost=None, robotname=None, robot_axes = 6, **kwargs):
156  self.ROBOT_POST = robotpost
157  self.ROBOT_NAME = robotname
158  self.PROG = ''
159  self.LOG = ''
160  self.nAxes = robot_axes
161 
162  def ProgStart(self, progname):
163  self.PROG_COUNT = self.PROG_COUNT + 1
164  if self.PROG_COUNT <= 1:
165  import datetime
166  self.addcomment('File: %s' % progname)
167  self.addcomment('Created on %s' % datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
168  self.addcomment('Program created using RoboDK')
169  if MM_2_UNITS == 1.0:
170  self.addline('G710 G40 ; metric, no tool radius compensation')
171  elif MM_2_UNITS == 1.0/25.4:
172  self.addline('G700 G40 ; inch, no tool radius compensation')
173  else:
174  raise Exception("Unknown units!! Define MM_2_UNITS properly.")
175 
176  self.addline('G17 G94 G90 G60 G601 FNORM')
177  self.addline('SOFT ; Smooth acceleration')
178  self.addline('FFWON ; Look ahead')
179  self.addline('FIFOCTRL')
180  self.addline('G645')
181  self.addline('DYNNORM ; Specific settings for acceleration')
182  self.addline('COMPCAD ; Not working with radius compensation')
183  self.addcomment('')
184 
185  else:
186  self.addcomment('')
187  self.addcomment('---------- Subprogram: %s ----------' % progname)
188  #self.addline('PROC %s' % progname)
189  self.addline('%s:' % progname)
190  self.addline('TRAORI')
191  self.TRAORI = True
192 
193 
194  def ProgFinish(self, progname):
195  if self.PROG_COUNT <= 1:
196  self.addcomment('')
197  self.addcomment('Stop Spindle')
198  self.addline('M5')
199  self.addcomment('')
200  self.addcomment('End of main program ' + progname)
201  self.addline('M30')
202  self.addcomment('---------------------------')
203  self.addcomment('')
204  else:
205  #self.addline('RET("%s_done")' % progname) # needs to be in a file as SPF
206  #self.addline('M17 ; end of subprogram %s' % progname) # needs to be in a file as SPF
207  self.addline('GOTOB ' + progname + "_done")
208  self.addcomment('------------------------------------')
209  self.addcomment('')
210 
211  def ProgSave(self, folder, progname, ask_user=False, show_result=False):
212  progname = progname + '.' + self.PROG_EXT
213  if ask_user or not DirExists(folder):
214  filesave = getSaveFile(folder, progname, 'Save program as...')
215  if filesave is not None:
216  filesave = filesave.name
217  else:
218  return
219  else:
220  filesave = folder + '/' + progname
221  fid = open(filesave, "w")
222  fid.write(self.PROG)
223  fid.close()
224  print('SAVED: %s\n' % filesave)
225  #---------------------- show result
226  if show_result:
227  if type(show_result) is str:
228  # Open file with provided application
229  import subprocess
230  p = subprocess.Popen([show_result, filesave])
231  elif type(show_result) is list:
232  import subprocess
233  p = subprocess.Popen(show_result + [filesave])
234  else:
235  # open file with default application
236  import os
237  os.startfile(filesave)
238 
239  if len(self.LOG) > 0:
240  mbox('Program generation LOG:\n\n' + self.LOG)
241 
242  def ProgSendRobot(self, robot_ip, remote_path, ftp_user, ftp_pass):
243  """Send a program to the robot using the provided parameters. This method is executed right after ProgSave if we selected the option "Send Program to Robot".
244  The connection parameters must be provided in the robot connection menu of RoboDK"""
245  UploadFTP(self.PROG_FILES, robot_ip, remote_path, ftp_user, ftp_pass)
246 
248  if not self.TRAORI:
249  self.TRAORI = True
250  self.addline('TRAORI')
251  self.addline('G54')
252 
253  def set_joint_space(self):
254  if self.TRAORI:
255  self.TRAORI = False
256  self.addline('TRAFOOF')
257 
258  def MoveJ(self, pose, joints, conf_RLF=None):
259  """Add a joint movement"""
260  self.set_joint_space()
261  self.addline('G1 ' + self.joints_2_str(joints) + ' F%.1f' % self.SPEED_DEG_MIN)
262  #self.addline('G0 ' + self.joints_2_str(joints)) # G0 is the fastest
263  if pose is not None:
264  self.addline('; TRAORI')
265  self.addline('; PTP G1 ' + self.pose_2_str(self.REF_FRAME * pose * self.INV_TOOL_FRAME, True) + ' STAT=%i TU=%i F%.1f ; same joint coordinate' % (conf_2_STAT(conf_RLF), joints_2_TU(joints), self.SPEED_UNITS_MIN))
266  self.addline('; TRAFOOF')
267 
268  self.LAST_POSE = None
269 
270  def MoveL(self, pose, joints, conf_RLF=None):
271  """Add a linear movement"""
272  if pose is None:
273  self.set_joint_space()
274  self.addline('G1 ' + self.joints_2_str(joints) + ' F%.1f' % self.SPEED_UNITS_MIN)
275  else:
276  self.set_cartesian_space()
277  self.addline('G1 ' + self.pose_2_str(self.REF_FRAME * pose * self.INV_TOOL_FRAME, True, joints) + ' F%.1f' % self.SPEED_UNITS_MIN)
278  #self.addline('PTP G1 ' + self.pose_2_str(self.REF_FRAME * pose * self.INV_TOOL_FRAME, True) + ' STAT=%i TU=%i F%.1f' % (conf_2_STAT(conf_RLF), joints_2_TU(joints), self.SPEED_UNITS_MIN))
279  # Note: it is important to have
280  return
281 
282  if self.LAST_POSE is None:
283  self.addline('G1 ' + self.pose_2_str(self.REF_FRAME * pose * self.INV_TOOL_FRAME, True, joints) + ' F%.1f' % self.SPEED_UNITS_MIN)
284  else:
285  pose_shift = invH(self.LAST_POSE)*pose
286  angle = pose_angle(pose_shift)*180/pi
287 
288  x,y,z,w,p,r = Pose_2_UR(pose_shift)
289  x = x * MM_2_UNITS
290  y = y * MM_2_UNITS
291  z = z * MM_2_UNITS
292 
293  steps = int(angle/(1))
294  steps = float(max(1,steps))
295  self.addline('; next move %.1f deg divided in %i steps' % (angle, steps))
296  xd = x/steps
297  yd = y/steps
298  zd = z/steps
299  wd = w/steps
300  pd = p/steps
301  rd = r/steps
302  for i in range(int(steps)):
303  factor = i+1
304  hi = UR_2_Pose([xd*factor,yd*factor,zd*factor,wd*factor,pd*factor,rd*factor])
305  self.addline('G1 ' + self.pose_2_str(self.REF_FRAME*self.LAST_POSE*hi*self.INV_TOOL_FRAME, True) + ' F%.1f' % self.SPEED_UNITS_MIN)
306 
307  self.LAST_POSE = pose
308 
309  def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None):
310  """Add a circular movement"""
311  self.nId = self.nId + 1
312  xyz1 = (self.REF_FRAME*pose1*self.INV_TOOL_FRAME).Pos()
313  xyz2 = (self.REF_FRAME*pose2*self.INV_TOOL_FRAME).Pos()
314  #xyz1 = (pose1).Pos()
315  #xyz2 = (pose2).Pos()
316  self.addline('G2 X%.3f Y%.3f Z%.3f I1=%.3f J1=%.3f K1=%.3f F%.1f' % (xyz2[0], xyz2[1], xyz2[2], xyz1[0], xyz1[1], xyz1[2], self.SPEED_UNITS_MIN))
317 
318  def setFrame(self, pose, frame_id=None, frame_name=None):
319  """Change the robot reference frame"""
320  self.addcomment('------ Update reference: %s ------' % (frame_name if frame_name is not None else ''))
321  #self.addline('TRAORI')
322  self.set_cartesian_space()
323  [x,y,z,a,b,c] = Pose_2_Staubli(pose)
324  x = x * MM_2_UNITS
325  y = y * MM_2_UNITS
326  z = z * MM_2_UNITS
327  self.addline('; $P_UIFR[1]=CTRANS(X,%.5f,Y,%.5f,Z,%.5f):CROT(X,%.5f,Y,%.5f,Z,%.5f)' % (x,y,z,a,b,c))
328  self.addline('G54')
329  self.addcomment('---------------------------')
330  self.addcomment('')
331 
332 
333  def setTool(self, pose, tool_id=None, tool_name=None):
334  """Change the robot TCP"""
335  #if tool_id is not None and tool_id > 0:
336  # self.addline('T%i D1' % tool_id)
337  # self.addcomment('Using controller definition for tool %i' % frame_id)
338  # return
339 
340  self.nId = self.nId + 1
341  self.addcomment('------ Update TCP: %s ------' % (tool_name if tool_name is not None else ''))
342  self.set_cartesian_space()#self.addline('TRAORI')
343  [ x, y, z,_a,_b,_c] = Pose_2_Staubli(roty(pi)*pose)
344  [_x,_y,_z, a, b, c] = Pose_2_Staubli(pose)
345  x = x * MM_2_UNITS
346  y = y * MM_2_UNITS
347  z = z * MM_2_UNITS
348  self.INV_TOOL_FRAME = invH(pose)
349  self.INV_TOOL_FRAME.setPos([0,0,0])
350  self.addcomment('$TC_DP5[1,1]=%.5f' % x)
351  self.addcomment('$TC_DP4[1,1]=%.5f' % y)
352  self.addcomment('$TC_DP3[1,1]=%.5f' % z)
353  #self.addline('$TC_DPC3[1,1]=%.5f' % a)
354  #self.addline('$TC_DPC2[1,1]=%.5f' % b)
355  #self.addline('$TC_DPC1[1,1]=%.5f' % c)
356  self.addcomment('$TC_DPC3[1,1]=0.0')
357  self.addcomment('$TC_DPC2[1,1]=0.0')
358  self.addcomment('$TC_DPC1[1,1]=0.0')
359  self.addline('T="%s" D1' % tool_name) # Use tool 1 profile 1
360 
361  self.addcomment('---------------------------- ')
362  self.addcomment('')
363 
364  def Pause(self, time_ms):
365  """Pause the robot program"""
366  if time_ms < 0:
367  #self.addline('G9 ; STOP') # can't continue
368  self.addline('M0 ; STOP')
369  else:
370  self.addline('G4 F%.0f ; pause in seconds' % (time_ms*0.001))
371 
372  def setSpeed(self, speed_mms):
373  """Changes the robot speed (in mm/s)"""
374  self.SPEED_UNITS_MIN = speed_mms*60.0*MM_2_UNITS
375 
376  def setAcceleration(self, accel_mmss):
377  """Changes the robot acceleration (in mm/s2)"""
378  self.addcomment('Acceleration set to %.3f mm/s2' % accel_mmss)
379 
380  def setSpeedJoints(self, speed_degs):
381  """Changes the robot joint speed (in deg/s)"""
382  #self.addcomment('Joint speed set to %.3f deg/s' % speed_degs)
383  self.SPEED_DEG_MIN = speed_degs * 60
384 
385  def setAccelerationJoints(self, accel_degss):
386  """Changes the robot joint acceleration (in deg/s2)"""
387  self.addcomment('Joint acceleration set to %.3f deg/s2' % accel_degss)
388 
389  def setZoneData(self, zone_mm):
390  """Changes the rounding radius (aka CNT, APO or zone data) to make the movement smoother"""
391  #self.addcomment('Look ahead desired tolerance: %.1f mm' % zone_mm)
392  if zone_mm < 0:
393  self.addline('CYCLE832(0,_OFF,1)')
394  else:
395  self.addline('CYCLE832(0.1,_FINISH,1)')
396 
397  def setDO(self, io_var, io_value):
398  """Sets a variable (digital output) to a given value"""
399  comment = 'Set digital output %s = %s' % (io_var, io_value)
400  if type(io_var) != str: # set default variable name if io_var is a number
401  io_var = 'P%s' % str(io_var)
402  if type(io_value) != str: # set default variable value if io_value is a number
403  if io_value > 0:
404  io_value = M_SET_DO_HIGH
405  else:
406  io_value = M_SET_DO_LOW
407 
408  # at this point, io_var and io_value must be string values
409  self.addline('%s %s ; %s' % (io_value, io_var, comment))
410 
411  def waitDI(self, io_var, io_value, timeout_ms=-1):
412  """Waits for a variable (digital input) io_var to attain a given value io_value. Optionally, a timeout can be provided."""
413  comment = 'Wait Digital Input %s = %s' % (io_var, io_value)
414  if timeout_ms > 0:
415  comment = comment + ' (timeout = %.3f)' % (timeout_ms*0.001)
416 
417  if type(io_var) != str: # set default variable name if io_var is a number
418  io_var = 'P%s' % str(io_var)
419  if type(io_value) != str: # set default variable value if io_value is a number
420  if io_value > 0:
421  io_value = 'L3'
422  else:
423  io_value = 'L4'
424 
425  # at this point, io_var and io_value must be string values
426  if timeout_ms < 0:
427  self.addline('%s %s %s Q9999; %s' % (M_WAIT_DI, io_var, io_value, comment))
428  else:
429  self.addline('%s %s %s Q%.3f; %s' % (M_WAIT_DI, io_var, io_value, timeout_ms*0.001, comment))
430 
431  def RunCode(self, code, is_function_call = False):
432  """Adds code or a function call"""
433  if is_function_call:
434  code.replace(' ','_')
435  #self.addline(code)
436 
437  if code.lower().startswith("setrpm("):
438  # if the program call is Extruder(123.56), we extract the number as a string and convert it to a number
439  new_rpm = float(code[7:-1]) # it needs to retrieve the extruder length from the program call
440  self.addline('S' + code)
441 
442  else:
443  self.addline('GOTOF ' + code)
444  self.addline(code + '_done:')
445 
446  else:
447  self.addcomment(code)
448 
449  def RunMessage(self, message, iscomment = False):
450  """Display a message in the robot controller screen (teach pendant)"""
451  if iscomment:
452  self.addcomment(message)
453  else:
454  self.addcomment('Display message: %s' % message)
455 
456 # ------------------ private ----------------------
457  def addline(self, newline):
458  """Add a program line"""
459  self.Nline = self.Nline + 10
460  self.PROG = self.PROG + ('N%02i ' % self.Nline) + newline + '\n'
461 
462  def addcomment(self, newline):
463  """Add a comment line"""
464  self.PROG = self.PROG + '; ' + newline + '\n'
465 
466  def addlog(self, newline):
467  """Add a log message"""
468  self.LOG = self.LOG + newline + '\n'
469 
470 # -------------------------------------------------
471 # ------------ For testing purposes ---------------
472 def Pose(xyzrpw):
473  [x,y,z,r,p,w] = xyzrpw
474  a = r*math.pi/180
475  b = p*math.pi/180
476  c = w*math.pi/180
477  ca = math.cos(a)
478  sa = math.sin(a)
479  cb = math.cos(b)
480  sb = math.sin(b)
481  cc = math.cos(c)
482  sc = math.sin(c)
483  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]])
484 
485 def test_post():
486  """Test the post with a basic program"""
487 
488  robot = RobotPost()
489 
490  robot.ProgStart("Program")
491  robot.RunMessage("Program generated by RoboDK using a custom post processor", True)
492  robot.setFrame(Pose([807.766544, -963.699898, 41.478944, 0, 0, 0]))
493  robot.setTool(Pose([62.5, -108.253175, 100, -60, 90, 0]))
494  robot.MoveJ(Pose([200, 200, 500, 180, 0, 180]), [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752] )
495  robot.MoveL(Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
496  robot.MoveL(Pose([200, 200, 262.132034, 180, 0, -150]), [-43.73892, -3.91728, -35.77935, 58.57566, 54.11615, -253.81122] )
497  robot.RunMessage("Setting air valve 1 on")
498  robot.RunCode("TCP_On", True)
499  robot.Pause(1000)
500  robot.MoveL(Pose([200, 250, 348.734575, 180, 0, -150]), [-41.62707, -8.89064, -30.01809, 60.62329, 49.66749, -258.98418] )
501  robot.MoveL(Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
502  robot.MoveL(Pose([250, 250, 191.421356, 180, 0, -150]), [-39.75778, -1.04537, -40.37883, 52.09118, 54.15317, -246.94403] )
503  robot.RunMessage("Setting air valve off")
504  robot.RunCode("TCP_Off", True)
505  robot.Pause(1000)
506  robot.MoveL(Pose([250, 300, 278.023897, 180, 0, -150]), [-37.52588, -6.32628, -34.59693, 53.52525, 49.24426, -251.44677] )
507  robot.MoveL(Pose([250, 200, 278.023897, 180, 0, -150]), [-41.85389, -1.95619, -34.89154, 57.43912, 52.34162, -253.73403] )
508  robot.MoveL(Pose([250, 150, 191.421356, 180, 0, -150]), [-43.82111, 3.29703, -40.29493, 56.02402, 56.61169, -249.23532] )
509  robot.MoveJ(None, [-46.18419, -6.77518, -20.54925, 71.38674, 49.58727, -302.54752] )
510  robot.ProgFinish("Program")
511  # robot.ProgSave(".","Program",True)
512  print(robot.PROG)
513  if len(robot.LOG) > 0:
514  mbox('Program generation LOG:\n\n' + robot.LOG)
515 
516  input("Press Enter to close...")
517 
518 if __name__ == "__main__":
519  """Function to call when the module is executed by itself: test"""
520  test_post()
def pose_2_str(self, pose, remember_last=False, joints=None)
def waitDI(self, io_var, io_value, timeout_ms=-1)
def ProgSendRobot(self, robot_ip, remote_path, ftp_user, ftp_pass)
def ProgSave(self, folder, progname, ask_user=False, show_result=False)
def UploadFTP(program, robot_ip, remote_path, ftp_user, ftp_pass)
Definition: robodk.py:1312
def setFrame(self, pose, frame_id=None, frame_name=None)
def mbox(msg, b1='OK', b2='Cancel', frame=True, t=False, entry=None)
Definition: robodk.py:1458
def MoveC(self, pose1, joints1, pose2, joints2, conf_RLF_1=None, conf_RLF_2=None)
def __init__(self, robotpost=None, robotname=None, robot_axes=6, kwargs)
def setTool(self, pose, tool_id=None, tool_name=None)
def getSaveFile(strdir='C:\\', strfile='file.txt', strtitle='Save file as ...')
Definition: robodk.py:1354
def RunCode(self, code, is_function_call=False)


ros_robodk_post_processors
Author(s): Victor Lamoine - Institut Maupertuis
autogenerated on Sun Jun 7 2020 03:50:22