From 4d511ca91b5c7fe5ae3b83496150de20350ac73a Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 24 May 2020 22:48:13 +0930 Subject: [PATCH 01/24] Add some running code for lidar cache, test stubs, fix proto. --- car/src/car/tracking/algorithms.py | 2 +- car/src/car/tracking/lidar_cache.py | 15 +++++++-- car/src/car/tracking/lidar_servicer.py | 2 +- car/tests/test_algorithms.py | 33 +++++++++++++++++++ car/tests/test_lidar_cache.py | 10 ++++++ .../proto/car/tracking/lidar_tracker.proto | 2 +- 6 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 car/tests/test_algorithms.py create mode 100644 car/tests/test_lidar_cache.py diff --git a/car/src/car/tracking/algorithms.py b/car/src/car/tracking/algorithms.py index f61741c..8f4df7a 100644 --- a/car/src/car/tracking/algorithms.py +++ b/car/src/car/tracking/algorithms.py @@ -28,7 +28,7 @@ class Group: def _update_min_max(self, new_point): """ - Updates the in and max points for this group. + Updates the min and max points for this group. This is to determine when assigning groups whether the same group is selected. """ diff --git a/car/src/car/tracking/lidar_cache.py b/car/src/car/tracking/lidar_cache.py index 40eb789..f7551b3 100644 --- a/car/src/car/tracking/lidar_cache.py +++ b/car/src/car/tracking/lidar_cache.py @@ -2,6 +2,9 @@ from threading import Thread from car.tracking import algorithms import car.tracking.lidar_tracker_pb2 as tracker_pb import zmq +from car.tracking.devices.mock_lidar import MockLidar +import car.tracking.lidar_loader as lidar_loader +import time class LidarCache(): @@ -65,7 +68,7 @@ class LidarCache(): angle=point[1], distance=point[2], group_number=group.number)) for listener in self._group_listeners: - listener.onGroupsChanged(pointScan) + listener(pointScan) def add_groups_changed_listener(self, listener): """ @@ -76,9 +79,17 @@ class LidarCache(): Parameters ---------- listener - An object that implements the onGroupsChanged(message) method. + An function that takes a PointScan proto object as its argument. """ self._group_listeners.append(listener) def stop_scanning(self): self.run = False + +if __name__ == '__main__': + lidar = MockLidar(iter(lidar_loader.load_scans_bytes_file('car/src/car/tracking/out.pickle'))) + cache = LidarCache(lidar) + cache.add_groups_changed_listener(lambda a : print(a)) + cache.start_cache() + time.sleep(1) + cache.stop_scanning() diff --git a/car/src/car/tracking/lidar_servicer.py b/car/src/car/tracking/lidar_servicer.py index 9038428..bb41106 100644 --- a/car/src/car/tracking/lidar_servicer.py +++ b/car/src/car/tracking/lidar_servicer.py @@ -18,7 +18,7 @@ class LidarServicer(PersonTrackingServicer): self._lidar = RecordingLidarDecorator( lidar_factory.get_lidar()) self.cache = LidarCache(self._lidar, measurements=100) - self.cache.add_groups_changed_listener(self) + self.cache.add_groups_changed_listener(self.onGroupsChanged) self._mFactory = None self._port = 50052 if 'CAR_ZMQ_PORT' not in os.environ else os.environ[ 'CAR_ZMQ_PORT'] diff --git a/car/tests/test_algorithms.py b/car/tests/test_algorithms.py new file mode 100644 index 0000000..0cf697a --- /dev/null +++ b/car/tests/test_algorithms.py @@ -0,0 +1,33 @@ +import unittest +import car.tracking as tracking +from car.tracking.devices.mock_lidar import MockLidar +import car.tracking.lidar_loader as loader + +class TestAlgorithms(unittest.TestCase): + + def setUp(self): + self.lidar = MockLidar(iter(loader.get_scans('../src/car/tracking/out.pickle'))) + + def test_find_centre(self): + # e.g. + #self.assertEqual + pass + + def test_convert_lidar_cartesian(self): + pass + + def test_convert_cartesian_lidar(self): + pass + + def test_calc_groups_runs(self): + pass + + def test_group_changing(self): + pass + + def tearDown(self): + pass + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/car/tests/test_lidar_cache.py b/car/tests/test_lidar_cache.py new file mode 100644 index 0000000..7e782b8 --- /dev/null +++ b/car/tests/test_lidar_cache.py @@ -0,0 +1,10 @@ +import unittest +import car.tracking as tracking + +class TestLidarCache(unittest.TestCase): + + def test_fake_scanner(self): + pass + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/protobuf/src/main/proto/car/tracking/lidar_tracker.proto b/protobuf/src/main/proto/car/tracking/lidar_tracker.proto index b988413..860211f 100644 --- a/protobuf/src/main/proto/car/tracking/lidar_tracker.proto +++ b/protobuf/src/main/proto/car/tracking/lidar_tracker.proto @@ -16,7 +16,7 @@ message Int32Value{ message Point{ double angle = 1; - int32 distance = 2; + double distance = 2; int32 group_number = 3; } From 81e3fcb9dbe31cd787a7bb0d77dcce9782bd1286 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Wed, 27 May 2020 18:18:14 +0930 Subject: [PATCH 02/24] Clean up lidar device setting to only use one environment variable --- car/src/car/tracking/devices/factory.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/car/src/car/tracking/devices/factory.py b/car/src/car/tracking/devices/factory.py index fd17874..527a6b5 100644 --- a/car/src/car/tracking/devices/factory.py +++ b/car/src/car/tracking/devices/factory.py @@ -3,10 +3,9 @@ from .. import lidar_loader as loader import os MOCK_DEVICE = "LIDAR_MOCK" -RPLIDAR = "LIDAR_RPLIDAR" -def get_lidar(device=None, connection='/dev/ttyUSB0'): +def get_lidar(device=None): actual_device = None try: actual_device = device if device is not None else os.environ["CAR_LIDAR"] @@ -15,16 +14,13 @@ def get_lidar(device=None, connection='/dev/ttyUSB0'): 'No lidar device specified and the CAR_LIDAR environment variable is not set.') if actual_device == MOCK_DEVICE: return MockLidar(loader.load_scans_bytes_file("car/src/car/tracking/out.pickle")) - elif actual_device == RPLIDAR: + elif actual_device != '': try: - # TODO: Cleanup connection setting, probably don't need to pass it into the method. from rplidar import RPLidar - if "LIDAR_DEVICE" in os.environ: - return RPLidar(os.environ['LIDAR_DEVICE']) - return RPLidar(connection) + return RPLidar(device) except ImportError: print('Could not import RPLidar. Have you downloaded rplidar?') else: - print('No valid lidar device found. Please choose one of ' + - MOCK_DEVICE + ' or ' + RPLIDAR) + print('No valid lidar device found. Please choose ' + + MOCK_DEVICE + ' or a dn address for the lidar device.') return None From 674437d54386241370188a353d79e5ecb5f8fbd2 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Fri, 29 May 2020 21:42:05 +0930 Subject: [PATCH 03/24] Fix up old slam dependency on generated empty pb file --- car/src/car/slam/slam_servicer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/car/src/car/slam/slam_servicer.py b/car/src/car/slam/slam_servicer.py index d4843be..fe53411 100644 --- a/car/src/car/slam/slam_servicer.py +++ b/car/src/car/slam/slam_servicer.py @@ -1,6 +1,6 @@ import car.slam.SlamController_pb2_grpc as grpc import car.slam.SlamController_pb2 as proto -import car.empty_pb2 as empty +import google.protobuf.empty_pb2 as empty import car.slam.slam_streamer as slam from .slam_processor import SlamProcessor From 0bd92e731fedf07fda9cce24ce643048a18459a7 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 29 May 2020 21:46:07 +0930 Subject: [PATCH 04/24] Move car to pycar, fixes linux issue with vscode picking up wrong module. --- .../DecisionSystem/CentralisedDecision/__init__.py | 0 .../CentralisedDecision/ballotvoter.py | 0 .../CentralisedDecision/cameraserver.py | 0 .../CentralisedDecision/central_server.py | 0 .../CentralisedDecision/centralisedinstance.py | 0 .../DecisionSystem/CentralisedDecision/commander.py | 0 .../DecisionSystem/CentralisedDecision/messenger.py | 0 .../DecisionSystem/CentralisedDecision/videoget.py | 0 .../DecentralisedActivityFusion/voter.py | 0 car/src/{car => pycar}/DecisionSystem/__init__.py | 0 car/src/{car => pycar}/DecisionSystem/messages.py | 0 .../{car => pycar}/GestureRecognition/HandRecHSV.py | 0 .../{car => pycar}/GestureRecognition/HandRecV2.py | 0 .../{car => pycar}/GestureRecognition/IMG_0818.png | Bin .../{car => pycar}/GestureRecognition/IMG_0825.jpg | Bin .../Neural Network hand Tracking.pdf | Bin .../GestureRecognition/SimpleHandRecogniser.py | 0 .../{car => pycar}/GestureRecognition/__init__.py | 0 .../GestureRecognition/frozen_inference_graph.pb | Bin .../{car => pycar}/GestureRecognition/graph.pbtxt | 0 .../GestureRecognition/handrecogniser.py | 0 .../GestureRecognition/kaleidoscope.py | 0 .../{car => pycar}/GestureRecognition/keras_ex.py | 0 .../GestureRecognition/opencvtensorflowex.py | 0 .../{car => pycar}/GestureRecognition/starkaleid.py | 0 car/src/{car/Messaging => pycar}/__init__.py | 0 car/src/{car => pycar}/__main__.py | 0 .../control/PythonRemoteController.py | 0 car/src/{car => pycar/control}/__init__.py | 0 .../{car/control => pycar/control/gpio}/__init__.py | 0 car/src/{car => pycar}/control/gpio/factory.py | 0 car/src/{car => pycar}/control/gpio/mockvehicle.py | 0 .../control/gpio/recording_vehicle_decorator.py | 0 car/src/{car => pycar}/control/gpio/vehicle.py | 0 car/src/{car => pycar}/control/motor_servicer.py | 0 car/src/{car => pycar}/controller.py | 0 .../control/gpio => pycar/messaging}/__init__.py | 0 .../messaging}/message_factory.py | 0 .../{car/Messaging => pycar/messaging}/messages.py | 0 .../Messaging => pycar/messaging}/mqttsession.py | 0 car/src/{car => pycar}/slam/__init__.py | 0 car/src/{car => pycar}/slam/slam_processor.py | 0 car/src/{car => pycar}/slam/slam_servicer.py | 0 car/src/{car => pycar}/slam/slam_streamer.py | 0 .../{car => pycar}/slam/zmq_pair_testing/pair.py | 0 car/src/{car => pycar}/tracking/__init__.py | 0 car/src/{car => pycar}/tracking/algorithms.py | 0 car/src/{car => pycar}/tracking/all_scans.txt | Bin car/src/{car => pycar}/tracking/animate.py | 0 car/src/{car => pycar}/tracking/animate_alg.py | 0 car/src/{car => pycar}/tracking/devices/__init__.py | 0 car/src/{car => pycar}/tracking/devices/factory.py | 0 .../{car => pycar}/tracking/devices/mock_lidar.py | 0 .../tracking/devices/recording_lidar.py | 0 car/src/{car => pycar}/tracking/lidar_cache.py | 0 car/src/{car => pycar}/tracking/lidar_loader.py | 0 car/src/{car => pycar}/tracking/lidar_servicer.py | 0 car/src/{car => pycar}/tracking/lidar_tester.py | 0 car/src/{car => pycar}/tracking/out.pickle | Bin car/src/{car => pycar}/tracking/readme.txt | 0 60 files changed, 0 insertions(+), 0 deletions(-) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/__init__.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/ballotvoter.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/cameraserver.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/central_server.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/centralisedinstance.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/commander.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/messenger.py (100%) rename car/src/{car => pycar}/DecisionSystem/CentralisedDecision/videoget.py (100%) rename car/src/{car => pycar}/DecisionSystem/DecentralisedActivityFusion/voter.py (100%) rename car/src/{car => pycar}/DecisionSystem/__init__.py (100%) rename car/src/{car => pycar}/DecisionSystem/messages.py (100%) rename car/src/{car => pycar}/GestureRecognition/HandRecHSV.py (100%) rename car/src/{car => pycar}/GestureRecognition/HandRecV2.py (100%) rename car/src/{car => pycar}/GestureRecognition/IMG_0818.png (100%) rename car/src/{car => pycar}/GestureRecognition/IMG_0825.jpg (100%) rename car/src/{car => pycar}/GestureRecognition/Neural Network hand Tracking.pdf (100%) rename car/src/{car => pycar}/GestureRecognition/SimpleHandRecogniser.py (100%) rename car/src/{car => pycar}/GestureRecognition/__init__.py (100%) rename car/src/{car => pycar}/GestureRecognition/frozen_inference_graph.pb (100%) rename car/src/{car => pycar}/GestureRecognition/graph.pbtxt (100%) rename car/src/{car => pycar}/GestureRecognition/handrecogniser.py (100%) rename car/src/{car => pycar}/GestureRecognition/kaleidoscope.py (100%) rename car/src/{car => pycar}/GestureRecognition/keras_ex.py (100%) rename car/src/{car => pycar}/GestureRecognition/opencvtensorflowex.py (100%) rename car/src/{car => pycar}/GestureRecognition/starkaleid.py (100%) rename car/src/{car/Messaging => pycar}/__init__.py (100%) rename car/src/{car => pycar}/__main__.py (100%) rename car/src/{car => pycar}/control/PythonRemoteController.py (100%) rename car/src/{car => pycar/control}/__init__.py (100%) rename car/src/{car/control => pycar/control/gpio}/__init__.py (100%) rename car/src/{car => pycar}/control/gpio/factory.py (100%) rename car/src/{car => pycar}/control/gpio/mockvehicle.py (100%) rename car/src/{car => pycar}/control/gpio/recording_vehicle_decorator.py (100%) rename car/src/{car => pycar}/control/gpio/vehicle.py (100%) rename car/src/{car => pycar}/control/motor_servicer.py (100%) rename car/src/{car => pycar}/controller.py (100%) rename car/src/{car/control/gpio => pycar/messaging}/__init__.py (100%) rename car/src/{car/Messaging => pycar/messaging}/message_factory.py (100%) rename car/src/{car/Messaging => pycar/messaging}/messages.py (100%) rename car/src/{car/Messaging => pycar/messaging}/mqttsession.py (100%) rename car/src/{car => pycar}/slam/__init__.py (100%) rename car/src/{car => pycar}/slam/slam_processor.py (100%) rename car/src/{car => pycar}/slam/slam_servicer.py (100%) rename car/src/{car => pycar}/slam/slam_streamer.py (100%) rename car/src/{car => pycar}/slam/zmq_pair_testing/pair.py (100%) rename car/src/{car => pycar}/tracking/__init__.py (100%) rename car/src/{car => pycar}/tracking/algorithms.py (100%) rename car/src/{car => pycar}/tracking/all_scans.txt (100%) rename car/src/{car => pycar}/tracking/animate.py (100%) rename car/src/{car => pycar}/tracking/animate_alg.py (100%) rename car/src/{car => pycar}/tracking/devices/__init__.py (100%) rename car/src/{car => pycar}/tracking/devices/factory.py (100%) rename car/src/{car => pycar}/tracking/devices/mock_lidar.py (100%) rename car/src/{car => pycar}/tracking/devices/recording_lidar.py (100%) rename car/src/{car => pycar}/tracking/lidar_cache.py (100%) rename car/src/{car => pycar}/tracking/lidar_loader.py (100%) rename car/src/{car => pycar}/tracking/lidar_servicer.py (100%) rename car/src/{car => pycar}/tracking/lidar_tester.py (100%) rename car/src/{car => pycar}/tracking/out.pickle (100%) rename car/src/{car => pycar}/tracking/readme.txt (100%) diff --git a/car/src/car/DecisionSystem/CentralisedDecision/__init__.py b/car/src/pycar/DecisionSystem/CentralisedDecision/__init__.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/__init__.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/__init__.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/ballotvoter.py b/car/src/pycar/DecisionSystem/CentralisedDecision/ballotvoter.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/ballotvoter.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/ballotvoter.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/cameraserver.py b/car/src/pycar/DecisionSystem/CentralisedDecision/cameraserver.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/cameraserver.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/cameraserver.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/central_server.py b/car/src/pycar/DecisionSystem/CentralisedDecision/central_server.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/central_server.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/central_server.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/centralisedinstance.py b/car/src/pycar/DecisionSystem/CentralisedDecision/centralisedinstance.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/centralisedinstance.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/centralisedinstance.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/commander.py b/car/src/pycar/DecisionSystem/CentralisedDecision/commander.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/commander.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/commander.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/messenger.py b/car/src/pycar/DecisionSystem/CentralisedDecision/messenger.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/messenger.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/messenger.py diff --git a/car/src/car/DecisionSystem/CentralisedDecision/videoget.py b/car/src/pycar/DecisionSystem/CentralisedDecision/videoget.py similarity index 100% rename from car/src/car/DecisionSystem/CentralisedDecision/videoget.py rename to car/src/pycar/DecisionSystem/CentralisedDecision/videoget.py diff --git a/car/src/car/DecisionSystem/DecentralisedActivityFusion/voter.py b/car/src/pycar/DecisionSystem/DecentralisedActivityFusion/voter.py similarity index 100% rename from car/src/car/DecisionSystem/DecentralisedActivityFusion/voter.py rename to car/src/pycar/DecisionSystem/DecentralisedActivityFusion/voter.py diff --git a/car/src/car/DecisionSystem/__init__.py b/car/src/pycar/DecisionSystem/__init__.py similarity index 100% rename from car/src/car/DecisionSystem/__init__.py rename to car/src/pycar/DecisionSystem/__init__.py diff --git a/car/src/car/DecisionSystem/messages.py b/car/src/pycar/DecisionSystem/messages.py similarity index 100% rename from car/src/car/DecisionSystem/messages.py rename to car/src/pycar/DecisionSystem/messages.py diff --git a/car/src/car/GestureRecognition/HandRecHSV.py b/car/src/pycar/GestureRecognition/HandRecHSV.py similarity index 100% rename from car/src/car/GestureRecognition/HandRecHSV.py rename to car/src/pycar/GestureRecognition/HandRecHSV.py diff --git a/car/src/car/GestureRecognition/HandRecV2.py b/car/src/pycar/GestureRecognition/HandRecV2.py similarity index 100% rename from car/src/car/GestureRecognition/HandRecV2.py rename to car/src/pycar/GestureRecognition/HandRecV2.py diff --git a/car/src/car/GestureRecognition/IMG_0818.png b/car/src/pycar/GestureRecognition/IMG_0818.png similarity index 100% rename from car/src/car/GestureRecognition/IMG_0818.png rename to car/src/pycar/GestureRecognition/IMG_0818.png diff --git a/car/src/car/GestureRecognition/IMG_0825.jpg b/car/src/pycar/GestureRecognition/IMG_0825.jpg similarity index 100% rename from car/src/car/GestureRecognition/IMG_0825.jpg rename to car/src/pycar/GestureRecognition/IMG_0825.jpg diff --git a/car/src/car/GestureRecognition/Neural Network hand Tracking.pdf b/car/src/pycar/GestureRecognition/Neural Network hand Tracking.pdf similarity index 100% rename from car/src/car/GestureRecognition/Neural Network hand Tracking.pdf rename to car/src/pycar/GestureRecognition/Neural Network hand Tracking.pdf diff --git a/car/src/car/GestureRecognition/SimpleHandRecogniser.py b/car/src/pycar/GestureRecognition/SimpleHandRecogniser.py similarity index 100% rename from car/src/car/GestureRecognition/SimpleHandRecogniser.py rename to car/src/pycar/GestureRecognition/SimpleHandRecogniser.py diff --git a/car/src/car/GestureRecognition/__init__.py b/car/src/pycar/GestureRecognition/__init__.py similarity index 100% rename from car/src/car/GestureRecognition/__init__.py rename to car/src/pycar/GestureRecognition/__init__.py diff --git a/car/src/car/GestureRecognition/frozen_inference_graph.pb b/car/src/pycar/GestureRecognition/frozen_inference_graph.pb similarity index 100% rename from car/src/car/GestureRecognition/frozen_inference_graph.pb rename to car/src/pycar/GestureRecognition/frozen_inference_graph.pb diff --git a/car/src/car/GestureRecognition/graph.pbtxt b/car/src/pycar/GestureRecognition/graph.pbtxt similarity index 100% rename from car/src/car/GestureRecognition/graph.pbtxt rename to car/src/pycar/GestureRecognition/graph.pbtxt diff --git a/car/src/car/GestureRecognition/handrecogniser.py b/car/src/pycar/GestureRecognition/handrecogniser.py similarity index 100% rename from car/src/car/GestureRecognition/handrecogniser.py rename to car/src/pycar/GestureRecognition/handrecogniser.py diff --git a/car/src/car/GestureRecognition/kaleidoscope.py b/car/src/pycar/GestureRecognition/kaleidoscope.py similarity index 100% rename from car/src/car/GestureRecognition/kaleidoscope.py rename to car/src/pycar/GestureRecognition/kaleidoscope.py diff --git a/car/src/car/GestureRecognition/keras_ex.py b/car/src/pycar/GestureRecognition/keras_ex.py similarity index 100% rename from car/src/car/GestureRecognition/keras_ex.py rename to car/src/pycar/GestureRecognition/keras_ex.py diff --git a/car/src/car/GestureRecognition/opencvtensorflowex.py b/car/src/pycar/GestureRecognition/opencvtensorflowex.py similarity index 100% rename from car/src/car/GestureRecognition/opencvtensorflowex.py rename to car/src/pycar/GestureRecognition/opencvtensorflowex.py diff --git a/car/src/car/GestureRecognition/starkaleid.py b/car/src/pycar/GestureRecognition/starkaleid.py similarity index 100% rename from car/src/car/GestureRecognition/starkaleid.py rename to car/src/pycar/GestureRecognition/starkaleid.py diff --git a/car/src/car/Messaging/__init__.py b/car/src/pycar/__init__.py similarity index 100% rename from car/src/car/Messaging/__init__.py rename to car/src/pycar/__init__.py diff --git a/car/src/car/__main__.py b/car/src/pycar/__main__.py similarity index 100% rename from car/src/car/__main__.py rename to car/src/pycar/__main__.py diff --git a/car/src/car/control/PythonRemoteController.py b/car/src/pycar/control/PythonRemoteController.py similarity index 100% rename from car/src/car/control/PythonRemoteController.py rename to car/src/pycar/control/PythonRemoteController.py diff --git a/car/src/car/__init__.py b/car/src/pycar/control/__init__.py similarity index 100% rename from car/src/car/__init__.py rename to car/src/pycar/control/__init__.py diff --git a/car/src/car/control/__init__.py b/car/src/pycar/control/gpio/__init__.py similarity index 100% rename from car/src/car/control/__init__.py rename to car/src/pycar/control/gpio/__init__.py diff --git a/car/src/car/control/gpio/factory.py b/car/src/pycar/control/gpio/factory.py similarity index 100% rename from car/src/car/control/gpio/factory.py rename to car/src/pycar/control/gpio/factory.py diff --git a/car/src/car/control/gpio/mockvehicle.py b/car/src/pycar/control/gpio/mockvehicle.py similarity index 100% rename from car/src/car/control/gpio/mockvehicle.py rename to car/src/pycar/control/gpio/mockvehicle.py diff --git a/car/src/car/control/gpio/recording_vehicle_decorator.py b/car/src/pycar/control/gpio/recording_vehicle_decorator.py similarity index 100% rename from car/src/car/control/gpio/recording_vehicle_decorator.py rename to car/src/pycar/control/gpio/recording_vehicle_decorator.py diff --git a/car/src/car/control/gpio/vehicle.py b/car/src/pycar/control/gpio/vehicle.py similarity index 100% rename from car/src/car/control/gpio/vehicle.py rename to car/src/pycar/control/gpio/vehicle.py diff --git a/car/src/car/control/motor_servicer.py b/car/src/pycar/control/motor_servicer.py similarity index 100% rename from car/src/car/control/motor_servicer.py rename to car/src/pycar/control/motor_servicer.py diff --git a/car/src/car/controller.py b/car/src/pycar/controller.py similarity index 100% rename from car/src/car/controller.py rename to car/src/pycar/controller.py diff --git a/car/src/car/control/gpio/__init__.py b/car/src/pycar/messaging/__init__.py similarity index 100% rename from car/src/car/control/gpio/__init__.py rename to car/src/pycar/messaging/__init__.py diff --git a/car/src/car/Messaging/message_factory.py b/car/src/pycar/messaging/message_factory.py similarity index 100% rename from car/src/car/Messaging/message_factory.py rename to car/src/pycar/messaging/message_factory.py diff --git a/car/src/car/Messaging/messages.py b/car/src/pycar/messaging/messages.py similarity index 100% rename from car/src/car/Messaging/messages.py rename to car/src/pycar/messaging/messages.py diff --git a/car/src/car/Messaging/mqttsession.py b/car/src/pycar/messaging/mqttsession.py similarity index 100% rename from car/src/car/Messaging/mqttsession.py rename to car/src/pycar/messaging/mqttsession.py diff --git a/car/src/car/slam/__init__.py b/car/src/pycar/slam/__init__.py similarity index 100% rename from car/src/car/slam/__init__.py rename to car/src/pycar/slam/__init__.py diff --git a/car/src/car/slam/slam_processor.py b/car/src/pycar/slam/slam_processor.py similarity index 100% rename from car/src/car/slam/slam_processor.py rename to car/src/pycar/slam/slam_processor.py diff --git a/car/src/car/slam/slam_servicer.py b/car/src/pycar/slam/slam_servicer.py similarity index 100% rename from car/src/car/slam/slam_servicer.py rename to car/src/pycar/slam/slam_servicer.py diff --git a/car/src/car/slam/slam_streamer.py b/car/src/pycar/slam/slam_streamer.py similarity index 100% rename from car/src/car/slam/slam_streamer.py rename to car/src/pycar/slam/slam_streamer.py diff --git a/car/src/car/slam/zmq_pair_testing/pair.py b/car/src/pycar/slam/zmq_pair_testing/pair.py similarity index 100% rename from car/src/car/slam/zmq_pair_testing/pair.py rename to car/src/pycar/slam/zmq_pair_testing/pair.py diff --git a/car/src/car/tracking/__init__.py b/car/src/pycar/tracking/__init__.py similarity index 100% rename from car/src/car/tracking/__init__.py rename to car/src/pycar/tracking/__init__.py diff --git a/car/src/car/tracking/algorithms.py b/car/src/pycar/tracking/algorithms.py similarity index 100% rename from car/src/car/tracking/algorithms.py rename to car/src/pycar/tracking/algorithms.py diff --git a/car/src/car/tracking/all_scans.txt b/car/src/pycar/tracking/all_scans.txt similarity index 100% rename from car/src/car/tracking/all_scans.txt rename to car/src/pycar/tracking/all_scans.txt diff --git a/car/src/car/tracking/animate.py b/car/src/pycar/tracking/animate.py similarity index 100% rename from car/src/car/tracking/animate.py rename to car/src/pycar/tracking/animate.py diff --git a/car/src/car/tracking/animate_alg.py b/car/src/pycar/tracking/animate_alg.py similarity index 100% rename from car/src/car/tracking/animate_alg.py rename to car/src/pycar/tracking/animate_alg.py diff --git a/car/src/car/tracking/devices/__init__.py b/car/src/pycar/tracking/devices/__init__.py similarity index 100% rename from car/src/car/tracking/devices/__init__.py rename to car/src/pycar/tracking/devices/__init__.py diff --git a/car/src/car/tracking/devices/factory.py b/car/src/pycar/tracking/devices/factory.py similarity index 100% rename from car/src/car/tracking/devices/factory.py rename to car/src/pycar/tracking/devices/factory.py diff --git a/car/src/car/tracking/devices/mock_lidar.py b/car/src/pycar/tracking/devices/mock_lidar.py similarity index 100% rename from car/src/car/tracking/devices/mock_lidar.py rename to car/src/pycar/tracking/devices/mock_lidar.py diff --git a/car/src/car/tracking/devices/recording_lidar.py b/car/src/pycar/tracking/devices/recording_lidar.py similarity index 100% rename from car/src/car/tracking/devices/recording_lidar.py rename to car/src/pycar/tracking/devices/recording_lidar.py diff --git a/car/src/car/tracking/lidar_cache.py b/car/src/pycar/tracking/lidar_cache.py similarity index 100% rename from car/src/car/tracking/lidar_cache.py rename to car/src/pycar/tracking/lidar_cache.py diff --git a/car/src/car/tracking/lidar_loader.py b/car/src/pycar/tracking/lidar_loader.py similarity index 100% rename from car/src/car/tracking/lidar_loader.py rename to car/src/pycar/tracking/lidar_loader.py diff --git a/car/src/car/tracking/lidar_servicer.py b/car/src/pycar/tracking/lidar_servicer.py similarity index 100% rename from car/src/car/tracking/lidar_servicer.py rename to car/src/pycar/tracking/lidar_servicer.py diff --git a/car/src/car/tracking/lidar_tester.py b/car/src/pycar/tracking/lidar_tester.py similarity index 100% rename from car/src/car/tracking/lidar_tester.py rename to car/src/pycar/tracking/lidar_tester.py diff --git a/car/src/car/tracking/out.pickle b/car/src/pycar/tracking/out.pickle similarity index 100% rename from car/src/car/tracking/out.pickle rename to car/src/pycar/tracking/out.pickle diff --git a/car/src/car/tracking/readme.txt b/car/src/pycar/tracking/readme.txt similarity index 100% rename from car/src/car/tracking/readme.txt rename to car/src/pycar/tracking/readme.txt From 858cbcb2ff8cc52f05ae083e7645dcf9ebefe5e2 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 29 May 2020 21:50:46 +0930 Subject: [PATCH 05/24] Move root car to pycar, put other pycar back to car. --- car/MyRaft/raft_pb2.py | 296 ------------------ car/MyRaft/raft_pb2_grpc.py | 63 ---- car/car.iml | 28 -- {car => pycar}/.dockerignore | 0 {car => pycar}/Assets/ControllerSlideIcon.ai | 0 {car => pycar}/Assets/ControllerSlideIcon.svg | 0 .../Assets/ControllerSlideIconHorizontal.svg | 0 {car => pycar}/COCO-classes.txt | 0 {car => pycar}/Dockerfile | 0 .../MyRaft/Experiment/node1/config.json | 0 .../MyRaft/Experiment/node2/config.json | 0 .../MyRaft/Experiment/node3/config.json | 0 {car => pycar}/MyRaft/candidate.py | 0 {car => pycar}/MyRaft/config.ini | 0 {car => pycar}/MyRaft/config.json | 0 {car => pycar}/MyRaft/follower.py | 0 {car => pycar}/MyRaft/leader.py | 0 {car => pycar}/MyRaft/messages.py | 0 {car => pycar}/MyRaft/messagestrategy.py | 0 {car => pycar}/MyRaft/node.py | 0 {car => pycar}/MyRaft/protos/raft.proto | 0 {car => pycar}/MyRaft/state.py | 0 {car => pycar}/MyRaft/test.py | 0 {car => pycar}/MyRaft/voter.py | 0 {car => pycar}/bitbucket-pipelines.yml | 0 {car => pycar}/build.gradle | 0 {car => pycar}/config.json | 0 {car => pycar}/docker-compose.yml | 0 {car => pycar}/malima_SIU06.pdf | Bin {car => pycar}/requirements.txt | 0 {car => pycar}/setup.py | 0 .../CentralisedDecision/__init__.py | 0 .../CentralisedDecision/ballotvoter.py | 0 .../CentralisedDecision/cameraserver.py | 0 .../CentralisedDecision/central_server.py | 0 .../centralisedinstance.py | 0 .../CentralisedDecision/commander.py | 0 .../CentralisedDecision/messenger.py | 0 .../CentralisedDecision/videoget.py | 0 .../DecentralisedActivityFusion/voter.py | 0 .../src/car}/DecisionSystem/__init__.py | 0 .../src/car}/DecisionSystem/messages.py | 0 .../src/car}/GestureRecognition/HandRecHSV.py | 0 .../src/car}/GestureRecognition/HandRecV2.py | 0 .../src/car}/GestureRecognition/IMG_0818.png | Bin .../src/car}/GestureRecognition/IMG_0825.jpg | Bin .../Neural Network hand Tracking.pdf | Bin .../SimpleHandRecogniser.py | 0 .../src/car}/GestureRecognition/__init__.py | 0 .../frozen_inference_graph.pb | Bin .../src/car}/GestureRecognition/graph.pbtxt | 0 .../car}/GestureRecognition/handrecogniser.py | 0 .../car}/GestureRecognition/kaleidoscope.py | 0 .../src/car}/GestureRecognition/keras_ex.py | 0 .../GestureRecognition/opencvtensorflowex.py | 0 .../src/car}/GestureRecognition/starkaleid.py | 0 {car/src/pycar => pycar/src/car}/__init__.py | 0 {car/src/pycar => pycar/src/car}/__main__.py | 0 .../car}/control/PythonRemoteController.py | 0 .../src/car}/control/__init__.py | 0 .../src/car}/control/gpio/__init__.py | 0 .../src/car}/control/gpio/factory.py | 0 .../src/car}/control/gpio/mockvehicle.py | 0 .../gpio/recording_vehicle_decorator.py | 0 .../src/car}/control/gpio/vehicle.py | 0 .../src/car}/control/motor_servicer.py | 0 .../src/pycar => pycar/src/car}/controller.py | 0 .../src/car}/messaging/__init__.py | 0 .../src/car}/messaging/message_factory.py | 0 .../src/car}/messaging/messages.py | 0 .../src/car}/messaging/mqttsession.py | 0 .../pycar => pycar/src/car}/slam/__init__.py | 0 .../src/car}/slam/slam_processor.py | 0 .../src/car}/slam/slam_servicer.py | 0 .../src/car}/slam/slam_streamer.py | 0 .../src/car}/slam/zmq_pair_testing/pair.py | 0 .../src/car}/tracking/__init__.py | 0 .../src/car}/tracking/algorithms.py | 0 .../src/car}/tracking/all_scans.txt | Bin .../src/car}/tracking/animate.py | 0 .../src/car}/tracking/animate_alg.py | 0 .../src/car}/tracking/devices/__init__.py | 0 .../src/car}/tracking/devices/factory.py | 0 .../src/car}/tracking/devices/mock_lidar.py | 0 .../car}/tracking/devices/recording_lidar.py | 0 .../src/car}/tracking/lidar_cache.py | 0 .../src/car}/tracking/lidar_loader.py | 0 .../src/car}/tracking/lidar_servicer.py | 0 .../src/car}/tracking/lidar_tester.py | 0 .../src/car}/tracking/out.pickle | Bin .../src/car}/tracking/readme.txt | 0 {car => pycar}/tests/test_algorithms.py | 0 {car => pycar}/tests/test_ballot_voter.py | 0 {car => pycar}/tests/test_commander.py | 0 {car => pycar}/tests/test_hand_recogniser.py | 0 {car => pycar}/tests/test_lidar_cache.py | 0 {car => pycar}/tests/test_messages.py | 0 {car => pycar}/tests/test_mqtt_voter.py | 0 98 files changed, 387 deletions(-) delete mode 100644 car/MyRaft/raft_pb2.py delete mode 100644 car/MyRaft/raft_pb2_grpc.py delete mode 100644 car/car.iml rename {car => pycar}/.dockerignore (100%) rename {car => pycar}/Assets/ControllerSlideIcon.ai (100%) rename {car => pycar}/Assets/ControllerSlideIcon.svg (100%) rename {car => pycar}/Assets/ControllerSlideIconHorizontal.svg (100%) rename {car => pycar}/COCO-classes.txt (100%) rename {car => pycar}/Dockerfile (100%) rename {car => pycar}/MyRaft/Experiment/node1/config.json (100%) rename {car => pycar}/MyRaft/Experiment/node2/config.json (100%) rename {car => pycar}/MyRaft/Experiment/node3/config.json (100%) rename {car => pycar}/MyRaft/candidate.py (100%) rename {car => pycar}/MyRaft/config.ini (100%) rename {car => pycar}/MyRaft/config.json (100%) rename {car => pycar}/MyRaft/follower.py (100%) rename {car => pycar}/MyRaft/leader.py (100%) rename {car => pycar}/MyRaft/messages.py (100%) rename {car => pycar}/MyRaft/messagestrategy.py (100%) rename {car => pycar}/MyRaft/node.py (100%) rename {car => pycar}/MyRaft/protos/raft.proto (100%) rename {car => pycar}/MyRaft/state.py (100%) rename {car => pycar}/MyRaft/test.py (100%) rename {car => pycar}/MyRaft/voter.py (100%) rename {car => pycar}/bitbucket-pipelines.yml (100%) rename {car => pycar}/build.gradle (100%) rename {car => pycar}/config.json (100%) rename {car => pycar}/docker-compose.yml (100%) rename {car => pycar}/malima_SIU06.pdf (100%) rename {car => pycar}/requirements.txt (100%) rename {car => pycar}/setup.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/ballotvoter.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/cameraserver.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/central_server.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/centralisedinstance.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/commander.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/messenger.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/CentralisedDecision/videoget.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/DecentralisedActivityFusion/voter.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/DecisionSystem/messages.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/HandRecHSV.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/HandRecV2.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/IMG_0818.png (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/IMG_0825.jpg (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/Neural Network hand Tracking.pdf (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/SimpleHandRecogniser.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/frozen_inference_graph.pb (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/graph.pbtxt (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/handrecogniser.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/kaleidoscope.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/keras_ex.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/opencvtensorflowex.py (100%) rename {car/src/pycar => pycar/src/car}/GestureRecognition/starkaleid.py (100%) rename {car/src/pycar => pycar/src/car}/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/__main__.py (100%) rename {car/src/pycar => pycar/src/car}/control/PythonRemoteController.py (100%) rename {car/src/pycar => pycar/src/car}/control/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/control/gpio/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/control/gpio/factory.py (100%) rename {car/src/pycar => pycar/src/car}/control/gpio/mockvehicle.py (100%) rename {car/src/pycar => pycar/src/car}/control/gpio/recording_vehicle_decorator.py (100%) rename {car/src/pycar => pycar/src/car}/control/gpio/vehicle.py (100%) rename {car/src/pycar => pycar/src/car}/control/motor_servicer.py (100%) rename {car/src/pycar => pycar/src/car}/controller.py (100%) rename {car/src/pycar => pycar/src/car}/messaging/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/messaging/message_factory.py (100%) rename {car/src/pycar => pycar/src/car}/messaging/messages.py (100%) rename {car/src/pycar => pycar/src/car}/messaging/mqttsession.py (100%) rename {car/src/pycar => pycar/src/car}/slam/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/slam/slam_processor.py (100%) rename {car/src/pycar => pycar/src/car}/slam/slam_servicer.py (100%) rename {car/src/pycar => pycar/src/car}/slam/slam_streamer.py (100%) rename {car/src/pycar => pycar/src/car}/slam/zmq_pair_testing/pair.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/algorithms.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/all_scans.txt (100%) rename {car/src/pycar => pycar/src/car}/tracking/animate.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/animate_alg.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/devices/__init__.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/devices/factory.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/devices/mock_lidar.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/devices/recording_lidar.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/lidar_cache.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/lidar_loader.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/lidar_servicer.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/lidar_tester.py (100%) rename {car/src/pycar => pycar/src/car}/tracking/out.pickle (100%) rename {car/src/pycar => pycar/src/car}/tracking/readme.txt (100%) rename {car => pycar}/tests/test_algorithms.py (100%) rename {car => pycar}/tests/test_ballot_voter.py (100%) rename {car => pycar}/tests/test_commander.py (100%) rename {car => pycar}/tests/test_hand_recogniser.py (100%) rename {car => pycar}/tests/test_lidar_cache.py (100%) rename {car => pycar}/tests/test_messages.py (100%) rename {car => pycar}/tests/test_mqtt_voter.py (100%) diff --git a/car/MyRaft/raft_pb2.py b/car/MyRaft/raft_pb2.py deleted file mode 100644 index ad2f5a0..0000000 --- a/car/MyRaft/raft_pb2.py +++ /dev/null @@ -1,296 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: raft.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='raft.proto', - package='raft', - syntax='proto3', - serialized_options=None, - serialized_pb=_b('\n\nraft.proto\x12\x04raft\"\x7f\n\rAppendEntries\x12\x0c\n\x04term\x18\x01 \x01(\r\x12\x10\n\x08leaderId\x18\x02 \x01(\t\x12\x14\n\x0cprevLogIndex\x18\x03 \x01(\r\x12\x13\n\x0bprevLogTerm\x18\x04 \x01(\r\x12\x14\n\x0cleaderCommit\x18\x05 \x01(\r\x12\r\n\x05\x65ntry\x18\x06 \x03(\t\"6\n\x15\x41ppendEntriesResponse\x12\x0c\n\x04term\x18\x01 \x01(\r\x12\x0f\n\x07success\x18\x02 \x01(\x08\"[\n\x0bRequestVote\x12\x0c\n\x04term\x18\x01 \x01(\r\x12\x13\n\x0b\x63\x61ndidateId\x18\x02 \x01(\t\x12\x14\n\x0clastLogIndex\x18\x03 \x01(\r\x12\x13\n\x0blastLogTerm\x18\x04 \x01(\r\"I\n\x13RequestVoteResponse\x12\x0c\n\x04term\x18\x01 \x01(\r\x12\x13\n\x0bvoteGranted\x18\x02 \x01(\x08\x12\x0f\n\x07voterId\x18\x03 \x01(\t2\x90\x01\n\x04Raft\x12\x46\n\x10\x41ppendEntriesRPC\x12\x13.raft.AppendEntries\x1a\x1b.raft.AppendEntriesResponse\"\x00\x12@\n\x0eRequestVoteRPC\x12\x11.raft.RequestVote\x1a\x19.raft.RequestVoteResponse\"\x00\x62\x06proto3') -) - - - - -_APPENDENTRIES = _descriptor.Descriptor( - name='AppendEntries', - full_name='raft.AppendEntries', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='term', full_name='raft.AppendEntries.term', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='leaderId', full_name='raft.AppendEntries.leaderId', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='prevLogIndex', full_name='raft.AppendEntries.prevLogIndex', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='prevLogTerm', full_name='raft.AppendEntries.prevLogTerm', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='leaderCommit', full_name='raft.AppendEntries.leaderCommit', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='entry', full_name='raft.AppendEntries.entry', index=5, - number=6, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=20, - serialized_end=147, -) - - -_APPENDENTRIESRESPONSE = _descriptor.Descriptor( - name='AppendEntriesResponse', - full_name='raft.AppendEntriesResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='term', full_name='raft.AppendEntriesResponse.term', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='success', full_name='raft.AppendEntriesResponse.success', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=149, - serialized_end=203, -) - - -_REQUESTVOTE = _descriptor.Descriptor( - name='RequestVote', - full_name='raft.RequestVote', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='term', full_name='raft.RequestVote.term', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='candidateId', full_name='raft.RequestVote.candidateId', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='lastLogIndex', full_name='raft.RequestVote.lastLogIndex', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='lastLogTerm', full_name='raft.RequestVote.lastLogTerm', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=205, - serialized_end=296, -) - - -_REQUESTVOTERESPONSE = _descriptor.Descriptor( - name='RequestVoteResponse', - full_name='raft.RequestVoteResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='term', full_name='raft.RequestVoteResponse.term', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='voteGranted', full_name='raft.RequestVoteResponse.voteGranted', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='voterId', full_name='raft.RequestVoteResponse.voterId', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=298, - serialized_end=371, -) - -DESCRIPTOR.message_types_by_name['AppendEntries'] = _APPENDENTRIES -DESCRIPTOR.message_types_by_name['AppendEntriesResponse'] = _APPENDENTRIESRESPONSE -DESCRIPTOR.message_types_by_name['RequestVote'] = _REQUESTVOTE -DESCRIPTOR.message_types_by_name['RequestVoteResponse'] = _REQUESTVOTERESPONSE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -AppendEntries = _reflection.GeneratedProtocolMessageType('AppendEntries', (_message.Message,), dict( - DESCRIPTOR = _APPENDENTRIES, - __module__ = 'raft_pb2' - # @@protoc_insertion_point(class_scope:raft.AppendEntries) - )) -_sym_db.RegisterMessage(AppendEntries) - -AppendEntriesResponse = _reflection.GeneratedProtocolMessageType('AppendEntriesResponse', (_message.Message,), dict( - DESCRIPTOR = _APPENDENTRIESRESPONSE, - __module__ = 'raft_pb2' - # @@protoc_insertion_point(class_scope:raft.AppendEntriesResponse) - )) -_sym_db.RegisterMessage(AppendEntriesResponse) - -RequestVote = _reflection.GeneratedProtocolMessageType('RequestVote', (_message.Message,), dict( - DESCRIPTOR = _REQUESTVOTE, - __module__ = 'raft_pb2' - # @@protoc_insertion_point(class_scope:raft.RequestVote) - )) -_sym_db.RegisterMessage(RequestVote) - -RequestVoteResponse = _reflection.GeneratedProtocolMessageType('RequestVoteResponse', (_message.Message,), dict( - DESCRIPTOR = _REQUESTVOTERESPONSE, - __module__ = 'raft_pb2' - # @@protoc_insertion_point(class_scope:raft.RequestVoteResponse) - )) -_sym_db.RegisterMessage(RequestVoteResponse) - - - -_RAFT = _descriptor.ServiceDescriptor( - name='Raft', - full_name='raft.Raft', - file=DESCRIPTOR, - index=0, - serialized_options=None, - serialized_start=374, - serialized_end=518, - methods=[ - _descriptor.MethodDescriptor( - name='AppendEntriesRPC', - full_name='raft.Raft.AppendEntriesRPC', - index=0, - containing_service=None, - input_type=_APPENDENTRIES, - output_type=_APPENDENTRIESRESPONSE, - serialized_options=None, - ), - _descriptor.MethodDescriptor( - name='RequestVoteRPC', - full_name='raft.Raft.RequestVoteRPC', - index=1, - containing_service=None, - input_type=_REQUESTVOTE, - output_type=_REQUESTVOTERESPONSE, - serialized_options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_RAFT) - -DESCRIPTOR.services_by_name['Raft'] = _RAFT - -# @@protoc_insertion_point(module_scope) diff --git a/car/MyRaft/raft_pb2_grpc.py b/car/MyRaft/raft_pb2_grpc.py deleted file mode 100644 index 6dd6884..0000000 --- a/car/MyRaft/raft_pb2_grpc.py +++ /dev/null @@ -1,63 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -import grpc - -import MyRaft.raft_pb2 as raft__pb2 - - -class RaftStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.AppendEntriesRPC = channel.unary_unary( - '/raft.Raft/AppendEntriesRPC', - request_serializer=raft__pb2.AppendEntries.SerializeToString, - response_deserializer=raft__pb2.AppendEntriesResponse.FromString, - ) - self.RequestVoteRPC = channel.unary_unary( - '/raft.Raft/RequestVoteRPC', - request_serializer=raft__pb2.RequestVote.SerializeToString, - response_deserializer=raft__pb2.RequestVoteResponse.FromString, - ) - - -class RaftServicer(object): - # missing associated documentation comment in .proto file - pass - - def AppendEntriesRPC(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RequestVoteRPC(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_RaftServicer_to_server(servicer, server): - rpc_method_handlers = { - 'AppendEntriesRPC': grpc.unary_unary_rpc_method_handler( - servicer.AppendEntriesRPC, - request_deserializer=raft__pb2.AppendEntries.FromString, - response_serializer=raft__pb2.AppendEntriesResponse.SerializeToString, - ), - 'RequestVoteRPC': grpc.unary_unary_rpc_method_handler( - servicer.RequestVoteRPC, - request_deserializer=raft__pb2.RequestVote.FromString, - response_serializer=raft__pb2.RequestVoteResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'raft.Raft', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) diff --git a/car/car.iml b/car/car.iml deleted file mode 100644 index 49cf236..0000000 --- a/car/car.iml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/car/.dockerignore b/pycar/.dockerignore similarity index 100% rename from car/.dockerignore rename to pycar/.dockerignore diff --git a/car/Assets/ControllerSlideIcon.ai b/pycar/Assets/ControllerSlideIcon.ai similarity index 100% rename from car/Assets/ControllerSlideIcon.ai rename to pycar/Assets/ControllerSlideIcon.ai diff --git a/car/Assets/ControllerSlideIcon.svg b/pycar/Assets/ControllerSlideIcon.svg similarity index 100% rename from car/Assets/ControllerSlideIcon.svg rename to pycar/Assets/ControllerSlideIcon.svg diff --git a/car/Assets/ControllerSlideIconHorizontal.svg b/pycar/Assets/ControllerSlideIconHorizontal.svg similarity index 100% rename from car/Assets/ControllerSlideIconHorizontal.svg rename to pycar/Assets/ControllerSlideIconHorizontal.svg diff --git a/car/COCO-classes.txt b/pycar/COCO-classes.txt similarity index 100% rename from car/COCO-classes.txt rename to pycar/COCO-classes.txt diff --git a/car/Dockerfile b/pycar/Dockerfile similarity index 100% rename from car/Dockerfile rename to pycar/Dockerfile diff --git a/car/MyRaft/Experiment/node1/config.json b/pycar/MyRaft/Experiment/node1/config.json similarity index 100% rename from car/MyRaft/Experiment/node1/config.json rename to pycar/MyRaft/Experiment/node1/config.json diff --git a/car/MyRaft/Experiment/node2/config.json b/pycar/MyRaft/Experiment/node2/config.json similarity index 100% rename from car/MyRaft/Experiment/node2/config.json rename to pycar/MyRaft/Experiment/node2/config.json diff --git a/car/MyRaft/Experiment/node3/config.json b/pycar/MyRaft/Experiment/node3/config.json similarity index 100% rename from car/MyRaft/Experiment/node3/config.json rename to pycar/MyRaft/Experiment/node3/config.json diff --git a/car/MyRaft/candidate.py b/pycar/MyRaft/candidate.py similarity index 100% rename from car/MyRaft/candidate.py rename to pycar/MyRaft/candidate.py diff --git a/car/MyRaft/config.ini b/pycar/MyRaft/config.ini similarity index 100% rename from car/MyRaft/config.ini rename to pycar/MyRaft/config.ini diff --git a/car/MyRaft/config.json b/pycar/MyRaft/config.json similarity index 100% rename from car/MyRaft/config.json rename to pycar/MyRaft/config.json diff --git a/car/MyRaft/follower.py b/pycar/MyRaft/follower.py similarity index 100% rename from car/MyRaft/follower.py rename to pycar/MyRaft/follower.py diff --git a/car/MyRaft/leader.py b/pycar/MyRaft/leader.py similarity index 100% rename from car/MyRaft/leader.py rename to pycar/MyRaft/leader.py diff --git a/car/MyRaft/messages.py b/pycar/MyRaft/messages.py similarity index 100% rename from car/MyRaft/messages.py rename to pycar/MyRaft/messages.py diff --git a/car/MyRaft/messagestrategy.py b/pycar/MyRaft/messagestrategy.py similarity index 100% rename from car/MyRaft/messagestrategy.py rename to pycar/MyRaft/messagestrategy.py diff --git a/car/MyRaft/node.py b/pycar/MyRaft/node.py similarity index 100% rename from car/MyRaft/node.py rename to pycar/MyRaft/node.py diff --git a/car/MyRaft/protos/raft.proto b/pycar/MyRaft/protos/raft.proto similarity index 100% rename from car/MyRaft/protos/raft.proto rename to pycar/MyRaft/protos/raft.proto diff --git a/car/MyRaft/state.py b/pycar/MyRaft/state.py similarity index 100% rename from car/MyRaft/state.py rename to pycar/MyRaft/state.py diff --git a/car/MyRaft/test.py b/pycar/MyRaft/test.py similarity index 100% rename from car/MyRaft/test.py rename to pycar/MyRaft/test.py diff --git a/car/MyRaft/voter.py b/pycar/MyRaft/voter.py similarity index 100% rename from car/MyRaft/voter.py rename to pycar/MyRaft/voter.py diff --git a/car/bitbucket-pipelines.yml b/pycar/bitbucket-pipelines.yml similarity index 100% rename from car/bitbucket-pipelines.yml rename to pycar/bitbucket-pipelines.yml diff --git a/car/build.gradle b/pycar/build.gradle similarity index 100% rename from car/build.gradle rename to pycar/build.gradle diff --git a/car/config.json b/pycar/config.json similarity index 100% rename from car/config.json rename to pycar/config.json diff --git a/car/docker-compose.yml b/pycar/docker-compose.yml similarity index 100% rename from car/docker-compose.yml rename to pycar/docker-compose.yml diff --git a/car/malima_SIU06.pdf b/pycar/malima_SIU06.pdf similarity index 100% rename from car/malima_SIU06.pdf rename to pycar/malima_SIU06.pdf diff --git a/car/requirements.txt b/pycar/requirements.txt similarity index 100% rename from car/requirements.txt rename to pycar/requirements.txt diff --git a/car/setup.py b/pycar/setup.py similarity index 100% rename from car/setup.py rename to pycar/setup.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/__init__.py b/pycar/src/car/DecisionSystem/CentralisedDecision/__init__.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/__init__.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/__init__.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/ballotvoter.py b/pycar/src/car/DecisionSystem/CentralisedDecision/ballotvoter.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/ballotvoter.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/ballotvoter.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/cameraserver.py b/pycar/src/car/DecisionSystem/CentralisedDecision/cameraserver.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/cameraserver.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/cameraserver.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/central_server.py b/pycar/src/car/DecisionSystem/CentralisedDecision/central_server.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/central_server.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/central_server.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/centralisedinstance.py b/pycar/src/car/DecisionSystem/CentralisedDecision/centralisedinstance.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/centralisedinstance.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/centralisedinstance.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/commander.py b/pycar/src/car/DecisionSystem/CentralisedDecision/commander.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/commander.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/commander.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/messenger.py b/pycar/src/car/DecisionSystem/CentralisedDecision/messenger.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/messenger.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/messenger.py diff --git a/car/src/pycar/DecisionSystem/CentralisedDecision/videoget.py b/pycar/src/car/DecisionSystem/CentralisedDecision/videoget.py similarity index 100% rename from car/src/pycar/DecisionSystem/CentralisedDecision/videoget.py rename to pycar/src/car/DecisionSystem/CentralisedDecision/videoget.py diff --git a/car/src/pycar/DecisionSystem/DecentralisedActivityFusion/voter.py b/pycar/src/car/DecisionSystem/DecentralisedActivityFusion/voter.py similarity index 100% rename from car/src/pycar/DecisionSystem/DecentralisedActivityFusion/voter.py rename to pycar/src/car/DecisionSystem/DecentralisedActivityFusion/voter.py diff --git a/car/src/pycar/DecisionSystem/__init__.py b/pycar/src/car/DecisionSystem/__init__.py similarity index 100% rename from car/src/pycar/DecisionSystem/__init__.py rename to pycar/src/car/DecisionSystem/__init__.py diff --git a/car/src/pycar/DecisionSystem/messages.py b/pycar/src/car/DecisionSystem/messages.py similarity index 100% rename from car/src/pycar/DecisionSystem/messages.py rename to pycar/src/car/DecisionSystem/messages.py diff --git a/car/src/pycar/GestureRecognition/HandRecHSV.py b/pycar/src/car/GestureRecognition/HandRecHSV.py similarity index 100% rename from car/src/pycar/GestureRecognition/HandRecHSV.py rename to pycar/src/car/GestureRecognition/HandRecHSV.py diff --git a/car/src/pycar/GestureRecognition/HandRecV2.py b/pycar/src/car/GestureRecognition/HandRecV2.py similarity index 100% rename from car/src/pycar/GestureRecognition/HandRecV2.py rename to pycar/src/car/GestureRecognition/HandRecV2.py diff --git a/car/src/pycar/GestureRecognition/IMG_0818.png b/pycar/src/car/GestureRecognition/IMG_0818.png similarity index 100% rename from car/src/pycar/GestureRecognition/IMG_0818.png rename to pycar/src/car/GestureRecognition/IMG_0818.png diff --git a/car/src/pycar/GestureRecognition/IMG_0825.jpg b/pycar/src/car/GestureRecognition/IMG_0825.jpg similarity index 100% rename from car/src/pycar/GestureRecognition/IMG_0825.jpg rename to pycar/src/car/GestureRecognition/IMG_0825.jpg diff --git a/car/src/pycar/GestureRecognition/Neural Network hand Tracking.pdf b/pycar/src/car/GestureRecognition/Neural Network hand Tracking.pdf similarity index 100% rename from car/src/pycar/GestureRecognition/Neural Network hand Tracking.pdf rename to pycar/src/car/GestureRecognition/Neural Network hand Tracking.pdf diff --git a/car/src/pycar/GestureRecognition/SimpleHandRecogniser.py b/pycar/src/car/GestureRecognition/SimpleHandRecogniser.py similarity index 100% rename from car/src/pycar/GestureRecognition/SimpleHandRecogniser.py rename to pycar/src/car/GestureRecognition/SimpleHandRecogniser.py diff --git a/car/src/pycar/GestureRecognition/__init__.py b/pycar/src/car/GestureRecognition/__init__.py similarity index 100% rename from car/src/pycar/GestureRecognition/__init__.py rename to pycar/src/car/GestureRecognition/__init__.py diff --git a/car/src/pycar/GestureRecognition/frozen_inference_graph.pb b/pycar/src/car/GestureRecognition/frozen_inference_graph.pb similarity index 100% rename from car/src/pycar/GestureRecognition/frozen_inference_graph.pb rename to pycar/src/car/GestureRecognition/frozen_inference_graph.pb diff --git a/car/src/pycar/GestureRecognition/graph.pbtxt b/pycar/src/car/GestureRecognition/graph.pbtxt similarity index 100% rename from car/src/pycar/GestureRecognition/graph.pbtxt rename to pycar/src/car/GestureRecognition/graph.pbtxt diff --git a/car/src/pycar/GestureRecognition/handrecogniser.py b/pycar/src/car/GestureRecognition/handrecogniser.py similarity index 100% rename from car/src/pycar/GestureRecognition/handrecogniser.py rename to pycar/src/car/GestureRecognition/handrecogniser.py diff --git a/car/src/pycar/GestureRecognition/kaleidoscope.py b/pycar/src/car/GestureRecognition/kaleidoscope.py similarity index 100% rename from car/src/pycar/GestureRecognition/kaleidoscope.py rename to pycar/src/car/GestureRecognition/kaleidoscope.py diff --git a/car/src/pycar/GestureRecognition/keras_ex.py b/pycar/src/car/GestureRecognition/keras_ex.py similarity index 100% rename from car/src/pycar/GestureRecognition/keras_ex.py rename to pycar/src/car/GestureRecognition/keras_ex.py diff --git a/car/src/pycar/GestureRecognition/opencvtensorflowex.py b/pycar/src/car/GestureRecognition/opencvtensorflowex.py similarity index 100% rename from car/src/pycar/GestureRecognition/opencvtensorflowex.py rename to pycar/src/car/GestureRecognition/opencvtensorflowex.py diff --git a/car/src/pycar/GestureRecognition/starkaleid.py b/pycar/src/car/GestureRecognition/starkaleid.py similarity index 100% rename from car/src/pycar/GestureRecognition/starkaleid.py rename to pycar/src/car/GestureRecognition/starkaleid.py diff --git a/car/src/pycar/__init__.py b/pycar/src/car/__init__.py similarity index 100% rename from car/src/pycar/__init__.py rename to pycar/src/car/__init__.py diff --git a/car/src/pycar/__main__.py b/pycar/src/car/__main__.py similarity index 100% rename from car/src/pycar/__main__.py rename to pycar/src/car/__main__.py diff --git a/car/src/pycar/control/PythonRemoteController.py b/pycar/src/car/control/PythonRemoteController.py similarity index 100% rename from car/src/pycar/control/PythonRemoteController.py rename to pycar/src/car/control/PythonRemoteController.py diff --git a/car/src/pycar/control/__init__.py b/pycar/src/car/control/__init__.py similarity index 100% rename from car/src/pycar/control/__init__.py rename to pycar/src/car/control/__init__.py diff --git a/car/src/pycar/control/gpio/__init__.py b/pycar/src/car/control/gpio/__init__.py similarity index 100% rename from car/src/pycar/control/gpio/__init__.py rename to pycar/src/car/control/gpio/__init__.py diff --git a/car/src/pycar/control/gpio/factory.py b/pycar/src/car/control/gpio/factory.py similarity index 100% rename from car/src/pycar/control/gpio/factory.py rename to pycar/src/car/control/gpio/factory.py diff --git a/car/src/pycar/control/gpio/mockvehicle.py b/pycar/src/car/control/gpio/mockvehicle.py similarity index 100% rename from car/src/pycar/control/gpio/mockvehicle.py rename to pycar/src/car/control/gpio/mockvehicle.py diff --git a/car/src/pycar/control/gpio/recording_vehicle_decorator.py b/pycar/src/car/control/gpio/recording_vehicle_decorator.py similarity index 100% rename from car/src/pycar/control/gpio/recording_vehicle_decorator.py rename to pycar/src/car/control/gpio/recording_vehicle_decorator.py diff --git a/car/src/pycar/control/gpio/vehicle.py b/pycar/src/car/control/gpio/vehicle.py similarity index 100% rename from car/src/pycar/control/gpio/vehicle.py rename to pycar/src/car/control/gpio/vehicle.py diff --git a/car/src/pycar/control/motor_servicer.py b/pycar/src/car/control/motor_servicer.py similarity index 100% rename from car/src/pycar/control/motor_servicer.py rename to pycar/src/car/control/motor_servicer.py diff --git a/car/src/pycar/controller.py b/pycar/src/car/controller.py similarity index 100% rename from car/src/pycar/controller.py rename to pycar/src/car/controller.py diff --git a/car/src/pycar/messaging/__init__.py b/pycar/src/car/messaging/__init__.py similarity index 100% rename from car/src/pycar/messaging/__init__.py rename to pycar/src/car/messaging/__init__.py diff --git a/car/src/pycar/messaging/message_factory.py b/pycar/src/car/messaging/message_factory.py similarity index 100% rename from car/src/pycar/messaging/message_factory.py rename to pycar/src/car/messaging/message_factory.py diff --git a/car/src/pycar/messaging/messages.py b/pycar/src/car/messaging/messages.py similarity index 100% rename from car/src/pycar/messaging/messages.py rename to pycar/src/car/messaging/messages.py diff --git a/car/src/pycar/messaging/mqttsession.py b/pycar/src/car/messaging/mqttsession.py similarity index 100% rename from car/src/pycar/messaging/mqttsession.py rename to pycar/src/car/messaging/mqttsession.py diff --git a/car/src/pycar/slam/__init__.py b/pycar/src/car/slam/__init__.py similarity index 100% rename from car/src/pycar/slam/__init__.py rename to pycar/src/car/slam/__init__.py diff --git a/car/src/pycar/slam/slam_processor.py b/pycar/src/car/slam/slam_processor.py similarity index 100% rename from car/src/pycar/slam/slam_processor.py rename to pycar/src/car/slam/slam_processor.py diff --git a/car/src/pycar/slam/slam_servicer.py b/pycar/src/car/slam/slam_servicer.py similarity index 100% rename from car/src/pycar/slam/slam_servicer.py rename to pycar/src/car/slam/slam_servicer.py diff --git a/car/src/pycar/slam/slam_streamer.py b/pycar/src/car/slam/slam_streamer.py similarity index 100% rename from car/src/pycar/slam/slam_streamer.py rename to pycar/src/car/slam/slam_streamer.py diff --git a/car/src/pycar/slam/zmq_pair_testing/pair.py b/pycar/src/car/slam/zmq_pair_testing/pair.py similarity index 100% rename from car/src/pycar/slam/zmq_pair_testing/pair.py rename to pycar/src/car/slam/zmq_pair_testing/pair.py diff --git a/car/src/pycar/tracking/__init__.py b/pycar/src/car/tracking/__init__.py similarity index 100% rename from car/src/pycar/tracking/__init__.py rename to pycar/src/car/tracking/__init__.py diff --git a/car/src/pycar/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py similarity index 100% rename from car/src/pycar/tracking/algorithms.py rename to pycar/src/car/tracking/algorithms.py diff --git a/car/src/pycar/tracking/all_scans.txt b/pycar/src/car/tracking/all_scans.txt similarity index 100% rename from car/src/pycar/tracking/all_scans.txt rename to pycar/src/car/tracking/all_scans.txt diff --git a/car/src/pycar/tracking/animate.py b/pycar/src/car/tracking/animate.py similarity index 100% rename from car/src/pycar/tracking/animate.py rename to pycar/src/car/tracking/animate.py diff --git a/car/src/pycar/tracking/animate_alg.py b/pycar/src/car/tracking/animate_alg.py similarity index 100% rename from car/src/pycar/tracking/animate_alg.py rename to pycar/src/car/tracking/animate_alg.py diff --git a/car/src/pycar/tracking/devices/__init__.py b/pycar/src/car/tracking/devices/__init__.py similarity index 100% rename from car/src/pycar/tracking/devices/__init__.py rename to pycar/src/car/tracking/devices/__init__.py diff --git a/car/src/pycar/tracking/devices/factory.py b/pycar/src/car/tracking/devices/factory.py similarity index 100% rename from car/src/pycar/tracking/devices/factory.py rename to pycar/src/car/tracking/devices/factory.py diff --git a/car/src/pycar/tracking/devices/mock_lidar.py b/pycar/src/car/tracking/devices/mock_lidar.py similarity index 100% rename from car/src/pycar/tracking/devices/mock_lidar.py rename to pycar/src/car/tracking/devices/mock_lidar.py diff --git a/car/src/pycar/tracking/devices/recording_lidar.py b/pycar/src/car/tracking/devices/recording_lidar.py similarity index 100% rename from car/src/pycar/tracking/devices/recording_lidar.py rename to pycar/src/car/tracking/devices/recording_lidar.py diff --git a/car/src/pycar/tracking/lidar_cache.py b/pycar/src/car/tracking/lidar_cache.py similarity index 100% rename from car/src/pycar/tracking/lidar_cache.py rename to pycar/src/car/tracking/lidar_cache.py diff --git a/car/src/pycar/tracking/lidar_loader.py b/pycar/src/car/tracking/lidar_loader.py similarity index 100% rename from car/src/pycar/tracking/lidar_loader.py rename to pycar/src/car/tracking/lidar_loader.py diff --git a/car/src/pycar/tracking/lidar_servicer.py b/pycar/src/car/tracking/lidar_servicer.py similarity index 100% rename from car/src/pycar/tracking/lidar_servicer.py rename to pycar/src/car/tracking/lidar_servicer.py diff --git a/car/src/pycar/tracking/lidar_tester.py b/pycar/src/car/tracking/lidar_tester.py similarity index 100% rename from car/src/pycar/tracking/lidar_tester.py rename to pycar/src/car/tracking/lidar_tester.py diff --git a/car/src/pycar/tracking/out.pickle b/pycar/src/car/tracking/out.pickle similarity index 100% rename from car/src/pycar/tracking/out.pickle rename to pycar/src/car/tracking/out.pickle diff --git a/car/src/pycar/tracking/readme.txt b/pycar/src/car/tracking/readme.txt similarity index 100% rename from car/src/pycar/tracking/readme.txt rename to pycar/src/car/tracking/readme.txt diff --git a/car/tests/test_algorithms.py b/pycar/tests/test_algorithms.py similarity index 100% rename from car/tests/test_algorithms.py rename to pycar/tests/test_algorithms.py diff --git a/car/tests/test_ballot_voter.py b/pycar/tests/test_ballot_voter.py similarity index 100% rename from car/tests/test_ballot_voter.py rename to pycar/tests/test_ballot_voter.py diff --git a/car/tests/test_commander.py b/pycar/tests/test_commander.py similarity index 100% rename from car/tests/test_commander.py rename to pycar/tests/test_commander.py diff --git a/car/tests/test_hand_recogniser.py b/pycar/tests/test_hand_recogniser.py similarity index 100% rename from car/tests/test_hand_recogniser.py rename to pycar/tests/test_hand_recogniser.py diff --git a/car/tests/test_lidar_cache.py b/pycar/tests/test_lidar_cache.py similarity index 100% rename from car/tests/test_lidar_cache.py rename to pycar/tests/test_lidar_cache.py diff --git a/car/tests/test_messages.py b/pycar/tests/test_messages.py similarity index 100% rename from car/tests/test_messages.py rename to pycar/tests/test_messages.py diff --git a/car/tests/test_mqtt_voter.py b/pycar/tests/test_mqtt_voter.py similarity index 100% rename from car/tests/test_mqtt_voter.py rename to pycar/tests/test_mqtt_voter.py From 9efae432259f8e65eb455e40a127177472cb6d5d Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 29 May 2020 21:58:11 +0930 Subject: [PATCH 06/24] More pycar fixes. Whilst it's good to have pycar, note for the future that this wasn't the problem. VS Code hadn't picked up the correct working directory in WSL. --- pycar/src/car/tracking/devices/factory.py | 2 +- settings.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pycar/src/car/tracking/devices/factory.py b/pycar/src/car/tracking/devices/factory.py index 527a6b5..d9b1e02 100644 --- a/pycar/src/car/tracking/devices/factory.py +++ b/pycar/src/car/tracking/devices/factory.py @@ -13,7 +13,7 @@ def get_lidar(device=None): print( 'No lidar device specified and the CAR_LIDAR environment variable is not set.') if actual_device == MOCK_DEVICE: - return MockLidar(loader.load_scans_bytes_file("car/src/car/tracking/out.pickle")) + return MockLidar(loader.load_scans_bytes_file("pycar/src/car/tracking/out.pickle")) elif actual_device != '': try: from rplidar import RPLidar diff --git a/settings.gradle b/settings.gradle index 1b5247a..4e80e75 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,6 @@ include ':app' include ':protobuf' -include 'car' +include 'pycar' include 'CarControlleriOS' include 'SwiftyCar' rootProject.name='CarController' From 9393d24e594e6ca7bc77f0bf41afaaa41bc08ce3 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sat, 30 May 2020 12:12:35 +0930 Subject: [PATCH 07/24] Minor upgrades to android lidar support --- app/build.gradle | 6 ++--- .../vato/carcontroller/LIDAR/LidarView.java | 26 ++++++++++++++++++- .../org/vato/carcontroller/SLAM/SlamView.java | 15 +++++++++++ .../carcontroller/Updaters/GrpcUpdater.java | 1 + 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a662531..0818652 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,9 +36,9 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - implementation 'io.grpc:grpc-okhttp:1.28.1' // CURRENT_GRPC_VERSION - implementation 'io.grpc:grpc-protobuf-lite:1.28.1' // CURRENT_GRPC_VERSION - implementation 'io.grpc:grpc-stub:1.28.1' // CURRENT_GRPC_VERSION + implementation 'io.grpc:grpc-okhttp:1.29.0' // CURRENT_GRPC_VERSION + implementation 'io.grpc:grpc-protobuf-lite:1.29.0' // CURRENT_GRPC_VERSION + implementation 'io.grpc:grpc-stub:1.29.0' // CURRENT_GRPC_VERSION implementation 'javax.annotation:javax.annotation-api:1.2' implementation 'org.zeromq:jeromq:0.5.2' } diff --git a/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java b/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java index aad1dc4..12bd7ae 100644 --- a/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java +++ b/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java @@ -7,6 +7,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; +import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -115,8 +116,22 @@ public class LidarView extends SurfaceView public void stop() { - // TODO: Use grpc to tell zmq to stop. lidar.stop(); + StreamObserver responseObserver = new StreamObserver() { + @Override + public void onNext(Empty value) { + } + + @Override + public void onError(Throwable t) { + Log.d("LIDAR", "Failed to stop SLAM", t); + } + + @Override + public void onCompleted() { + } + }; + stub.stopTracking(Empty.newBuilder().build(), responseObserver); try { lidarThread.join(1000); } catch (InterruptedException e) { @@ -141,6 +156,15 @@ public class LidarView extends SurfaceView } } + /** + * + * @param groupNumber + * @return + */ + private static int convertGroupNumberToHue(int groupNumber){ + return 0; + } + private static class Point { private double x; private double y; diff --git a/app/src/main/java/org/vato/carcontroller/SLAM/SlamView.java b/app/src/main/java/org/vato/carcontroller/SLAM/SlamView.java index 55635b6..4b60ff6 100644 --- a/app/src/main/java/org/vato/carcontroller/SLAM/SlamView.java +++ b/app/src/main/java/org/vato/carcontroller/SLAM/SlamView.java @@ -7,6 +7,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; +import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -128,6 +129,20 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL public void stop() { // TODO: Use grpc to tell zmq to stop. slam.stop(); + stub.stopStreaming(Empty.newBuilder().build(), new StreamObserver() { + @Override + public void onNext(Empty value) { + } + + @Override + public void onError(Throwable t) { + Log.d("SLAM", "Failed to stop SLAM", t); + } + + @Override + public void onCompleted() { + } + }); try { mapThread.join(1000); } catch (InterruptedException e) { diff --git a/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java b/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java index 2ac8231..8e53a8f 100644 --- a/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java +++ b/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java @@ -17,6 +17,7 @@ public class GrpcUpdater extends AbstractUpdater { @Override public void stop() { + // TODO... may not be needed here. } From 7750fa80d77a8edba9aeda658670d85f530977c0 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sat, 30 May 2020 12:12:58 +0930 Subject: [PATCH 08/24] Include commented out macos lidar port in launch config --- .vscode/launch.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7c79804..3704543 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,9 +10,9 @@ "request": "launch", "module": "car", "env": { - "CAR_LIDAR": "LIDAR_MOCK", "CAR_VEHICLE": "CAR_MOCK", - // "LIDAR_DEVICE": "/dev/tty.usbserial-0001" + // "CAR_LIDAR": "/dev/tty.usbserial-0001", + "CAR_LIDAR": "LIDAR_MOCK" } }, { From 31d6bed897c232a11f6b9cdf031a7080b75a1f01 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 31 May 2020 16:01:43 +0930 Subject: [PATCH 09/24] Rework lidar cache to support grpc streaming --- .../vato/carcontroller/LIDAR/LidarView.java | 68 +++++++++++++++---- .../carcontroller/Updaters/GrpcUpdater.java | 2 +- .../proto/car/tracking/lidar_tracker.proto | 5 ++ pycar/src/car/tracking/lidar_cache.py | 38 +++++++---- pycar/src/car/tracking/lidar_servicer.py | 22 +++++- 5 files changed, 105 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java b/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java index 12bd7ae..6da157a 100644 --- a/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java +++ b/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java @@ -18,9 +18,14 @@ import com.google.protobuf.Empty; import org.vato.carcontroller.PersonTrackingGrpc; import org.vato.carcontroller.PointScan; +import org.vato.carcontroller.StreamMessage; import org.vato.carcontroller.Updaters.AbstractUpdater; +import org.vato.carcontroller.Updaters.GrpcUpdater; import org.vato.carcontroller.Updaters.ZmqUpdater; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import io.grpc.ManagedChannel; @@ -28,7 +33,8 @@ import io.grpc.ManagedChannelBuilder; import io.grpc.stub.StreamObserver; public class LidarView extends SurfaceView - implements AbstractUpdater.MapChangedListener { + implements AbstractUpdater.MapChangedListener, + GrpcUpdater.GrpcUpdateBootstrapper { private static final String LIDAR_TOPIC = "lidar_map"; @@ -36,7 +42,10 @@ public class LidarView extends SurfaceView private Thread lidarThread; private String port; private SurfaceHolder surfaceHolder; + private boolean useGrpcStreams; PersonTrackingGrpc.PersonTrackingStub stub; + private float timeBetweenMessages = 0.01f; + private Map groupNumPaints = new HashMap<>(); private int mBitmapX, mBitmapY, mViewWidth, mViewHeight; private Bitmap mBitmap; @@ -61,8 +70,14 @@ public class LidarView extends SurfaceView String host = prefs.getString("host", "10.0.0.53"); port = prefs.getString("zmqPort", "5050"); String gRPCPort = prefs.getString("port", "50051"); - lidar = new ZmqUpdater<>(PointScan.getDefaultInstance().getParserForType(), LIDAR_TOPIC, - host, port); + useGrpcStreams = prefs.getBoolean("use_grpc_streams", false); + + if (useGrpcStreams) { + lidar = new GrpcUpdater<>(PointScan.getDefaultInstance().getParserForType(), this); + } else { + lidar = new ZmqUpdater<>(PointScan.getDefaultInstance().getParserForType(), LIDAR_TOPIC, + host, port); + } lidar.addMapChangedListener(this); surfaceHolder = getHolder(); lidarThread = new Thread(lidar); @@ -75,7 +90,16 @@ public class LidarView extends SurfaceView * Called by MainActivity.onResume() to start a thread. */ public void resume() { - StreamObserver response = new StreamObserver() { + if (useGrpcStreams) { + lidarThread.start(); + } else { + doZmqLidarStream(); + } + } + + private void doZmqLidarStream() { + // use async grpc method, ZMQ doesn't need to connect straight away. + stub.startTracking(Empty.newBuilder().build(), new StreamObserver() { @Override public void onNext(Empty value) { lidarThread.start(); @@ -91,9 +115,7 @@ public class LidarView extends SurfaceView public void onCompleted() { // Don't care. } - }; - // use async grpc method, ZMQ doesn't need to connect straight away. - stub.startTracking(Empty.newBuilder().build(), response); + }); } @Override @@ -135,6 +157,7 @@ public class LidarView extends SurfaceView try { lidarThread.join(1000); } catch (InterruptedException e) { + Log.d("LIDAR", "Lidar failed to join", e); } } @@ -148,8 +171,18 @@ public class LidarView extends SurfaceView Collectors.toList())) { // Now for each point, draw a circle for the point (so it's big enough) in the correct spot, // and create a colour for that point to paint it correctly. - // TODO: Dynamically change the colour of the paint object based on the point group number. - canvas.drawCircle((float) point.x, (float) point.y, 5, new Paint()); + if (!groupNumPaints.containsKey(point.groupNumber)) { + Paint paint = new Paint(); + paint.setColor( + Color.HSVToColor(new float[]{convertGroupNumberToHue( + point.groupNumber), 1f, 1f})); + groupNumPaints.put(point.groupNumber, paint); + } + + // TODO: + canvas.drawCircle((float) point.x, (float) point.y, 5, + Objects.requireNonNull(groupNumPaints + .get(point.groupNumber))); // Can't be null as we just added it. } canvas.restore(); surfaceHolder.unlockCanvasAndPost(canvas); @@ -157,17 +190,24 @@ public class LidarView extends SurfaceView } /** - * * @param groupNumber * @return */ - private static int convertGroupNumberToHue(int groupNumber){ - return 0; + private static int convertGroupNumberToHue(int groupNumber) { + return (43 * groupNumber) % 360; + } + + @Override + public void bootstrap(StreamObserver responseObserver) { + stub.lidarStream( + StreamMessage.newBuilder().setTimeBetweenMessages(timeBetweenMessages).build(), + responseObserver); } private static class Point { private double x; private double y; + private int groupNumber; private Point(double x, double y) { this.x = x; @@ -175,7 +215,9 @@ public class LidarView extends SurfaceView } static Point fromProtoPoint(org.vato.carcontroller.Point point) { - return fromHist(point.getDistance(), point.getAngle()); + Point p = fromHist(point.getDistance(), point.getAngle()); + p.groupNumber = point.getGroupNumber(); + return p; } static Point fromHist(double distance, double angle) { diff --git a/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java b/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java index 8e53a8f..ab48e8d 100644 --- a/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java +++ b/app/src/main/java/org/vato/carcontroller/Updaters/GrpcUpdater.java @@ -10,7 +10,7 @@ import io.grpc.stub.StreamObserver; public class GrpcUpdater extends AbstractUpdater { GrpcUpdateBootstrapper bootstrapper; - public GrpcUpdater(Parser parser, GrpcUpdateBootstrapper bootstrapper) { + public GrpcUpdater(Parser parser, GrpcUpdateBootstrapper bootstrapper) { super(parser); this.bootstrapper = bootstrapper; } diff --git a/protobuf/src/main/proto/car/tracking/lidar_tracker.proto b/protobuf/src/main/proto/car/tracking/lidar_tracker.proto index 860211f..b4806b7 100644 --- a/protobuf/src/main/proto/car/tracking/lidar_tracker.proto +++ b/protobuf/src/main/proto/car/tracking/lidar_tracker.proto @@ -24,6 +24,9 @@ message PointScan{ repeated Point points = 1; } +message StreamMessage{ + float time_between_messages = 1; +} service PersonTracking{ rpc set_tracking_group(Int32Value) returns (google.protobuf.Empty) {} @@ -36,4 +39,6 @@ service PersonTracking{ rpc save_lidar(MotorControl.SaveRequest) returns (google.protobuf.Empty) {} + rpc lidar_stream(StreamMessage) returns (stream PointScan) {} + } \ No newline at end of file diff --git a/pycar/src/car/tracking/lidar_cache.py b/pycar/src/car/tracking/lidar_cache.py index f7551b3..ede6f69 100644 --- a/pycar/src/car/tracking/lidar_cache.py +++ b/pycar/src/car/tracking/lidar_cache.py @@ -10,7 +10,7 @@ import time class LidarCache(): """ A class that retrieves scans from the lidar, - runs grouping algorithms between scans and + runs grouping algorithms on the scans and keeps a copy of the group data. """ @@ -56,16 +56,10 @@ class LidarCache(): else: self.currentGroups = algorithms.calc_groups(scan) - self.fireGroupsChanged() + self._fireGroupsChanged() - def fireGroupsChanged(self): - # Send the updated groups to 0MQ socket. - # Rename this to be a generic listener method, rather than an explicit 'send' (even though it can be treated as such already) - pointScan = tracker_pb.PointScan() - for group in self.currentGroups: - for point in group.get_points(): - pointScan.points.append(tracker_pb.Point( - angle=point[1], distance=point[2], group_number=group.number)) + def _fireGroupsChanged(self): + pointScan = self.current_scan for listener in self._group_listeners: listener(pointScan) @@ -81,15 +75,33 @@ class LidarCache(): listener An function that takes a PointScan proto object as its argument. """ - self._group_listeners.append(listener) + if(listener not in self._group_listeners): + self._group_listeners.append(listener) + + def clear_listeners(self): + """ + Clear all group change listeners. + """ + self._group_listeners = [] + + @property + def current_scan(self): + pointScan = tracker_pb.PointScan() + for group in self.currentGroups: + for point in group.get_points(): + pointScan.points.append(tracker_pb.Point( + angle=point[1], distance=point[2], group_number=group.number)) + return pointScan def stop_scanning(self): self.run = False + if __name__ == '__main__': - lidar = MockLidar(iter(lidar_loader.load_scans_bytes_file('car/src/car/tracking/out.pickle'))) + lidar = MockLidar(iter(lidar_loader.load_scans_bytes_file( + 'car/src/car/tracking/out.pickle'))) cache = LidarCache(lidar) - cache.add_groups_changed_listener(lambda a : print(a)) + cache.add_groups_changed_listener(lambda a: print(a)) cache.start_cache() time.sleep(1) cache.stop_scanning() diff --git a/pycar/src/car/tracking/lidar_servicer.py b/pycar/src/car/tracking/lidar_servicer.py index bb41106..51c4ccc 100644 --- a/pycar/src/car/tracking/lidar_servicer.py +++ b/pycar/src/car/tracking/lidar_servicer.py @@ -10,6 +10,7 @@ from car.messaging import messages import car.tracking.algorithms as alg import os import google.protobuf.empty_pb2 as empty +import time class LidarServicer(PersonTrackingServicer): @@ -18,7 +19,6 @@ class LidarServicer(PersonTrackingServicer): self._lidar = RecordingLidarDecorator( lidar_factory.get_lidar()) self.cache = LidarCache(self._lidar, measurements=100) - self.cache.add_groups_changed_listener(self.onGroupsChanged) self._mFactory = None self._port = 50052 if 'CAR_ZMQ_PORT' not in os.environ else os.environ[ 'CAR_ZMQ_PORT'] @@ -32,18 +32,22 @@ class LidarServicer(PersonTrackingServicer): return empty.Empty() def stop_tracking(self, request, context): + print('Stopping tracking') self._should_stream = False self.cache.stop_scanning() + self.cache.clear_listeners() return empty.Empty() def start_tracking(self, request, context): """Starts the lidar cache, streaming on the provided port.""" self._should_stream = True + # Want to rework this, like the sleam streamer/processer rework. + self.cache.add_groups_changed_listener(self.zmq_stream_listener) self.cache.start_cache() return empty.Empty() def record(self, request, context): - # TODO: Fix this to not require + # TODO: Fix this to not require actually running the cache, just recording the lidar. if request.value: self.cache.start_cache() else: @@ -55,7 +59,17 @@ class LidarServicer(PersonTrackingServicer): self._lidar.save_data(request.file) return empty.Empty() - def onGroupsChanged(self, message): + def lidar_stream(self, request, context): + # Streams the state of the lidar cache. + print('Received Lidar gRPC Stream Start Request') + self._should_stream = True + self.cache.start_cache() + sleep_time = request.time_between_messages if request.time_between_messages > 0.01 else 0.01 + while self._should_stream: + time.sleep(sleep_time) + yield self.cache.current_scan + + def zmq_stream_listener(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) @@ -64,8 +78,10 @@ class LidarServicer(PersonTrackingServicer): self._mFactory.send_message_topic( "lidar_map", messages.ProtoMessage(message=message.SerializeToString())) + def on_groups_changed(self, message): if self._tracked_group is not None and self._vehicle is not None: # Update vehicle to correctly follow the tracked group. # Leave for now, need to work out exactly how this will change. # alg.dualServoChange(alg.find_centre()) + # Put this in a separate module I think, shouldn't control the can autonomously from the servicer. pass From e54db7c007870b11b3eca7cca61d60e8a693fa33 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 31 May 2020 16:02:03 +0930 Subject: [PATCH 10/24] Update to Android Studio 4 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 97cfbbf..60d7f78 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.0' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10' // NOTE: Do not place your application dependencies here; they belong From 3711597433fb77aa39ecde1dea0f130b03ad8fd7 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 31 May 2020 16:03:07 +0930 Subject: [PATCH 11/24] Start upgrading grouping algorithm to be more performant in python --- pycar/src/car/tracking/algorithms.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index 8f4df7a..13652e0 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -1,4 +1,5 @@ import math +import numpy as np class Group: @@ -134,6 +135,17 @@ def calc_groups(scan): return allGroups +def calc_groups_edge_algorithm(scan): + """ + Calculates groups using an edge algorithm. This takes advantage of numpy arrays + and vectorisation, rather than the primitive python loop grouping, resulting in + faster grouping speeds. + """ + allGroups = [] + scanArray = np.array(scan) + +def edge_algorithm(): + pass def find_centre(group): """ From e5c64f734351eba17891e952c6ecf161054fc5c2 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 31 May 2020 18:06:56 +0930 Subject: [PATCH 12/24] Update gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 58694 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 ++ gradlew.bat | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577df6c95960ba7077c43220e5bb2c0d9..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch delta 6447 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 F{|nTN-B$nr diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b4429..a4f0001 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7..fbd7c51 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 9109989..a9f778a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -84,6 +84,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% From 57cea7ef60093c201a1ccf9db65139d8ff7c1e93 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 31 May 2020 18:07:42 +0930 Subject: [PATCH 13/24] Start fixing algorithms --- pycar/src/car/tracking/algorithms.py | 45 +++++++++++++++++++-------- pycar/src/car/tracking/lidar_cache.py | 9 +++--- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index 13652e0..182c61c 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -109,32 +109,37 @@ def calc_groups(scan): List of groups that were found. """ prevPoint = None - currentGroup = None - allGroups = [] + currentGroup = Group(0) + allGroups = [currentGroup] currentGroupNumber = 0 - + num_iters = 0 # assume the list is already sorted. for point in scan: + num_iters += 1 if prevPoint is None: prevPoint = point + currentGroup.add_point(point) continue # Distances are in mm. - # within 1cm makes a group. Will need to play around with this. - if (point[2] - prevPoint[2]) ** 2 < 10 ** 2: - if currentGroup is None: - currentGroup = Group(currentGroupNumber) - allGroups.append(currentGroup) + # within 10cm makes a group. Will need to play around with this. + if (point[2] - prevPoint[2]) ** 2 < 100 ** 2: currentGroup.add_point(point) else: - if currentGroup is not None: - currentGroupNumber += 1 - currentGroup = None + currentGroupNumber += 1 + currentGroup = Group(currentGroupNumber) + currentGroup.add_point(point) + allGroups.append(currentGroup) prevPoint = point + print(num_iters) + print(len(allGroups)) + for group in allGroups: + print(len(group.get_points())) return allGroups + def calc_groups_edge_algorithm(scan): """ Calculates groups using an edge algorithm. This takes advantage of numpy arrays @@ -144,9 +149,11 @@ def calc_groups_edge_algorithm(scan): allGroups = [] scanArray = np.array(scan) + def edge_algorithm(): pass + def find_centre(group): """ Gets a tuple (x,y) of the centre of the group. @@ -168,13 +175,25 @@ def assign_groups(prev_groups, new_groups): """ Assigns group numbers to a new scan based on the groups of an old scan. """ + max_group_number = 0 + unassigned_groups = [] for group in prev_groups: old_centre = find_centre(group) for new_group in new_groups: new_centre = find_centre(new_group) - # They are considered the same if the new group and old group centres are within 5cm. - if ((new_centre[0] - old_centre[0]) ** 2 + (new_centre[1] - old_centre[1]) ** 2) < 50 ** 2: + # They are considered the same if the new group and old group centres are within 10cm. + if ((new_centre[0] - old_centre[0]) ** 2 + (new_centre[1] - old_centre[1]) ** 2) < 100 ** 2: new_group.number = group.number + if group.number > max_group_number: + max_group_number = group.number + continue + # If this is reached, then no matching groups were found. + unassigned_groups.append(new_group) + + + for group in unassigned_groups: + max_group_number += 1 + group.number = max_group_number return new_groups diff --git a/pycar/src/car/tracking/lidar_cache.py b/pycar/src/car/tracking/lidar_cache.py index ede6f69..3c7442d 100644 --- a/pycar/src/car/tracking/lidar_cache.py +++ b/pycar/src/car/tracking/lidar_cache.py @@ -5,6 +5,7 @@ import zmq from car.tracking.devices.mock_lidar import MockLidar import car.tracking.lidar_loader as lidar_loader import time +import timeit class LidarCache(): @@ -49,6 +50,7 @@ class LidarCache(): if not self.run: break + start_time = time.time() # Now process the groups. if self.currentGroups is not None: self.currentGroups = algorithms.assign_groups( @@ -56,6 +58,7 @@ class LidarCache(): else: self.currentGroups = algorithms.calc_groups(scan) + print("total time: " + (str)(time.time() - start_time)) self._fireGroupsChanged() def _fireGroupsChanged(self): @@ -99,9 +102,7 @@ class LidarCache(): if __name__ == '__main__': lidar = MockLidar(iter(lidar_loader.load_scans_bytes_file( - 'car/src/car/tracking/out.pickle'))) + 'pycar/src/car/tracking/out.pickle'))) cache = LidarCache(lidar) - cache.add_groups_changed_listener(lambda a: print(a)) + # cache.add_groups_changed_listener(lambda a: print(a)) cache.start_cache() - time.sleep(1) - cache.stop_scanning() From 0f1110aeb075ccbfff3dcfb9315ce9a6593a92ea Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 31 May 2020 18:18:56 +0930 Subject: [PATCH 14/24] Fix points between groups scoping issues. --- pycar/src/car/tracking/algorithms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index 182c61c..fc53ba0 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -4,8 +4,8 @@ import numpy as np class Group: - def __init__(self, number, points=[]): - self._points = points + def __init__(self, number): + self._points = [] self._number = number self._minX = None self._maxX = None From 14d3a64c7f3363aef6f887fdd3c9dede72c0c693 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Mon, 1 Jun 2020 18:16:59 +0930 Subject: [PATCH 15/24] Fix concurrent access of current groups --- pycar/src/car/tracking/lidar_cache.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pycar/src/car/tracking/lidar_cache.py b/pycar/src/car/tracking/lidar_cache.py index 3c7442d..102f3fb 100644 --- a/pycar/src/car/tracking/lidar_cache.py +++ b/pycar/src/car/tracking/lidar_cache.py @@ -42,7 +42,7 @@ class LidarCache(): # 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 for scan in self.lidar.iter_scans(min_len=self.measurements): - print('Got %d measurments' % (len(scan))) + print('Got %d measurements' % (len(scan))) if len(scan) < self.measurements: # Poor scan, likely since it was the first scan. continue @@ -90,7 +90,8 @@ class LidarCache(): @property def current_scan(self): pointScan = tracker_pb.PointScan() - for group in self.currentGroups: + tempGroups = self.currentGroups + for group in tempGroups: for point in group.get_points(): pointScan.points.append(tracker_pb.Point( angle=point[1], distance=point[2], group_number=group.number)) From 49c1e90c4ef8b87bfec967540ceb6ac052995c49 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Tue, 2 Jun 2020 20:33:01 +0930 Subject: [PATCH 16/24] Remove debug stuff, lidar streaming working. Tracking still not working correctly, due to assign groups not working propery. --- .../vato/carcontroller/LIDAR/LidarView.java | 40 ++++++++++++++----- app/src/main/res/xml/root_preferences.xml | 8 ++++ pycar/src/car/tracking/algorithms.py | 9 +---- pycar/src/car/tracking/animate_alg.py | 4 +- pycar/src/car/tracking/lidar_cache.py | 4 -- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java b/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java index 6da157a..0d9c545 100644 --- a/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java +++ b/app/src/main/java/org/vato/carcontroller/LIDAR/LidarView.java @@ -2,7 +2,6 @@ package org.vato.carcontroller.LIDAR; import android.content.Context; import android.content.SharedPreferences; -import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; @@ -44,11 +43,10 @@ public class LidarView extends SurfaceView private SurfaceHolder surfaceHolder; private boolean useGrpcStreams; PersonTrackingGrpc.PersonTrackingStub stub; - private float timeBetweenMessages = 0.01f; + private float timeBetweenMessages; private Map groupNumPaints = new HashMap<>(); - private int mBitmapX, mBitmapY, mViewWidth, mViewHeight; - private Bitmap mBitmap; + private int mViewWidth, mViewHeight, centreX, centreY; public LidarView(Context context) { super(context); @@ -71,6 +69,7 @@ public class LidarView extends SurfaceView port = prefs.getString("zmqPort", "5050"); String gRPCPort = prefs.getString("port", "50051"); useGrpcStreams = prefs.getBoolean("use_grpc_streams", false); + timeBetweenMessages = prefs.getFloat("lidar_timeout", 0.1f); if (useGrpcStreams) { lidar = new GrpcUpdater<>(PointScan.getDefaultInstance().getParserForType(), this); @@ -121,6 +120,10 @@ public class LidarView extends SurfaceView @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); + mViewWidth = w; + mViewHeight = h; + centreX = w / 2; + centreY = h / 2; } @Override @@ -167,8 +170,23 @@ public class LidarView extends SurfaceView Canvas canvas = surfaceHolder.lockCanvas(); canvas.save(); canvas.drawColor(Color.WHITE); - for (Point point : points.getPointsList().stream().map(Point::fromProtoPoint).collect( - Collectors.toList())) { + // TODO: Do an initial pass to find the max distance, which will be a scale factor for the other points. + double maxDistance = 0; + for (org.vato.carcontroller.Point point : points.getPointsList()) { + if (point.getDistance() > maxDistance) { + maxDistance = point.getDistance(); + } + } + + final double maxDistanceFinal = maxDistance; + + // Apply scaling factor from max distance. + for (Point point : points.getPointsList().stream().map( + point -> org.vato.carcontroller.Point.newBuilder(point).setDistance( + point.getDistance() / maxDistanceFinal * mViewHeight).build()).map( + Point::fromProtoPoint) + .collect( + Collectors.toList())) { // Now for each point, draw a circle for the point (so it's big enough) in the correct spot, // and create a colour for that point to paint it correctly. if (!groupNumPaints.containsKey(point.groupNumber)) { @@ -178,9 +196,8 @@ public class LidarView extends SurfaceView point.groupNumber), 1f, 1f})); groupNumPaints.put(point.groupNumber, paint); } - - // TODO: - canvas.drawCircle((float) point.x, (float) point.y, 5, + canvas.drawCircle((float) point.x + centreX, + (float) point.y + centreY, 5, Objects.requireNonNull(groupNumPaints .get(point.groupNumber))); // Can't be null as we just added it. } @@ -189,6 +206,7 @@ public class LidarView extends SurfaceView } } + /** * @param groupNumber * @return @@ -225,8 +243,8 @@ public class LidarView extends SurfaceView } static Point fromHist(double distance, double angle, Point offset) { - return new Point(distance * Math.sin(angle) + offset.x, - distance * Math.cos(angle) + offset.y); + return new Point(distance * Math.sin(Math.toRadians(angle)) + offset.x, + distance * Math.cos(Math.toRadians(angle)) + offset.y); } } diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 5b0612d..c72974a 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -46,6 +46,14 @@ + + + + max_group_number: max_group_number = group.number diff --git a/pycar/src/car/tracking/animate_alg.py b/pycar/src/car/tracking/animate_alg.py index e076542..44271c1 100644 --- a/pycar/src/car/tracking/animate_alg.py +++ b/pycar/src/car/tracking/animate_alg.py @@ -2,7 +2,7 @@ Animates distances and angle of lidar Uses model-free algorithms to track grouping of points (objects/groups) """ -from tracking.mock_lidar import MockLidar +from car.tracking.devices.mock_lidar import MockLidar import matplotlib.pyplot as plt import numpy as np import matplotlib.animation as animation @@ -35,7 +35,7 @@ class Bunch: def run(): - lidar = MockLidar(loader.load_scans_bytes_file("tracking/out.pickle")) + lidar = MockLidar(loader.load_scans_bytes_file("pycar/src/car/tracking/out.pickle")) fig = plt.figure() ax = plt.subplot(111, projection='polar') line = ax.scatter([0, 0], [0, 0], s=5, c=[IMIN, IMAX], diff --git a/pycar/src/car/tracking/lidar_cache.py b/pycar/src/car/tracking/lidar_cache.py index 102f3fb..673ea66 100644 --- a/pycar/src/car/tracking/lidar_cache.py +++ b/pycar/src/car/tracking/lidar_cache.py @@ -4,8 +4,6 @@ import car.tracking.lidar_tracker_pb2 as tracker_pb import zmq from car.tracking.devices.mock_lidar import MockLidar import car.tracking.lidar_loader as lidar_loader -import time -import timeit class LidarCache(): @@ -50,7 +48,6 @@ class LidarCache(): if not self.run: break - start_time = time.time() # Now process the groups. if self.currentGroups is not None: self.currentGroups = algorithms.assign_groups( @@ -58,7 +55,6 @@ class LidarCache(): else: self.currentGroups = algorithms.calc_groups(scan) - print("total time: " + (str)(time.time() - start_time)) self._fireGroupsChanged() def _fireGroupsChanged(self): From 07f39dbe3deb19b3005bf922e89d85af161217f6 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Tue, 9 Jun 2020 21:34:50 +0930 Subject: [PATCH 17/24] Start adding icp algorithms --- pycar/src/car/tracking/icp.py | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 pycar/src/car/tracking/icp.py diff --git a/pycar/src/car/tracking/icp.py b/pycar/src/car/tracking/icp.py new file mode 100644 index 0000000..439bad1 --- /dev/null +++ b/pycar/src/car/tracking/icp.py @@ -0,0 +1,71 @@ +""" +A module that includes algorithms to execute the Iterative Closest Point (ICP) algorithm in Besl (1992) + +This algorithm reshapes (registers) a set of points to match those in another data set. In object tracking, +this basically moves the tracked groups to be in line with the correct position in the new scan. Additionally, it +can provide an estimation as to how the tracked groups have moved. +""" + +import math +import numpy as np + +def closest_points(data_shape, model_shape): + """ + Returns the closest points from data to model in the same order as the data shape. + """ + def calc_closest_point(data, model_vector): + current_closest = np.array([[0,0]]) + min_distance = -1 + # Could vectorise this, but the speed advantage would be minimal + for point in model_vector: + euclid_d = euclid_distance(data, point) + if min_distance < 0 or euclid_d < min_distance: + current_closest = point + min_distance = euclid_d + return current_closest + + closest_func = np.vectorize(calc_closest_point) + return closest_func(data_shape, model_shape) + +def euclid_distance(point1, point2): + return math.sqrt(((point1[0] - point2[0]) ** 2) + ((point1[1] - point2[1]) ** 2)) + +def calc_mse(points): + """ + Calculates the mean squared error for the points, after a registration. + """ + pass + +def calc_cross_cov(data: np.ndarray, model: np.ndarray) -> np.ndarray: + """ + Calculates the cross covariance matrix of the two point clouds. + """ + return (data.dot(model.T).sum(0) / data.shape[0]) - calc_mass_centre(data).dot(calc_mass_centre(model).T) + +def calc_quaternion(cross_cov): + """ + Calculates the optimal unit quaternion (the optimal rotation for this iteration3,3) + """ + pass + +def calc_translation(optimal_rotation, mass_centre_data, mass_centre_model): + """ + Calculates the optimal translation with the given (optimal) quaternion (which is converted to a rotation + matrix within the funtion) + """ + pass + +def calc_rotation_matrix(q): + """ + Returns the rotation matrix for the given unit quaternion. + """ + return np.array([[[q[0] ** 2 + q[1] ** 2 + q[2] ** 2 + q[3] ** 2], [2 * (q[1] * q[2] - q[0] * q[3])], [2 * (q[1] * q[3] - q[0] * q[2])]], + []]) + +def calc_mass_centre(points: np.ndarray) -> np.ndarray: + """ + Calculates the point at the centre of mass for the given set of points. + + The returned vector is in form 1xn, where point set is of shape mxn + """ + return points.sum(0) / len(points) \ No newline at end of file From 3710255703957a9c9169c9add86b8575f3792c97 Mon Sep 17 00:00:00 2001 From: michaelpivato Date: Wed, 10 Jun 2020 12:24:56 +0930 Subject: [PATCH 18/24] More functions added --- pycar/src/car/tracking/icp.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pycar/src/car/tracking/icp.py b/pycar/src/car/tracking/icp.py index 439bad1..9dd1876 100644 --- a/pycar/src/car/tracking/icp.py +++ b/pycar/src/car/tracking/icp.py @@ -42,11 +42,19 @@ def calc_cross_cov(data: np.ndarray, model: np.ndarray) -> np.ndarray: """ return (data.dot(model.T).sum(0) / data.shape[0]) - calc_mass_centre(data).dot(calc_mass_centre(model).T) -def calc_quaternion(cross_cov): +def calc_delta(cross_cov): + A = (cross_cov - cross_cov.T) + return np.ndarray([[A[2][3]], [A[3][1]], [A[1][2]]]) + +def calc_quaternion(cross_cov, delta): """ Calculates the optimal unit quaternion (the optimal rotation for this iteration3,3) """ - pass + Q = np.array([[[cross_cov.trace()], [delta.T]], + [[delta], [cross_cov + cross_cov.T - cross_cov.trace().dot(np.identity(3))]]]) + eigen_values, eigen_vectors = np.linalg.eig(Q) + optimal_eigen_index = eigen_values[eigen_values == eigen_values.max()][0] + return eigen_vectors[:,optimal_eigen_index] def calc_translation(optimal_rotation, mass_centre_data, mass_centre_model): """ @@ -60,7 +68,8 @@ def calc_rotation_matrix(q): Returns the rotation matrix for the given unit quaternion. """ return np.array([[[q[0] ** 2 + q[1] ** 2 + q[2] ** 2 + q[3] ** 2], [2 * (q[1] * q[2] - q[0] * q[3])], [2 * (q[1] * q[3] - q[0] * q[2])]], - []]) + [[2 * (q[1] * q[2] + q[0] * q[3])], [q[0] ** 2 + q[2] ** 2 - q[1] ** 2 - q[3] **2], [2 * (q[2] * q[3] - q[0] * q[1])]], + [[2 * (q[1] * q[3] - q[0] * q[2])], [2 * (q[2] * q[3] + q[0] * q[1])], [2 * (q[2] * q[3] + q[0] * q[1])], [q[0] ** 2 + q[3] ** 2- q[1] ** 2 - q[2] ** 2]]]) def calc_mass_centre(points: np.ndarray) -> np.ndarray: """ From 1cd2e2c23798ee90efa4fd94a8a393ab88497de8 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sat, 13 Jun 2020 10:21:40 +0930 Subject: [PATCH 19/24] Finish ICP algorithms --- pycar/src/car/tracking/icp.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/pycar/src/car/tracking/icp.py b/pycar/src/car/tracking/icp.py index 9dd1876..1c454dd 100644 --- a/pycar/src/car/tracking/icp.py +++ b/pycar/src/car/tracking/icp.py @@ -9,12 +9,13 @@ can provide an estimation as to how the tracked groups have moved. import math import numpy as np + def closest_points(data_shape, model_shape): """ Returns the closest points from data to model in the same order as the data shape. """ def calc_closest_point(data, model_vector): - current_closest = np.array([[0,0]]) + current_closest = np.array([[0, 0]]) min_distance = -1 # Could vectorise this, but the speed advantage would be minimal for point in model_vector: @@ -27,14 +28,17 @@ def closest_points(data_shape, model_shape): closest_func = np.vectorize(calc_closest_point) return closest_func(data_shape, model_shape) + def euclid_distance(point1, point2): return math.sqrt(((point1[0] - point2[0]) ** 2) + ((point1[1] - point2[1]) ** 2)) -def calc_mse(points): + +def calc_mse(data, model, quaternion, translation): """ Calculates the mean squared error for the points, after a registration. """ - pass + return (translation - calc_rotation_matrix(quaternion).dot(data) - translation).sum(0) / len(data) + def calc_cross_cov(data: np.ndarray, model: np.ndarray) -> np.ndarray: """ @@ -42,39 +46,45 @@ def calc_cross_cov(data: np.ndarray, model: np.ndarray) -> np.ndarray: """ return (data.dot(model.T).sum(0) / data.shape[0]) - calc_mass_centre(data).dot(calc_mass_centre(model).T) + def calc_delta(cross_cov): A = (cross_cov - cross_cov.T) return np.ndarray([[A[2][3]], [A[3][1]], [A[1][2]]]) + def calc_quaternion(cross_cov, delta): """ Calculates the optimal unit quaternion (the optimal rotation for this iteration3,3) """ - Q = np.array([[[cross_cov.trace()], [delta.T]], - [[delta], [cross_cov + cross_cov.T - cross_cov.trace().dot(np.identity(3))]]]) + Q = np.array([[[cross_cov.trace()], [delta.T]], + [[delta], [cross_cov + cross_cov.T - cross_cov.trace().dot(np.identity(3))]]]) eigen_values, eigen_vectors = np.linalg.eig(Q) optimal_eigen_index = eigen_values[eigen_values == eigen_values.max()][0] - return eigen_vectors[:,optimal_eigen_index] + return eigen_vectors[:, optimal_eigen_index] + def calc_translation(optimal_rotation, mass_centre_data, mass_centre_model): """ Calculates the optimal translation with the given (optimal) quaternion (which is converted to a rotation matrix within the funtion) """ - pass + return mass_centre_model - optimal_rotation.dot(mass_centre_data) + def calc_rotation_matrix(q): """ Returns the rotation matrix for the given unit quaternion. """ - return np.array([[[q[0] ** 2 + q[1] ** 2 + q[2] ** 2 + q[3] ** 2], [2 * (q[1] * q[2] - q[0] * q[3])], [2 * (q[1] * q[3] - q[0] * q[2])]], - [[2 * (q[1] * q[2] + q[0] * q[3])], [q[0] ** 2 + q[2] ** 2 - q[1] ** 2 - q[3] **2], [2 * (q[2] * q[3] - q[0] * q[1])]], - [[2 * (q[1] * q[3] - q[0] * q[2])], [2 * (q[2] * q[3] + q[0] * q[1])], [2 * (q[2] * q[3] + q[0] * q[1])], [q[0] ** 2 + q[3] ** 2- q[1] ** 2 - q[2] ** 2]]]) - + return np.array([[[q[0] ** 2 + q[1] ** 2 + q[2] ** 2 + q[3] ** 2], [2 * (q[1] * q[2] - q[0] * q[3])], [2 * (q[1] * q[3] - q[0] * q[2])]], + [[2 * (q[1] * q[2] + q[0] * q[3])], [q[0] ** 2 + q[2] ** 2 - + q[1] ** 2 - q[3] ** 2], [2 * (q[2] * q[3] - q[0] * q[1])]], + [[2 * (q[1] * q[3] - q[0] * q[2])], [2 * (q[2] * q[3] + q[0] * q[1])], [2 * (q[2] * q[3] + q[0] * q[1])], [q[0] ** 2 + q[3] ** 2 - q[1] ** 2 - q[2] ** 2]]]) + + def calc_mass_centre(points: np.ndarray) -> np.ndarray: """ Calculates the point at the centre of mass for the given set of points. The returned vector is in form 1xn, where point set is of shape mxn """ - return points.sum(0) / len(points) \ No newline at end of file + return points.sum(0) / len(points) From ec677890c45012495f1d488b981b8c673c1e5031 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 14 Jun 2020 19:48:13 +0930 Subject: [PATCH 20/24] Start adding updated assign groups algorithm --- pycar/src/car/tracking/algorithms.py | 14 +++++++++++++- pycar/src/car/tracking/animate.py | 2 +- pycar/src/car/tracking/icp.py | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index 036712e..68446dc 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -1,6 +1,6 @@ import math import numpy as np - +from . import icp class Group: @@ -190,6 +190,18 @@ def assign_groups(prev_groups, new_groups): return new_groups +def assign_groups_II(prev_groups, new_groups): + """ + Performs the assign groups algorithm, but instead of being greedy to assign, it will match up the + closest groups for each group. + + Additionally, the centre of mass for a group of points is now used, which is less prone to the effects of + outliers as the existing find_centre algorithm. + """ + max_group_number = 0 + unassigned_groups = [] + new_group_centers = numpy.array() + def updateCarVelocity(oldGroup, newGroup): """ diff --git a/pycar/src/car/tracking/animate.py b/pycar/src/car/tracking/animate.py index 3e31974..0066137 100755 --- a/pycar/src/car/tracking/animate.py +++ b/pycar/src/car/tracking/animate.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 '''Animates distances and measurment quality''' -from car.tracking.mock_lidar import MockLidar +from car.tracking..devices.mock_lidar import MockLidar import matplotlib.pyplot as plt import numpy as np import matplotlib.animation as animation diff --git a/pycar/src/car/tracking/icp.py b/pycar/src/car/tracking/icp.py index 1c454dd..384e042 100644 --- a/pycar/src/car/tracking/icp.py +++ b/pycar/src/car/tracking/icp.py @@ -4,6 +4,9 @@ A module that includes algorithms to execute the Iterative Closest Point (ICP) a This algorithm reshapes (registers) a set of points to match those in another data set. In object tracking, this basically moves the tracked groups to be in line with the correct position in the new scan. Additionally, it can provide an estimation as to how the tracked groups have moved. + +NOTE: This module is thus far untested -> it may be used in the future, and will be tested then, but for +now was created to provide a deeper understanding of ICP and related algorithms. """ import math From ecca22d7d4e503d93c7eb263cb9370fe4ad81ad2 Mon Sep 17 00:00:00 2001 From: michaelpivato Date: Mon, 15 Jun 2020 12:29:11 +0930 Subject: [PATCH 21/24] More work on new assign groups algorithm. --- pycar/src/car/tracking/algorithms.py | 31 ++++++++++++++++++++++----- pycar/src/car/tracking/lidar_cache.py | 2 +- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index 68446dc..6f20cb3 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -2,6 +2,7 @@ import math import numpy as np from . import icp + class Group: def __init__(self, number): @@ -105,8 +106,8 @@ def calc_groups(scan): Returns ------- - list - List of groups that were found. + ndarray + Array of groups that were found. """ prevPoint = None currentGroup = Group(0) @@ -130,7 +131,7 @@ def calc_groups(scan): allGroups.append(currentGroup) prevPoint = point - return allGroups + return np.array(allGroups) def calc_groups_edge_algorithm(scan): @@ -183,13 +184,13 @@ def assign_groups(prev_groups, new_groups): # If this is reached, then no matching groups were found. unassigned_groups.append(new_group) - for group in unassigned_groups: max_group_number += 1 group.number = max_group_number return new_groups + def assign_groups_II(prev_groups, new_groups): """ Performs the assign groups algorithm, but instead of being greedy to assign, it will match up the @@ -197,10 +198,30 @@ def assign_groups_II(prev_groups, new_groups): Additionally, the centre of mass for a group of points is now used, which is less prone to the effects of outliers as the existing find_centre algorithm. + + An ICP rotation/translation is not made in this algorithm, as it's assumed that the scans are quick enough for + there to not be a significant difference between scans that would require ICP. """ max_group_number = 0 unassigned_groups = [] - new_group_centers = numpy.array() + + def centres_from_groups(group): + return icp.calc_mass_centre(np.array(group.points)) + + centre_func = np.vectorize(centres_from_groups) + old_group_centres = centre_func(prev_groups) + old_group_indexes = np.arange(len(old_group_centres)) + + new_group_centers = centre_func(new_groups) + new_group_indexes = np.arange(len(new_group_centers)) + + closest_points = icp.closest_points(new_group_centers, old_group_centres) + # Now assign the new groups to the closest matching old group, if the distance is within a certain threshold. + for i, point in enumerate(closest_points): + matching_groups = prev_groups[old_group_centres == point] + new_groups[i].number = prev_groups[0].number + + return new_groups def updateCarVelocity(oldGroup, newGroup): diff --git a/pycar/src/car/tracking/lidar_cache.py b/pycar/src/car/tracking/lidar_cache.py index 673ea66..5d1df91 100644 --- a/pycar/src/car/tracking/lidar_cache.py +++ b/pycar/src/car/tracking/lidar_cache.py @@ -50,7 +50,7 @@ class LidarCache(): # Now process the groups. if self.currentGroups is not None: - self.currentGroups = algorithms.assign_groups( + self.currentGroups = algorithms.assign_groups_II( self.currentGroups, algorithms.calc_groups(scan)) else: self.currentGroups = algorithms.calc_groups(scan) From 1172647481992a669344395e3c0ae1fa05601b67 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Mon, 15 Jun 2020 20:38:14 +0930 Subject: [PATCH 22/24] Fix up bugs with assign groups 2 --- pycar/src/car/tracking/algorithms.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index 6f20cb3..db8f35b 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -205,20 +205,20 @@ def assign_groups_II(prev_groups, new_groups): max_group_number = 0 unassigned_groups = [] - def centres_from_groups(group): - return icp.calc_mass_centre(np.array(group.points)) + def centres_from_groups(groups): + return np.array([icp.calc_mass_centre(np.array([convert_lidar_to_cartesian(point) for point in group.get_points()])) for group in groups]) - centre_func = np.vectorize(centres_from_groups) - old_group_centres = centre_func(prev_groups) + old_group_centres = centres_from_groups(prev_groups) old_group_indexes = np.arange(len(old_group_centres)) - new_group_centers = centre_func(new_groups) + new_group_centers = centres_from_groups(new_groups) new_group_indexes = np.arange(len(new_group_centers)) closest_points = icp.closest_points(new_group_centers, old_group_centres) # Now assign the new groups to the closest matching old group, if the distance is within a certain threshold. for i, point in enumerate(closest_points): matching_groups = prev_groups[old_group_centres == point] + # TODO: Check the centres are within a certain threshold. new_groups[i].number = prev_groups[0].number return new_groups From 57e90c495f79488f93850da8bfb5ea4633d79a76 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Fri, 10 Jul 2020 22:55:32 +0930 Subject: [PATCH 23/24] Add lidar streaming support to SwiftyCar --- SwiftyCar/Package.swift | 4 +- .../Sources/SwiftyCar/LidarProvider.swift | 61 +++++++++++++++++++ .../Sources/SwiftyCar/MotorProvider.swift | 4 +- SwiftyCar/Sources/SwiftyCar/main.swift | 23 ++++++- 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 SwiftyCar/Sources/SwiftyCar/LidarProvider.swift diff --git a/SwiftyCar/Package.swift b/SwiftyCar/Package.swift index 22eebe7..a46de07 100644 --- a/SwiftyCar/Package.swift +++ b/SwiftyCar/Package.swift @@ -13,13 +13,15 @@ let package = Package( // .package(url: /* package url */, from: "1.0.0"), .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0-alpha.12"), .package(url: "https://github.com/uraimo/SwiftyGPIO.git", from: "1.0.0"), + .package(url: "https://vato.ddns.net/gitlab/vato007/swiftrplidar.git", .branch("master")), + .package(url: "https://vato.ddns.net/gitlab/vato007/SwiftSerial.git", .branch("dtr_support")) ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "SwiftyCar", - dependencies: ["SwiftyGPIO", .product(name: "GRPC", package: "grpc-swift")]), + dependencies: ["SwiftyGPIO", .product(name: "GRPC", package: "grpc-swift"), "SwiftRPLidar"]), .testTarget( name: "SwiftyCarTests", dependencies: ["SwiftyCar"]), diff --git a/SwiftyCar/Sources/SwiftyCar/LidarProvider.swift b/SwiftyCar/Sources/SwiftyCar/LidarProvider.swift new file mode 100644 index 0000000..4397fba --- /dev/null +++ b/SwiftyCar/Sources/SwiftyCar/LidarProvider.swift @@ -0,0 +1,61 @@ +// +// LidarProvider.swift +// +// +// Created by Michael Pivato on 10/7/20. +// + +import Foundation +import GRPC +import NIO +import SwiftProtobuf +import SwiftRPLidar + +class LidarProvider: Persontracking_PersonTrackingProvider { + + private let lidar: SwiftRPLidar + private var shouldScan: Bool = false + + init(lidar: SwiftRPLidar) { + self.lidar = lidar + } + + func set_tracking_group(request: Persontracking_Int32Value, context: StatusOnlyCallContext) -> EventLoopFuture { + return context.eventLoop.makeSucceededFuture(Google_Protobuf_Empty()) + } + + func stop_tracking(request: Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture { + shouldScan = false + return context.eventLoop.makeSucceededFuture(Google_Protobuf_Empty()) + } + + func start_tracking(request: Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture { + return context.eventLoop.makeSucceededFuture(Google_Protobuf_Empty()) + } + + func record(request: Google_Protobuf_BoolValue, context: StatusOnlyCallContext) -> EventLoopFuture { + return context.eventLoop.makeSucceededFuture(Google_Protobuf_Empty()) + } + + func save_lidar(request: MotorControl_SaveRequest, context: StatusOnlyCallContext) -> EventLoopFuture { + return context.eventLoop.makeSucceededFuture(Google_Protobuf_Empty()) + } + + func lidar_stream(request: Persontracking_StreamMessage, context: StreamingResponseCallContext) -> EventLoopFuture { + shouldScan = true + try! lidar.iterScans{scan in + _ = context.sendResponse(.with{protoScan in + protoScan.points = scan.map{ point in + Persontracking_Point.with{ protoPoint in + protoPoint.angle = Double(point.angle) + protoPoint.distance = Double(point.distance) + // Placeholder group number. + protoPoint.groupNumber = 0 + } + } + }) + return shouldScan + } + return context.eventLoop.makeSucceededFuture(.ok) + } +} diff --git a/SwiftyCar/Sources/SwiftyCar/MotorProvider.swift b/SwiftyCar/Sources/SwiftyCar/MotorProvider.swift index fadc40a..e8eb906 100644 --- a/SwiftyCar/Sources/SwiftyCar/MotorProvider.swift +++ b/SwiftyCar/Sources/SwiftyCar/MotorProvider.swift @@ -19,8 +19,8 @@ class MotorProvider: MotorControl_CarControlProvider{ func set_throttle(request: MotorControl_ThrottleRequest, context: StatusOnlyCallContext) -> EventLoopFuture { self.vehicle.throttle = request.throttle - return context.eventLoop.makeSucceededFuture(.with{ - $0.throttleSet = true + return context.eventLoop.makeSucceededFuture(.with{ throttle in + throttle.throttleSet = true }) } diff --git a/SwiftyCar/Sources/SwiftyCar/main.swift b/SwiftyCar/Sources/SwiftyCar/main.swift index 7afc07c..5dc69d6 100644 --- a/SwiftyCar/Sources/SwiftyCar/main.swift +++ b/SwiftyCar/Sources/SwiftyCar/main.swift @@ -7,6 +7,8 @@ import NIO import GRPC +import SwiftRPLidar +import SwiftSerial func doServer() throws { // Copied from examples @@ -19,10 +21,11 @@ func doServer() throws { // Create a provider using the features we read. let provider = try MotorProvider(vehicle: getVehicle2D()) + let trackingProvider = LidarProvider(lidar: createLidar()) // Start the server and print its address once it has started. let server = Server.insecure(group: group) - .withServiceProviders([provider]) + .withServiceProviders([provider, trackingProvider]) .bind(host: "localhost", port: 0) server.map { @@ -37,11 +40,27 @@ func doServer() throws { }.wait() } +func createLidar() -> SwiftRPLidar{ + return try! SwiftRPLidar(onPort: SerialPort(path: "/dev/cu.usbserial0001")) + +} + // Entry-Point to the Swift Car Controller print("Starting Server") do{ -try doServer() + try doServer() } catch{ print("Server failed") } + +extension SerialPort: LidarSerial{ + public func setBaudrate(baudrate: Int) { + // TODO: handle different baudrates. Only need this for now. + switch baudrate{ + default: + setSettings(receiveRate: .baud115200, transmitRate: .baud115200, minimumBytesToRead: 1) + } + + } +} From 2dcc0d8bca3f629bdd502dcd14f04e75d4a9169f Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sun, 23 Aug 2020 21:06:13 +0930 Subject: [PATCH 24/24] Fixup dockerfile, requirements, upgrade android gradle. I'll merge this stuff in tracking for now, as there's some other stuff I'm working on and want these latest changes in. --- SwiftyCar/Sources/SwiftyCar/main.swift | 8 ++++++-- build.gradle | 2 +- pycar/Dockerfile | 11 +++++++---- pycar/requirements.txt | 3 ++- pycar/src/car/tracking/algorithms.py | 2 ++ 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/SwiftyCar/Sources/SwiftyCar/main.swift b/SwiftyCar/Sources/SwiftyCar/main.swift index 5dc69d6..cec54d4 100644 --- a/SwiftyCar/Sources/SwiftyCar/main.swift +++ b/SwiftyCar/Sources/SwiftyCar/main.swift @@ -18,10 +18,14 @@ func doServer() throws { try! group.syncShutdownGracefully() } - + let lidar = createLidar() + lidar.iterMeasurements{measruement in + print(measruement.quality) + return false + } // Create a provider using the features we read. let provider = try MotorProvider(vehicle: getVehicle2D()) - let trackingProvider = LidarProvider(lidar: createLidar()) + let trackingProvider = LidarProvider(lidar: lidar) // Start the server and print its address once it has started. let server = Server.insecure(group: group) diff --git a/build.gradle b/build.gradle index 60d7f78..975620b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools.build:gradle:4.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10' // NOTE: Do not place your application dependencies here; they belong diff --git a/pycar/Dockerfile b/pycar/Dockerfile index 3de27be..90e11c9 100644 --- a/pycar/Dockerfile +++ b/pycar/Dockerfile @@ -1,4 +1,7 @@ -FROM python:3.6-slim +FROM vato.ddns.net:8083/python:3 + +ARG PYPI_USERNAME +ARG PYPI_PASSWORD RUN apt-get update # OpenCV has a LOT of dependencies. @@ -17,14 +20,14 @@ RUN apt-get install -y \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt / -RUN pip install --trusted-host pypi.python.org -r requirements.txt +RUN pip install --index-url https://${PYPI_USERNAME}:${PYPI_PASSWORD}@vato.ddns.net/nexus/repository/pypi-grouped/simple -r requirements.txt WORKDIR /app -COPY . /app +COPY ./src /app # We aren't listening, just connecting, so probs won't need this. # EXPOSE 1883 ENV PYTHONPATH=/app -CMD ["python", "DecisionSystem/CentralisedDecision/cameraserver.py", "-V", "/app/HandRecognitionMacbookFixed.mp4"] \ No newline at end of file +CMD ["python", "-m", "car"] \ No newline at end of file diff --git a/pycar/requirements.txt b/pycar/requirements.txt index f27a941..4938578 100644 --- a/pycar/requirements.txt +++ b/pycar/requirements.txt @@ -1,9 +1,10 @@ numpy opencv-python six +wheel paho-mqtt u-msgpack-python grpcio-tools rplidar +breezyslam pyzmq -wheel \ No newline at end of file diff --git a/pycar/src/car/tracking/algorithms.py b/pycar/src/car/tracking/algorithms.py index db8f35b..5120bc7 100644 --- a/pycar/src/car/tracking/algorithms.py +++ b/pycar/src/car/tracking/algorithms.py @@ -221,6 +221,8 @@ def assign_groups_II(prev_groups, new_groups): # TODO: Check the centres are within a certain threshold. new_groups[i].number = prev_groups[0].number + # TODO: Go through to put all groups into one (if multiple groups get same number) to avoid splits. + return new_groups