deserialize.py
Go to the documentation of this file.
1 from __future__ import print_function
2 import struct
3 
4 class PackageType(object):
5  ROBOT_MODE_DATA = 0
6  JOINT_DATA = 1
7  TOOL_DATA = 2
8  MASTERBOARD_DATA = 3
9  CARTESIAN_INFO = 4
10  KINEMATICS_INFO = 5
11  CONFIGURATION_DATA = 6
12  FORCE_MODE_DATA = 7
13  ADDITIONAL_INFO = 8
14  CALIBRATION_DATA = 9
15 
16 class RobotMode(object):
17  RUNNING = 0
18  FREEDRIVE = 1
19  READY = 2
20  INITIALIZING = 3
21  SECURITY_STOPPED = 4
22  EMERGENCY_STOPPED = 5
23  FATAL_ERROR = 6
24  NO_POWER = 7
25  NOT_CONNECTED = 8
26  SHUTDOWN = 9
27  SAFEGUARD_STOP = 10
28 
29 class JointMode(object):
30  PART_D_CALIBRATION = 237
31  BACKDRIVE = 238
32  POWER_OFF = 239
33  EMERGENCY_STOPPED = 240
34  CALVAL_INITIALIZATION = 241
35  ERROR = 242
36  FREEDRIVE = 243
37  SIMULATED = 244
38  NOT_RESPONDING = 245
39  MOTOR_INITIALISATION = 246
40  ADC_CALIBRATION = 247
41  DEAD_COMMUTATION = 248
42  BOOTLOADER = 249
43  CALIBRATION = 250
44  STOPPED = 251
45  FAULT = 252
46  RUNNING = 253
47  INITIALIZATION = 254
48  IDLE = 255
49 
50 class ToolMode(object):
51  BOOTLOADER = 249
52  RUNNING = 253
53  IDLE = 255
54 
55 class MasterSafetyState(object):
56  UNDEFINED = 0
57  BOOTLOADER = 1
58  FAULT = 2
59  BOOTING = 3
60  INITIALIZING = 4
61  ROBOT_EMERGENCY_STOP = 5
62  EXTERNAL_EMERGENCY_STOP = 6
63  SAFEGUARD_STOP = 7
64  OK = 8
65 
66 class MasterOnOffState(object):
67  OFF = 0
68  TURNING_ON = 1
69  ON = 2
70  TURNING_OFF = 3
71 
72 #this class handles different protocol versions
73 class RobotModeData(object):
74  @staticmethod
75  def unpack(buf):
76  rmd = RobotModeData()
77  (plen, ptype) = struct.unpack_from("!IB", buf)
78  if plen == 29:
79  return RobotModeData_V18.unpack(buf)
80  elif plen == 38:
81  return RobotModeData_V30.unpack(buf)
82  else:
83  print("RobotModeData has wrong length: " + str(plen))
84  return rmd
85 
86 #this parses RobotModeData for versions <= v1.8 (i.e. 1.6, 1.7, 1.8)
87 class RobotModeData_V18(object):
88  __slots__ = ['timestamp', 'robot_connected', 'real_robot_enabled',
89  'power_on_robot', 'emergency_stopped',
90  'security_stopped', 'program_running', 'program_paused',
91  'robot_mode', 'speed_fraction']
92  @staticmethod
93  def unpack(buf):
94  rmd = RobotModeData_V18()
95  (_, _,
96  rmd.timestamp, rmd.robot_connected, rmd.real_robot_enabled,
97  rmd.power_on_robot, rmd.emergency_stopped, rmd.security_stopped,
98  rmd.program_running, rmd.program_paused, rmd.robot_mode,
99  rmd.speed_fraction) = struct.unpack_from("!IBQ???????Bd", buf)
100  return rmd
101 
102 #this parses RobotModeData for versions >=3.0 (i.e. 3.0)
103 class RobotModeData_V30(object):
104  __slots__ = ['timestamp', 'robot_connected', 'real_robot_enabled',
105  'power_on_robot', 'emergency_stopped',
106  'security_stopped', 'program_running', 'program_paused',
107  'robot_mode', 'control_mode', 'target_speed_fraction',
108  'speed_scaling']
109  @staticmethod
110  def unpack(buf):
111  rmd = RobotModeData_V30()
112  (_, _,
113  rmd.timestamp, rmd.robot_connected, rmd.real_robot_enabled,
114  rmd.power_on_robot, rmd.emergency_stopped, rmd.security_stopped,
115  rmd.program_running, rmd.program_paused, rmd.robot_mode, rmd.control_mode,
116  rmd.target_speed_fraction, rmd.speed_scaling) = struct.unpack_from("!IBQ???????BBdd", buf)
117  return rmd
118 
119 #this parses JointData for all versions (i.e. 1.6, 1.7, 1.8, 3.0)
120 class JointData(object):
121  __slots__ = ['q_actual', 'q_target', 'qd_actual',
122  'I_actual', 'V_actual', 'T_motor', 'T_micro', 'joint_mode']
123  @staticmethod
124  def unpack(buf):
125  all_joints = []
126  offset = 5
127  for i in range(6):
128  jd = JointData()
129  (jd.q_actual, jd.q_target, jd.qd_actual, jd.I_actual, jd.V_actual,
130  jd.T_motor, jd.T_micro,
131  jd.joint_mode) = struct.unpack_from("!dddffffB", buf, offset)
132  offset += 41
133  all_joints.append(jd)
134  return all_joints
135 
136 #this parses JointData for all versions (i.e. 1.6, 1.7, 1.8, 3.0)
137 class ToolData(object):
138  __slots__ = ['analog_input_range2', 'analog_input_range3',
139  'analog_input2', 'analog_input3',
140  'tool_voltage_48V', 'tool_output_voltage', 'tool_current',
141  'tool_temperature', 'tool_mode']
142  @staticmethod
143  def unpack(buf):
144  td = ToolData()
145  (_, _,
146  td.analog_input_range2, td.analog_input_range3,
147  td.analog_input2, td.analog_input3,
148  td.tool_voltage_48V, td.tool_output_voltage, td.tool_current,
149  td.tool_temperature, td.tool_mode) = struct.unpack_from("!IBbbddfBffB", buf)
150  return td
151 
152 #this class handles different protocol versions
153 class MasterboardData(object):
154  @staticmethod
155  def unpack(buf):
156  md = MasterboardData()
157  (plen, ptype) = struct.unpack_from("!IB", buf)
158  if (plen == 64) or (plen == 76): # Euromap67 interface = 12 bytes
159  return MasterboardData_V18.unpack(buf)
160  elif (plen == 72) or (plen == 92): # Euromap67 interface = 20 bytes
161  return MasterboardData_V30.unpack(buf)
162  else:
163  print("MasterboardData has wrong length: " + str(plen))
164  print("Euromap67Interface is ignored")
165  return md
166 
167 #this parses MasterboardData for versions <= v1.8 (i.e. 1.6, 1.7, 1.8)
168 class MasterboardData_V18(object):
169  __slots__ = ['digital_input_bits', 'digital_output_bits',
170  'analog_input_range0', 'analog_input_range1',
171  'analog_input0', 'analog_input1',
172  'analog_output_domain0', 'analog_output_domain1',
173  'analog_output0', 'analog_output1',
174  'masterboard_temperature',
175  'robot_voltage_48V', 'robot_current',
176  'master_io_current', 'master_safety_state',
177  'master_onoff_state']#subsequent slots related to 'euromap' ignored
178  @staticmethod
179  def unpack(buf):
180  md = MasterboardData_V18()
181  (_, _,
182  md.digital_input_bits, md.digital_output_bits,
183  md.analog_input_range0, md.analog_input_range1,
184  md.analog_input0, md.analog_input1,
185  md.analog_output_domain0, md.analog_output_domain1,
186  md.analog_output0, md.analog_output1,
187  md.masterboard_temperature,
188  md.robot_voltage_48V, md.robot_current,
189  md.master_io_current, md.master_safety_state,
190  md.master_onoff_state) = struct.unpack_from("!IBhhbbddbbddffffBB", buf)
191  return md
192 
193 #this parses MasterboardData for versions >=3.0 (i.e. 3.0)
194 class MasterboardData_V30(object):
195  __slots__ = ['digital_input_bits', 'digital_output_bits',
196  'analog_input_range0', 'analog_input_range1',
197  'analog_input0', 'analog_input1',
198  'analog_output_domain0', 'analog_output_domain1',
199  'analog_output0', 'analog_output1',
200  'masterboard_temperature',
201  'robot_voltage_48V', 'robot_current',
202  'master_io_current', 'safety_mode',
203  'in_reduced_mode']#subsequent slots related to 'euromap' ignored
204  @staticmethod
205  def unpack(buf):
206  md = MasterboardData_V30()
207  (_, _,
208  md.digital_input_bits, md.digital_output_bits,
209  md.analog_input_range0, md.analog_input_range1,
210  md.analog_input0, md.analog_input1,
211  md.analog_output_domain0, md.analog_output_domain1,
212  md.analog_output0, md.analog_output1,
213  md.masterboard_temperature,
214  md.robot_voltage_48V, md.robot_current,
215  md.master_io_current, md.safety_mode,
216  md.in_reduced_mode) = struct.unpack_from("!IBiibbddbbddffffBB", buf)
217  return md
218 
219 #this parses JointData for all versions (i.e. 1.6, 1.7, 1.8, 3.0)
220 class CartesianInfo(object):
221  __slots__ = ['x', 'y', 'z', 'rx', 'ry', 'rz']
222  @staticmethod
223  def unpack(buf):
224  ci = CartesianInfo()
225  (_, _,
226  ci.x, ci.y, ci.z, ci.rx, ci.ry, ci.rz) = struct.unpack_from("!IB6d", buf)
227  return ci
228 
229 #this parses KinematicsInfo for versions (i.e. 1.8, 3.0)
230 #KinematicsInfo is not available in 1.6 and 1.7
231 class KinematicsInfo(object):
232  @staticmethod
233  def unpack(buf):
234  return KinematicsInfo()
235 
236 #helper class for ConfigurationData
237 class JointLimitData(object):
238  __slots__ = ['min_limit', 'max_limit', 'max_speed', 'max_acceleration']
239 
240 #this parses ConfigurationData for versions (i.e. 1.8, 3.0)
241 #ConfigurationData is not available in 1.6 and 1.7
242 class ConfigurationData(object):
243  __slots__ = ['joint_limit_data',
244  'v_joint_default', 'a_joint_default',
245  'v_tool_default', 'a_tool_default', 'eq_radius',
246  'dh_a', 'dh_d', 'dh_alpha', 'dh_theta',
247  'masterboard_version', 'controller_box_type',
248  'robot_type', 'robot_subtype']#in v1.8 there is an additional slot 'motor_type' for each joint, which currently is ignored!
249  @staticmethod
250  def unpack(buf):
251  cd = ConfigurationData()
252  cd.joint_limit_data = []
253  for i in range(6):
254  jld = JointLimitData()
255  (jld.min_limit, jld.max_limit) = struct.unpack_from("!dd", buf, 5+16*i)
256  (jld.max_speed, jld.max_acceleration) = struct.unpack_from("!dd", buf, 5+16*6+16*i)
257  cd.joint_limit_data.append(jld)
258  (cd.v_joint_default, cd.a_joint_default, cd.v_tool_default, cd.a_tool_default,
259  cd.eq_radius) = struct.unpack_from("!ddddd", buf, 5+32*6)
260  (cd.masterboard_version, cd.controller_box_type, cd.robot_type,
261  cd.robot_subtype) = struct.unpack_from("!iiii", buf, 5+32*6+5*8+6*32)
262  return cd
263 
264 #this parses KinematicsInfo for versions (i.e. 1.8, 3.0)
265 #KinematicsInfo is not available in 1.6 and 1.7
266 class ForceModeData(object):
267  __slots__ = ['x', 'y', 'z', 'rx', 'ry', 'rz', 'robot_dexterity']
268  @staticmethod
269  def unpack(buf):
270  fmd = ForceModeData()
271  (_, _, fmd.x, fmd.y, fmd.z, fmd.rx, fmd.ry, fmd.rz,
272  fmd.robot_dexterity) = struct.unpack_from("!IBddddddd", buf)
273  return fmd
274 
275 #this class handles different protocol versions
276 class AdditionalInfo(object):
277  @staticmethod
278  def unpack(buf):
279  ai = AdditionalInfo()
280  (plen, ptype) = struct.unpack_from("!IB", buf)
281  if plen == 10:
282  return AdditionalInfoOld.unpack(buf)
283  elif plen == 7:
284  return AdditionalInfoNew.unpack(buf)
285  else:
286  print("AdditionalInfo has wrong length: " + str(plen))
287  return ai
288 
289 class AdditionalInfoOld(object):
290  __slots__ = ['ctrl_bits', 'teach_button']
291  @staticmethod
292  def unpack(buf):
293  ai = AdditionalInfoOld()
294  (_,_,ai.ctrl_bits, ai.teach_button) = struct.unpack_from("!IBIB", buf)
295  return ai
296 
297 class AdditionalInfoNew(object):
298  __slots__ = ['teach_button_enabled','teach_button_pressed']
299  @staticmethod
300  def unpack(buf):
301  ai = AdditionalInfoNew()
302  (_,_,ai.teach_button_enabled, ai.teach_button_pressed) = struct.unpack_from("!IBBB", buf)
303  return ai
304 
305 
306 class RobotState(object):
307  __slots__ = ['robot_mode_data', 'joint_data', 'tool_data',
308  'masterboard_data', 'cartesian_info',
309  'kinematics_info', 'configuration_data',
310  'force_mode_data', 'additional_info',
311  'unknown_ptypes']
312 
313  def __init__(self):
314  self.unknown_ptypes = []
315 
316  @staticmethod
317  def unpack(buf):
318  length, mtype = struct.unpack_from("!IB", buf)
319  if length != len(buf):
320  raise Exception("Could not unpack packet: length field is incorrect")
321  if mtype != 16:
322  if mtype == 20:
323  print("Likely a syntax error:")
324  print(buf[:2048])
325  raise Exception("Fatal error when unpacking RobotState packet")
326 
327  rs = RobotState()
328  offset = 5
329  while offset < len(buf):
330  length, ptype = struct.unpack_from("!IB", buf, offset)
331  assert offset + length <= len(buf)
332  package_buf = buffer(buf, offset, length)
333  offset += length
334 
335  if ptype == PackageType.ROBOT_MODE_DATA:
336  rs.robot_mode_data = RobotModeData.unpack(package_buf)
337  elif ptype == PackageType.JOINT_DATA:
338  rs.joint_data = JointData.unpack(package_buf)
339  elif ptype == PackageType.TOOL_DATA:
340  rs.tool_data = ToolData.unpack(package_buf)
341  elif ptype == PackageType.MASTERBOARD_DATA:
342  rs.masterboard_data = MasterboardData.unpack(package_buf)
343  elif ptype == PackageType.CARTESIAN_INFO:
344  rs.cartesian_info = CartesianInfo.unpack(package_buf)
345  elif ptype == PackageType.KINEMATICS_INFO:
346  rs.kinematics_info = KinematicsInfo.unpack(package_buf)
347  elif ptype == PackageType.CONFIGURATION_DATA:
348  rs.configuration_data = ConfigurationData.unpack(package_buf)
349  elif ptype == PackageType.FORCE_MODE_DATA:
350  rs.force_mode_data = ForceModeData.unpack(package_buf)
351  elif ptype == PackageType.ADDITIONAL_INFO:
352  rs.additional_info = AdditionalInfo.unpack(package_buf)
353  elif ptype == PackageType.CALIBRATION_DATA:
354  pass # internal data, should be skipped
355  else:
356  rs.unknown_ptypes.append(ptype)
357  return rs
358 
359 def pstate(o, indent=''):
360  for s in o.__slots__:
361  child = getattr(o, s, None)
362  if child is None:
363  print("%s%s: None" % (indent, s))
364  elif hasattr(child, '__slots__'):
365  print("%s%s:" % (indent, s))
366  pstate(child, indent + ' ')
367  elif hasattr(child, '__iter__'):
368  print("%s%s:" % (indent, s))
369  for i, c in enumerate(child):
370  print("%s [%i]:" % (indent, i))
371  pstate(c, indent + ' ')
372  else:
373  print("%s%s: %s" % (indent, s, child))
def pstate(o, indent='')
Definition: deserialize.py:359


ur_driver
Author(s): Stuart Glaser, Shaun Edwards, Felix Messmer
autogenerated on Sun Nov 24 2019 03:36:29