services.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 from robodk_postprocessors.Fanuc_R30iA import RobotPost as FanucR30iAPost
3 from robodk_postprocessors.Motoman import Pose
4 from robodk_postprocessors.Motoman import RobotPost as MotomanPost
5 from robodk_postprocessors.robodk import *
7 import config
8 import geometry_msgs.msg
9 import motoman
10 import rospy
11 
12 # From geometry_msgs.Pose to RoboDK.Mat
13 def poseToMat(p):
14  # Warning: Quaternion initialization order: w, x, y, z
15  quat = [p.orientation.w, p.orientation.x, p.orientation.y, p.orientation.z]
16  mat = quaternion_2_pose(quat)
17  mat.setPos([p.position.x * 1000, p.position.y * 1000, p.position.z * 1000])
18  return mat
19 
20 # Check if pose is initialized
22  if p.orientation.x == 0 and p.orientation.y == 0 and p.orientation.z == 0 and p.orientation.w == 0:
23  return False
24  return True
25 
26 def move_c(req):
27  if config.pp is None:
28  return [config.pp_not_init]
29 
30  if len(req.joints_1) != config.pp.nAxes:
31  return ["Joints tuple does not match the number of axes"]
32  if len(req.joints_2) != config.pp.nAxes:
33  return ["Joints tuple does not match the number of axes"]
34  if len(req.conf_RLF_1) != 3:
35  return ["conf_RLF_1 size must be 3"]
36  if len(req.conf_RLF_2) != 3:
37  return ["conf_RLF_2 size must be 3"]
38 
39  if not poseInitialized(req.pose_1):
40  return ["Pose 1 quaternions are not initialized"]
41  if not poseInitialized(req.pose_2):
42  return ["Pose 2 quaternions are not initialized"]
43  p1 = poseToMat(req.pose_1)
44  p2 = poseToMat(req.pose_2)
45  config.pp.MoveC(p1, req.joints_1, p2, req.joints_2, list(req.conf_RLF_1), list(req.conf_RLF_2))
46  return [""]
47 
48 def move_j(req):
49  if config.pp is None:
50  return [config.pp_not_init]
51 
52  if len(req.joints) != config.pp.nAxes:
53  return ["Joints tuple does not match the number of axes"]
54  if len(req.conf_RLF) != 3:
55  return ["conf_RLF size must be 3"]
56 
57  if not poseInitialized(req.pose):
58  return ["Pose quaternions are not initialized"]
59  p = poseToMat(req.pose)
60  config.pp.MoveJ(p, req.joints, list(req.conf_RLF))
61  return [""]
62 
63 def move_l(req):
64  if config.pp is None:
65  return [config.pp_not_init]
66 
67  if len(req.joints) != config.pp.nAxes:
68  return ["Joints tuple does not match the number of axes"]
69  if len(req.conf_RLF) != 3:
70  return ["conf_RLF size must be 3"]
71 
72  if not poseInitialized(req.pose):
73  return ["Pose quaternions are not initialized"]
74 
75  p = poseToMat(req.pose)
76  config.pp.MoveL(p, req.joints, list(req.conf_RLF))
77  return [""]
78 
79 def pause(req):
80  if config.pp is None:
81  return [config.pp_not_init]
82 
83  if req.seconds <= 0.0:
84  return ["Pause cannot be zero or negative"];
85 
86  config.pp.Pause(req.seconds * 1000)
87  return [""]
88 
89 def prog_finish(req):
90  if config.pp is None:
91  return [config.pp_not_init]
92 
93  config.pp.ProgFinish(req.program_name)
94  if len(config.pp.LOG) > 0:
95  return [config.pp.LOG, ""]
96 
97  program=''
98  for line in config.pp.PROG_LIST[-1]:
99  program += line
100  return ["", program]
101 
102 def prog_save(req):
103  if config.pp is None:
104  return [config.pp_not_init, ""]
105 
106  if len(config.pp.PROG_LIST) is 0:
107  return ["Program list is empty", ""]
108 
109  program=''
110  for line in config.pp.PROG_LIST[-1]:
111  program += line
112 
113  if not req.program_name:
114  return ["program_name cannot be empty", ""]
115  if not req.file_saving_dir:
116  return ["file_saving_dir cannot be empty", ""]
117  config.pp.ProgSave(req.file_saving_dir, req.program_name)
118  return ["", program]
119 
121  if config.pp is None:
122  return [config.pp_not_init, ""]
123 
124  if not req.robot_ip:
125  return ["robot_ip cannot be empty"]
126 
127  config.pp.ProgSendRobot(req.robot_ip, req.remote_path, req.ftp_user, req.ftp_pass)
128  return [""]
129 
130 def prog_start(req):
131  if len(req.post_processor) is 0:
132  return ["Post processor name is empty"]
133  elif req.post_processor == "Motoman":
134  config.pp = MotomanPost()
135  config.pp.LAST_CONFDATA = [None, None, None, None] # Reset last configuration
136  elif req.post_processor == "Fanuc_R30iA":
137  config.pp = FanucR30iAPost()
138  # New post-processors go here
139  else:
140  return ["'%s' post processor is not supported" % req.post_processor]
141 
142  config.pp.PROG_TARGETS = []
143 
144  if len(req.program_name) is 0:
145  return ["Program name is empty"]
146  config.pp.ProgStart(req.program_name)
147 
148  # Program comment is allowed to be empty
149  config.pp.PROG_COMMENT = req.program_comment
150 
151  return [""]
152 
153 def run_message(req):
154  if config.pp is None:
155  return [config.pp_not_init]
156 
157  if not req.msg:
158  return ["message cannot be empty"]
159 
160  config.pp.RunMessage(req.msg)
161  return [""]
162 
163 def run_code(req):
164  if config.pp is None:
165  return [config.pp_not_init]
166 
167  if not req.code:
168  return ["code cannot be empty"]
169 
170  config.pp.RunCode(req.code, req.is_function_call)
171  return [""]
172 
173 def set_do(req): # set Digital Output
174  if config.pp is None:
175  return [config.pp_not_init]
176 
177  try:
178  var = int(req.io_var)
179  config.pp.setDO(var, req.io_value)
180  except ValueError:
181  config.pp.setDO(req.io_var, req.io_value)
182 
183  return [""]
184 
185 def set_frame(req):
186  if config.pp is None:
187  return [config.pp_not_init]
188 
189  if not poseInitialized(req.pose):
190  return ["Pose quaternions are not initialized"]
191  p = poseToMat(req.pose)
192  config.pp.setFrame(p, req.frame_id, req.frame_name)
193  return [""]
194 
195 def set_speed(req):
196  if config.pp is None:
197  return [config.pp_not_init]
198 
199  config.pp.setSpeed(req.mm_sec)
200  return [""]
201 
203  if config.pp is None:
204  return [config.pp_not_init]
205 
206  config.pp.setSpeedJoints(req.deg_sec)
207  return [""]
208 
209 def set_tool(req):
210  if config.pp is None:
211  return [config.pp_not_init]
212 
213  if not poseInitialized(req.pose):
214  return ["Pose quaternions are not initialized"]
215  p = poseToMat(req.pose)
216  config.pp.setTool(p, req.tool_id, req.tool_name)
217  return [""]
218 
219 def set_zone_data(req):
220  if config.pp is None:
221  return [config.pp_not_init]
222 
223  config.pp.setZoneData(req.zone_mm)
224  return [""]
225 
226 def wait_di(req):
227  if config.pp is None:
228  return [config.pp_not_init]
229 
230  try:
231  var = int(req.io_var)
232  config.pp.waitDI(var, req.io_value, req.timeout_ms)
233  except ValueError:
234  config.pp.waitDI(req.io_var, req.io_value, req.timeout_ms)
235 
236  return [""]
237 
238 # Common services
240  rospy.init_node('ros_robodk_post_processors')
241  service_prefix = 'robodk_post_processors/'
242  services = []
243 
244  # Common services to all post-processors
245  services.append(rospy.Service(service_prefix + 'move_c', MoveC, move_c))
246  services.append(rospy.Service(service_prefix + 'move_j', MoveJ, move_j))
247  services.append(rospy.Service(service_prefix + 'move_l', MoveL, move_l))
248  services.append(rospy.Service(service_prefix + 'pause', Pause, pause))
249  services.append(rospy.Service(service_prefix + 'prog_finish', ProgFinish, prog_finish))
250  services.append(rospy.Service(service_prefix + 'prog_save', ProgSave, prog_save))
251  services.append(rospy.Service(service_prefix + 'prog_send_robot', ProgSendRobot, prog_send_robot))
252  services.append(rospy.Service(service_prefix + 'prog_start', ProgStart, prog_start))
253  services.append(rospy.Service(service_prefix + 'run_code', RunCode, run_code))
254  services.append(rospy.Service(service_prefix + 'run_message', RunMessage, run_message))
255  services.append(rospy.Service(service_prefix + 'set_do', SetDO, set_do))
256  services.append(rospy.Service(service_prefix + 'set_frame', SetFrame, set_frame))
257  services.append(rospy.Service(service_prefix + 'set_speed', SetSpeed, set_speed))
258  services.append(rospy.Service(service_prefix + 'set_speed_joints', SetSpeedJoints, set_speed_joints))
259  services.append(rospy.Service(service_prefix + 'set_tool', SetTool, set_tool))
260  services.append(rospy.Service(service_prefix + 'set_zone_data', SetZoneData, set_zone_data))
261  services.append(rospy.Service(service_prefix + 'wait_di', WaitDI, wait_di))
262 
263  # Not implemented:
264  # setSpeed
265  # setAcceleration
266  # setSpeedJoints
267  # setAccelerationJoints
268  # setZoneData
269 
270  # Brand specific services
271  motoman.services(service_prefix, services)
272 
273  # Display all services advertised
274  for s in services:
275  rospy.loginfo("Service %s ready", s.resolved_name)
276  rospy.spin()
277 
278 if __name__ == '__main__':
def prog_finish(req)
Definition: services.py:89
def services_servers()
Definition: services.py:239
def set_frame(req)
Definition: services.py:185
def move_j(req)
Definition: services.py:48
def set_do(req)
Definition: services.py:173
def prog_start(req)
Definition: services.py:130
def prog_save(req)
Definition: services.py:102
def run_message(req)
Definition: services.py:153
def pause(req)
Definition: services.py:79
def set_zone_data(req)
Definition: services.py:219
def set_speed(req)
Definition: services.py:195
def run_code(req)
Definition: services.py:163
def poseToMat(p)
Definition: services.py:13
def poseInitialized(p)
Definition: services.py:21
def set_tool(req)
Definition: services.py:209
def move_c(req)
Definition: services.py:26
def wait_di(req)
Definition: services.py:226
def move_l(req)
Definition: services.py:63
def prog_send_robot(req)
Definition: services.py:120
def set_speed_joints(req)
Definition: services.py:202


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