From 685f2ad35b819a3bb7fd0be0cd3a41bcbcc7517d Mon Sep 17 00:00:00 2001 From: michaelpivato Date: Mon, 30 Mar 2020 12:32:31 +1030 Subject: [PATCH] Use change listener rather than direct message factory for lidar. --- tracking/lidar_cache.py | 12 +++++------- tracking/lidar_servicer.py | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tracking/lidar_cache.py b/tracking/lidar_cache.py index 8ecc4f7..fd94253 100644 --- a/tracking/lidar_cache.py +++ b/tracking/lidar_cache.py @@ -2,7 +2,6 @@ from threading import Thread from tracking import algorithms import tracking.lidar_tracker_pb2 as tracker_pb import zmq -import messaging.messages as messages class LidarCache(): @@ -25,17 +24,17 @@ class LidarCache(): self.thread = Thread(target=self.do_scanning, args=[sender]) self.thread.start() - def do_scanning(self, sender): + def do_scanning(self, listener): """Performs scans whilst cache is running, and will pass calculated groups data to the sender. Parameters ---------- - sender: - Any class given in messaging.message_factory. This acts as a listener. + listener: + Any object that includes the onGroupsChanged method. """ # Create the 0MQ socket first. This should not be passed between threads. - self._mFactory = sender + self._mFactory = listener # Batch over scans, so we don't need to do our own batching to determine groups # TODO: Implement custom batching, as iter_scans can be unreliable @@ -66,8 +65,7 @@ class LidarCache(): pointScan.points.append(tracker_pb.Point( angle=point[1], distance=point[2], group_number=group.number)) - self._mFactory.send_message_topic( - "lidar_map", messages.ProtoMessage(message=pointScan.SerializeToString())) + self._mFactory.onGroupsChanged(pointScan) def stop_scanning(self): self.run = False diff --git a/tracking/lidar_servicer.py b/tracking/lidar_servicer.py index 78f5836..44debbb 100644 --- a/tracking/lidar_servicer.py +++ b/tracking/lidar_servicer.py @@ -4,12 +4,16 @@ from tracking.lidar_cache import LidarCache from multiprocessing import Process import messaging.message_factory as mf from rplidar import RPLidar +from Messaging import messages + class LidarServicer(PersonTrackingServicer): def __init__(self): - #TODO: Put the rplidar creation in a factory or something, to make it possible to test this servicer. + # TODO: Put the rplidar creation in a factory or something, to make it possible to test this servicer. self.cache = LidarCache(RPLidar('/dev/ttyUSB0'), measurements=100) + self._mFactory = None + self._port = None def set_tracking_group(self, request, context): pass @@ -19,4 +23,11 @@ class LidarServicer(PersonTrackingServicer): def start_tracking(self, request, context): """Starts the lidar cache, streaming on the provided port.""" - self.cache.start_cache(mf.getZmqPubSubStreamer(request.value)) + self._port = request.value + self.cache.start_cache(self) + + def onGroupsChanged(self, message): + if self._mFactory is None: + # Create the zmq socket in the thread that it will be used, just to be safe. + self._mFactory = mf.getZmqPubSubStreamer(self._port) + self._mFactory.send_message_topic("lidar_map", messages.ProtoMessage(message=message.SerializeToString()))