diff --git a/persontracking/lidar_cache.py b/persontracking/lidar_cache.py index 2c634b2..4b25e90 100644 --- a/persontracking/lidar_cache.py +++ b/persontracking/lidar_cache.py @@ -4,6 +4,7 @@ from threading import Thread from persontracking import algorithms import zmq + class LidarCache(): ''' A class that retrieves scans from the lidar, @@ -14,15 +15,18 @@ class LidarCache(): tracking_group_number = -1 currentGroups = None groupsChanged = [] - - def __init__(self, port, measurements=100): - self.port = port + port = None + + def __init__(self, measurements=100): self.lidar = RPLidar('/dev/ttyUSB0') self.measurements = measurements print('Info: ' + self.lidar.get_info()) print('Health: ' + self.lidar.get_health()) def start_cache(self): + if self.port is None: + print('ERROR: Port has not been set!') + return self.thread = Thread(target=self.do_scanning) self.thread.start() @@ -30,7 +34,6 @@ class LidarCache(): ''' Performs a scan for the given number of iterations. ''' - # Create the 0MQ socket first. This should not be passed between threads. self._socket = self._create_socket() self._socket.bind("tcp://*:" + str(self.port)) @@ -40,9 +43,10 @@ class LidarCache(): if(not self.run): break - # Now process the groups. + # Now process the groups. if self.currentGroups is not None: - self.currentGroups = algorithms.assign_groups(self.currentGroups, algorithms.calc_groups(scan)) + self.currentGroups = algorithms.assign_groups( + self.currentGroups, algorithms.calc_groups(scan)) else: self.currentGroups = algorithms.calc_groups(scan) @@ -56,4 +60,3 @@ class LidarCache(): def _create_socket(self): return zmq.Context.instance().socket(zmq.PUB) - \ No newline at end of file diff --git a/persontracking/lidar_servicer.py b/persontracking/lidar_servicer.py index 7ab31ad..e742670 100644 --- a/persontracking/lidar_servicer.py +++ b/persontracking/lidar_servicer.py @@ -1,27 +1,26 @@ import persontracking.lidar_tracker_pb2 as lidar_tracker_pb2 from persontracking.lidar_tracker_pb2_grpc import PersonTrackingServicer -from persontracking.lidar_cache import LidarCache\ - +from persontracking.lidar_cache import LidarCache +from multiprocessing import Process class LidarServicer(PersonTrackingServicer): + lidar_thread = None def __init__(self): self.cache = LidarCache(measurements=100) - self.cache.do_scanning() def set_tracking_group(self, request, context): pass def stop_tracking(self, request, context): self.cache.stop_scanning() - - def get_scan_data(self, request, context): - pass + self.lidar_thread.join() + self.lidar_thread = None def start_tracking(self, request, context): ''' Starts the lidar cache. ''' - pass - \ No newline at end of file + if self.lidar_thread is None: + self.lidar_thread = Process(target=self.cache.do_scanning) diff --git a/persontracking/lidar_tracker_pb2.py b/persontracking/lidar_tracker_pb2.py index 38c0bdf..61393f5 100644 --- a/persontracking/lidar_tracker_pb2.py +++ b/persontracking/lidar_tracker_pb2.py @@ -1,6 +1,5 @@ -# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# source: lidar_tracker.proto +# source: persontracking/lidar_tracker.proto import sys _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) @@ -16,11 +15,11 @@ _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor.FileDescriptor( - name='lidar_tracker.proto', + name='persontracking/lidar_tracker.proto', package='persontracking', syntax='proto3', serialized_options=_b('\n\031com.example.carcontrollerB\021MotorServiceProtoP\001'), - serialized_pb=_b('\n\x13lidar_tracker.proto\x12\x0epersontracking\"\x1b\n\nInt32Value\x12\r\n\x05value\x18\x01 \x01(\x05\"\x07\n\x05\x45mpty\">\n\x05Point\x12\r\n\x05\x61ngle\x18\x01 \x01(\x01\x12\x10\n\x08\x64istance\x18\x02 \x01(\x05\x12\x14\n\x0cgroup_number\x18\x03 \x01(\x05\"2\n\tPointScan\x12%\n\x06points\x18\x01 \x03(\x0b\x32\x15.persontracking.Point2\xe1\x01\n\x0ePersonTracking\x12I\n\x12set_tracking_group\x12\x1a.persontracking.Int32Value\x1a\x15.persontracking.Empty\"\x00\x12?\n\rstop_tracking\x12\x15.persontracking.Empty\x1a\x15.persontracking.Empty\"\x00\x12\x43\n\rget_scan_data\x12\x15.persontracking.Empty\x1a\x19.persontracking.PointScan\"\x00\x42\x30\n\x19\x63om.example.carcontrollerB\x11MotorServiceProtoP\x01\x62\x06proto3') + serialized_pb=_b('\n\"persontracking/lidar_tracker.proto\x12\x0epersontracking\"\x1b\n\nInt32Value\x12\r\n\x05value\x18\x01 \x01(\x05\"\x07\n\x05\x45mpty\">\n\x05Point\x12\r\n\x05\x61ngle\x18\x01 \x01(\x01\x12\x10\n\x08\x64istance\x18\x02 \x01(\x05\x12\x14\n\x0cgroup_number\x18\x03 \x01(\x05\"2\n\tPointScan\x12%\n\x06points\x18\x01 \x03(\x0b\x32\x15.persontracking.Point2\xe3\x01\n\x0ePersonTracking\x12I\n\x12set_tracking_group\x12\x1a.persontracking.Int32Value\x1a\x15.persontracking.Empty\"\x00\x12?\n\rstop_tracking\x12\x15.persontracking.Empty\x1a\x15.persontracking.Empty\"\x00\x12\x45\n\x0estart_tracking\x12\x1a.persontracking.Int32Value\x1a\x15.persontracking.Empty\"\x00\x42\x30\n\x19\x63om.example.carcontrollerB\x11MotorServiceProtoP\x01\x62\x06proto3') ) @@ -52,8 +51,8 @@ _INT32VALUE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=39, - serialized_end=66, + serialized_start=54, + serialized_end=81, ) @@ -76,8 +75,8 @@ _EMPTY = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=68, - serialized_end=75, + serialized_start=83, + serialized_end=90, ) @@ -121,8 +120,8 @@ _POINT = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=77, - serialized_end=139, + serialized_start=92, + serialized_end=154, ) @@ -152,8 +151,8 @@ _POINTSCAN = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=141, - serialized_end=191, + serialized_start=156, + serialized_end=206, ) _POINTSCAN.fields_by_name['points'].message_type = _POINT @@ -163,32 +162,32 @@ DESCRIPTOR.message_types_by_name['Point'] = _POINT DESCRIPTOR.message_types_by_name['PointScan'] = _POINTSCAN _sym_db.RegisterFileDescriptor(DESCRIPTOR) -Int32Value = _reflection.GeneratedProtocolMessageType('Int32Value', (_message.Message,), { - 'DESCRIPTOR' : _INT32VALUE, - '__module__' : 'lidar_tracker_pb2' +Int32Value = _reflection.GeneratedProtocolMessageType('Int32Value', (_message.Message,), dict( + DESCRIPTOR = _INT32VALUE, + __module__ = 'persontracking.lidar_tracker_pb2' # @@protoc_insertion_point(class_scope:persontracking.Int32Value) - }) + )) _sym_db.RegisterMessage(Int32Value) -Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), { - 'DESCRIPTOR' : _EMPTY, - '__module__' : 'lidar_tracker_pb2' +Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), dict( + DESCRIPTOR = _EMPTY, + __module__ = 'persontracking.lidar_tracker_pb2' # @@protoc_insertion_point(class_scope:persontracking.Empty) - }) + )) _sym_db.RegisterMessage(Empty) -Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), { - 'DESCRIPTOR' : _POINT, - '__module__' : 'lidar_tracker_pb2' +Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), dict( + DESCRIPTOR = _POINT, + __module__ = 'persontracking.lidar_tracker_pb2' # @@protoc_insertion_point(class_scope:persontracking.Point) - }) + )) _sym_db.RegisterMessage(Point) -PointScan = _reflection.GeneratedProtocolMessageType('PointScan', (_message.Message,), { - 'DESCRIPTOR' : _POINTSCAN, - '__module__' : 'lidar_tracker_pb2' +PointScan = _reflection.GeneratedProtocolMessageType('PointScan', (_message.Message,), dict( + DESCRIPTOR = _POINTSCAN, + __module__ = 'persontracking.lidar_tracker_pb2' # @@protoc_insertion_point(class_scope:persontracking.PointScan) - }) + )) _sym_db.RegisterMessage(PointScan) @@ -200,8 +199,8 @@ _PERSONTRACKING = _descriptor.ServiceDescriptor( file=DESCRIPTOR, index=0, serialized_options=None, - serialized_start=194, - serialized_end=419, + serialized_start=209, + serialized_end=436, methods=[ _descriptor.MethodDescriptor( name='set_tracking_group', @@ -222,12 +221,12 @@ _PERSONTRACKING = _descriptor.ServiceDescriptor( serialized_options=None, ), _descriptor.MethodDescriptor( - name='get_scan_data', - full_name='persontracking.PersonTracking.get_scan_data', + name='start_tracking', + full_name='persontracking.PersonTracking.start_tracking', index=2, containing_service=None, - input_type=_EMPTY, - output_type=_POINTSCAN, + input_type=_INT32VALUE, + output_type=_EMPTY, serialized_options=None, ), ]) diff --git a/persontracking/lidar_tracker_pb2_grpc.py b/persontracking/lidar_tracker_pb2_grpc.py index e614942..187f25f 100644 --- a/persontracking/lidar_tracker_pb2_grpc.py +++ b/persontracking/lidar_tracker_pb2_grpc.py @@ -1,7 +1,7 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! import grpc -import lidar_tracker_pb2 as lidar__tracker__pb2 +from persontracking import lidar_tracker_pb2 as persontracking_dot_lidar__tracker__pb2 class PersonTrackingStub(object): @@ -16,18 +16,18 @@ class PersonTrackingStub(object): """ self.set_tracking_group = channel.unary_unary( '/persontracking.PersonTracking/set_tracking_group', - request_serializer=lidar__tracker__pb2.Int32Value.SerializeToString, - response_deserializer=lidar__tracker__pb2.Empty.FromString, + request_serializer=persontracking_dot_lidar__tracker__pb2.Int32Value.SerializeToString, + response_deserializer=persontracking_dot_lidar__tracker__pb2.Empty.FromString, ) self.stop_tracking = channel.unary_unary( '/persontracking.PersonTracking/stop_tracking', - request_serializer=lidar__tracker__pb2.Empty.SerializeToString, - response_deserializer=lidar__tracker__pb2.Empty.FromString, + request_serializer=persontracking_dot_lidar__tracker__pb2.Empty.SerializeToString, + response_deserializer=persontracking_dot_lidar__tracker__pb2.Empty.FromString, ) - self.get_scan_data = channel.unary_unary( - '/persontracking.PersonTracking/get_scan_data', - request_serializer=lidar__tracker__pb2.Empty.SerializeToString, - response_deserializer=lidar__tracker__pb2.PointScan.FromString, + self.start_tracking = channel.unary_unary( + '/persontracking.PersonTracking/start_tracking', + request_serializer=persontracking_dot_lidar__tracker__pb2.Int32Value.SerializeToString, + response_deserializer=persontracking_dot_lidar__tracker__pb2.Empty.FromString, ) @@ -49,7 +49,7 @@ class PersonTrackingServicer(object): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def get_scan_data(self, request, context): + def start_tracking(self, request, context): # missing associated documentation comment in .proto file pass context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -61,18 +61,18 @@ def add_PersonTrackingServicer_to_server(servicer, server): rpc_method_handlers = { 'set_tracking_group': grpc.unary_unary_rpc_method_handler( servicer.set_tracking_group, - request_deserializer=lidar__tracker__pb2.Int32Value.FromString, - response_serializer=lidar__tracker__pb2.Empty.SerializeToString, + request_deserializer=persontracking_dot_lidar__tracker__pb2.Int32Value.FromString, + response_serializer=persontracking_dot_lidar__tracker__pb2.Empty.SerializeToString, ), 'stop_tracking': grpc.unary_unary_rpc_method_handler( servicer.stop_tracking, - request_deserializer=lidar__tracker__pb2.Empty.FromString, - response_serializer=lidar__tracker__pb2.Empty.SerializeToString, + request_deserializer=persontracking_dot_lidar__tracker__pb2.Empty.FromString, + response_serializer=persontracking_dot_lidar__tracker__pb2.Empty.SerializeToString, ), - 'get_scan_data': grpc.unary_unary_rpc_method_handler( - servicer.get_scan_data, - request_deserializer=lidar__tracker__pb2.Empty.FromString, - response_serializer=lidar__tracker__pb2.PointScan.SerializeToString, + 'start_tracking': grpc.unary_unary_rpc_method_handler( + servicer.start_tracking, + request_deserializer=persontracking_dot_lidar__tracker__pb2.Int32Value.FromString, + response_serializer=persontracking_dot_lidar__tracker__pb2.Empty.SerializeToString, ), } generic_handler = grpc.method_handlers_generic_handler( diff --git a/persontracking/protos/lidar_tracker.proto b/persontracking/protos/persontracking/lidar_tracker.proto similarity index 77% rename from persontracking/protos/lidar_tracker.proto rename to persontracking/protos/persontracking/lidar_tracker.proto index 7a0829c..03d3803 100644 --- a/persontracking/protos/lidar_tracker.proto +++ b/persontracking/protos/persontracking/lidar_tracker.proto @@ -24,16 +24,10 @@ message PointScan{ repeated Point points = 1; } -message TrackingInfo{ - int32 port = 1; -} - service PersonTracking{ rpc set_tracking_group(Int32Value) returns (Empty) {} rpc stop_tracking(Empty) returns (Empty) {} - rpc get_scan_data(Empty) returns (PointScan) {} - - rpc start_tracking(TrackingInfo) returns (Empty) {} + rpc start_tracking(Int32Value) returns (Empty) {} } \ No newline at end of file