4 PYTHON2 = sys.version_info < (3, 0)
 
   12 LIST_TYPES = [list, tuple]
 
   13 INT_TYPES = [
'byte', 
'char', 
'int8', 
'uint8', 
'int16', 
'uint16', 
'int32', 
'uint32', 
'int64', 
'uint64']
 
   14 FLOAT_TYPES = [
'float32', 
'float64']
 
   15 STRING_TYPES = [
'string']
 
   17 TIME_TYPES = [
'time', 
'duration']
 
   18 BOOL_ARRAY_TYPES = [
'bool[]']
 
   19 BYTESTREAM_TYPES = [
'uint8[]', 
'char[]']
 
   23 TAGGED_ARRAY_FORMATS = {
 
   24     'uint16[]': (69, 
'<{}H'),
 
   25     'uint32[]': (70, 
'<{}I'),
 
   26     'uint64[]': (71, 
'<{}Q'),
 
   27     'byte[]': (72, 
'{}b'),
 
   28     'int8[]': (72, 
'{}b'),
 
   29     'int16[]': (77, 
'<{}h'),
 
   30     'int32[]': (78, 
'<{}i'),
 
   31     'int64[]': (79, 
'<{}q'),
 
   32     'float32[]': (85, 
'<{}f'),
 
   33     'float64[]': (86, 
'<{}d'),
 
   38     """Extract a dictionary of CBOR-friendly values from a ROS message. 
   40     Primitive values will be casted to specific Python primitives. 
   42     Typed arrays will be tagged and packed into byte arrays. 
   45     for slot, slot_type 
in zip(msg.__slots__, msg._slot_types):
 
   46         val = getattr(msg, slot)
 
   52         if slot_type 
in STRING_TYPES:
 
   53             out[slot] = unicode(val) 
if PYTHON2 
else str(val)  
 
   56         elif slot_type 
in BOOL_TYPES:
 
   60         elif slot_type 
in INT_TYPES:
 
   64         elif slot_type 
in FLOAT_TYPES:
 
   65             out[slot] = float(val)
 
   68         elif slot_type 
in TIME_TYPES:
 
   70                 'secs': int(val.secs),
 
   71                 'nsecs': int(val.nsecs),
 
   75         elif slot_type 
in BYTESTREAM_TYPES:
 
   77                 out[slot] = bytes(bytearray(val))
 
   79                 out[slot] = bytes(val)
 
   82         elif slot_type 
in BOOL_ARRAY_TYPES:
 
   83             out[slot] = [bool(i) 
for i 
in val]
 
   86         elif slot_type 
in TAGGED_ARRAY_FORMATS:
 
   87             tag, fmt = TAGGED_ARRAY_FORMATS[slot_type]
 
   88             fmt_to_length = fmt.format(len(val))
 
   89             packed = struct.pack(fmt_to_length, *val)
 
   90             out[slot] = 
Tag(tag=tag, value=packed)
 
   93         elif type(val) 
in LIST_TYPES: