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
zcmY*dbyQSczlH%shY+L(kQ}C6ise@?c@F%#`dE9xT=qM=Dm?$VxD1hrECD1a#01Q8o
zMyT3}z+1K>hPE%4doH=x5X;^NP(OFD5GByp;5FQ^bpzkBa(;eudMu7Iyv$DE+N=>p
z{3Y5_BP>F3)tXW*Styc(Ji3jnK-giGA_&42fsbZ@#+e+ly3w0VmLC;LA)h1UY(ChA
zfwqQ?-@}@S93F|exOv;Se;P|SrYvEG(8q&|ltqvQHO9KgCSwM!Y+#d5eIRq$Mi`pU__N$FTxW@KAWIw=
zayY6@9EyxG<_tr&{Wi87m5*mf=u&=;eL1gf{Mt)q8Drick8CcxzLW>cG~TbW)|$*D
zYMc|5eZNNzt7O_C1Lqg~Lyqnr8$>aI`Z0B+2#;3yO;E7N4oMY@~7$4;MRonU+Ca
z#*cD!7$u9pZ|3f!-_6rpN}XhAWd`1qiR{e*1CJK1dvBsjUyY@BuT|;EAz}*0uSwT_
zq(g0jXTAK4wsQ>kIKEfRQZw^GIKNRZmV)b;c*Kpc?IvNuq{+eCM4%IBoRUk!JeJ4IVH!pLl+5gQn^$0Fw(WROw~SclOYWbMmvR+x&lYa
zrU`5lck*s2zl;n6HEa_E|Btu!_BeeF8T=~0Z-pdJsKtN8nr88*8loznbI`@@8U-bc
zCE&MaHH#?LN;6&wU%>->{X&6n*c6ECkP#Bn{lafo9KW+AKK>>f)YfzG#t`XCsl$WX
zeS|50l&G{J6yrdD0#njv3|C}K(~azN%1+c#*-JXtZd=Rs-zr)f{Mneaqpgewz^3OM5FaDaH3?RpqMyL}=5sFu_zcDc^E~=$H
zp`mutZ0ahrf32c`6ROBh&lI`>vuFJE*(NVpjr~^d53MZ0v$G#mHqBLpZ_=3?pNjHc
zq`Dn6xbc32BSg`U@YE?)%%`LvRRWt@NnS4GSj=p><<_-c6l`myAJE0fSp^QbBfdS(
zl>BC`;EiMtvPQ^FVSL|sjTc(?b%8Qt@%U>rt&`4_cYT+R`OvMomf#104S~4%y%G=i
zSF$4cuIxlIe>@1E=sfXhVt@RqP-*grJnW~;iWiY{&Bqh7J|{vYQ!^1x4cnyGk6Wb9
zO0~}ejH&5@bEj&`2?Wl*cf=IV=$oa9rzh+#gN?j{IY
z{cFM?b1*TT+&S2rOIFFvy{`FvX}_js+9rw1O*1ySv8Q}r2b0@*h|1Di0R1v*
zVt4yRX`%ac3xeH;(y!FJ1wfX0u
z(vEffdladd}+qfb##M5s|vX#V+!&>>0;o_Le@c)+7jDwJJ(9>+3CRkGH
z##M)o)xY%3-ifK*iFpo7NiBT`wYVc=lYIZtKF{pxNfod2V)Ml&<=??l)7w5)Glopn
z8#scqBz@^rE2-5aVDT_~Q#A7m4S6@B{QM6c_oY?)xk>z8r!qnbkvnqHoIRTMZijQ5
zv*ir-hjrA??C7S({;peDbjO+Kk0=tpoYQr7VQMJ*cR43?@CVMwg=}e<87k-T@wQ2`}bwe-}AAk?H=&0Yz~Zbk~bc>EP@tV
zZ}M>Z2br)mwHOaQS1^~;AVlgQS(~eqTT3cQ)Jq8?bKk~$>tZSLgMW6sF{Os2*%OD^
z#@G{w=c@536Pgy5n{C*b?yf@Kd`v9zOG*56432l!^U3K)m1;qIzM*3ZS)XJnJ4THC
z^e*Y&BQ)hyIA?LzXpqWK1`GN&gr?{?;qw?0wZ2-3WO3HI;)oY4YL?q5>F9QpzV?jw
z%Ae1D+te?r(`vL~!tzayt@-830@#ZS)-KyoF0$s!Vw0Vud%!J!?moY0m8#gODn9F+
zY?TnBMwOKomVz60?|&V3HO!Z!cH+<9qbk>I-tT86n9=X9g`Zr=G+
zeJZH~&WtV__tcQ~B#c3;HnlwX+UoXIT>zqV;hho>
zm(S|vbkcOsiPJd5fwJn%e%@Z(YNs#TqQ-MTQNPf9zDS)^#q=x)hn0wzK&7Tn_|BdK
zx}|&Y!FqT|pVs!!ayLJ%C$M2LMR|s6aQ%QUi>oqMG=a-^oPaKfKR>DyX9dBV*%R!+
z%FvBF>KN67w@!4Lj7{*vhaGWkP344{vG@LFna%+6y+SB#;an8bz1SAoZg)%>it7$I$^*bWXoT6hbhk;!C7
z5tAKrT@VO5N!8a8G3=U4NL5yNqYdEsc2}2^o5ctj;Hrf0Dk~jL|srk
z+XuB%H@ROKFqLw>LUu0bqRXw}B*R!OLo6|5*Q4|0dPlcG;>@4(_wZ})Yf&doH+L*RE=D|Z6RxTU#a|+qO_A4p
z2U{|br!ER>QqRY>(awtH6L-S8zx$EeC$o;?KH-zEE{_f%M55>lLD!d9KbLpEyv&z3
zOD}@>1Exq4C9v6urtETRrtB>6m;qqJfh)6o@&+S>@D45s~ccePF=|y`U
z-f~hKH|y8x$ovl1NJi3Qqom;ERzIG#^&!~fFQcyl0+H+;`yV@UyA|P*R^h1K*<8h{
zZqjSxw79HGC?HMzs;UY)%J2b0gXnQ=OY;dHMi3-zr7BZ6SnFxTu8VCoySbgs>l^A8
zmN&kvh~36=TRu2B!zInA7+dp6$aaef-&PgtbENZDyV(2Qh!`{>wDfZGw=1SFg*E{+
z#RVlY)C{0iP0+Q52$nQXhK{cVx<)i;=tyb=4mRyl7vX}F8Q%QL>_d6O7MM}r2)$$y+>m{$P8lbYz;fZ
z3QWqj-`0^M+YpnVm!KE9$7?qn-uiDEF=*G=DW84fhX*c2c78!Mp!igEq_TE#1gLe8
zl$ro$nqM(yq&C?t-G#o9^eY1)Q9PX&YrAtOX|lboS9pTS>3XVy+T*%QF@Dx%R!
zi~z%gEL!?kG{Q%?*cWYwt#5W}g>qQ?$$RX%E0(03W7ZERFNIOjpM5e?6J0JAro(i1
zsQeyE7G{}iSZNnP(n4FwvEp+ztGzd?jYx+(7Mk46X^c!>`oO7{i_yo>FV+t|SvS!}
zBkOPHlUb!OPh1Y-8duD(b2u@P=5b8soW*+wnMY4Q8Eq!-L)~5b=n{68|ISew8k>Nt
zjw!awOP?W8P1$OO`+#?*f{M(%*J)%E_^tKqR(nv#swuRijXecgwQacnz4TE8
z=2-p0u+VG&&^ePGuUHKIgI+h>XY*ZqAI5N*4Wc%8CXbXf57?Mpl#k^M=OHx26*X=b
z@XIHOwsp{@XZ?Foo*@>FnvH!0EQsZ*BR?l&zm|TjE+bDiqA$Y2SY>Copx~1PHa4js
z_!C`yon1&oi{Kr00~T|`DcYfvr^uu*F03OLS>^N@6Zi4VhFx(|WVY7whxD`RzX@{a
zbt^j09cW#7p^J^3)}YLkrHR`G;mbL@W6__7SC=}Xh$OzjG!>tu=ubtG%LthmSDE)Y
zfp>6T8@qS6C@y(<;eHyUqHzM9+%$!LWjRr*z1Qw1s?bAYrK7*KD*C^qP{W=T31H#9%+CXSZ;mJdIE6lN%IxBUk0hr5P})$QDM>4>ow%muHv
z-zVTS+rI9+PV|%56*~qa^GKRWwz;dLtoUR%*1M}RGh$LcGlrHaAh-`>BW&!A6mvv(
zo}57{BhH+Bqiza~XoxEIpXk_BGR8GzhcQwT4ND>~ahppmV*4SGve=@GE0zZGn}Z_l
zMJ~Bi7prl4W<5m=nXZVtIYs=mwv2O*-UXG(Y9#Tfu8=c%NzSja+#d#gJ}FZhj)shN
zMhx$^a#S-Ji`_niAxIQ^8YN)tqqJ!k5S_*BUFNY4F-4u9`G(W0v9;O*=f94+)C?7x
zvYptQhDL9z*Ef*V5;DWma#Kwl4duDaGW=wP;`7wCjpnvd1`SO#b!fM0%!1J-u}iOT
zS`t%%#@E|EzErxcRQ`fYJ)?gm)spx4eAd0@1P(T8Pr4n}5d$L~0>gytVD-^eF2bLx
zW3i^+7-f{_=5Zq77xY&vCpL~@OTUZ`^myD;mRijH9fO>_Qdw^gurX%)NhZcgCIxgN
z4yJcYrgaS}O8U(X^mwaTnrkxmt*ni+Cdmv>X$)_K4fl)^GtOUWQ~h>K$_^s;h!1Dw
z*q&qAD_pNCM3lb9=U3Af`-?xuwb62P12trTb=MXKaYoNRHZPDJv9*`Aw)QF0Tb@g}XFL;|
zdJF}(@e5r%*LCQBK*U(pdQRDeKE!)FF+}k{9Fz>A6zUP@OV+3DhvOQ
zm{2a0QrQ^kn~?Df`@q(xA(yDoo!~Q+;;_*@_h(a`J~*mJkCa@npgsiRZAQ#pqSOZK
z!muT4MNvG*<^MYIQN0h-W#UtDprj`i7Xxq=bTN{>rHH}V?ZdT~kd!O-X
zt5JI4SH&YHnn(%JNKh$z*YZsO#t%LLA680?$^5V~dE8Pl^cPrXu++@2D?!)`KkPkM
zE{Jaq+MNaAl)!{f!@ID?j@Fh)p!zU~?G%ODNge-447;DM8a%=PGRAB#D&LD5-=atG
zY9Y3SF$2Xq8v`e8Rvmy3(wxGi--=L0eqRV6KFsU+waZV(WuPT00CKK)a--{eLpmBy
zcXLs^*FtPQfeF;&p!YXTs3p9?U8Q0nzxqE+bM#Y7^_TmK
zsw$bo4WCokyvS6N_0(KUJ2!8X|5~{<8pDd7rDt;^sCOx&=RxoN<`o-B}EwumojPl2bzq!x}k%%W5t9nTM1xeXi
zQv;z_icyd<$#$rBJk9nk)8!h|c`$y~+NUVUGMRKk0aIBHQxP%YPu#d}ntgv1C_my;
zpbt9K?YSK7jR%!jIUz+E3dnfbRMkv&7^h$B&oh5Ae2U{ka*7&~Z|XGk#69p1c_G1FC{&L1hn#)ZCmqpbHXC6uk;Obwn7kSJKaZ`H?u#%dz%W!fJP&`<51T`RomXjQ_%*
zZ6iKVWhSW(o;7GYUuAwQxLzZTMt^H4@rorBp`tprXq9xsaKz)V<&_~zzsbGC#J2xC
zQqiFYS<^~7D^Pcs?HzZm78=|`Ql?|`KIZR%#&qOMAEpStCrEMl8R0iZLR|#8%!;8p
z0VGG*J(7WAxG~ij`ISsxDD--ge}1Dh3vAj>!wtQtec=#YCHNFKz$`Il6fa~c`rYYD
z(xqyH;ETfFb?fK!?^*s3`))*65xs|5*^u3Snz(6t59|0kESGze=0W7f>LL{K_sC3&
z*ardr??S+*s+p>{8sni`20|xZQ#^D^AQTjp`=*)izGeFN$qoSHK6K7(lg#A*T_gM(
zK|#q5@BmyU)j&wqjB*=s29ufgV)YL%VJRV>@1p)anJxE7WkARdZ36Lb~f2b6Q
zlm7uK{1gU}2|U1INlYN^Cl9Dh;{WL3PjQf^)PE=rpfSw?($jsQrq#T^it69uKY15Tb~K=hm}
zh{fw3iUZN>cmUlz1T^;!pw6KHjOL|4uKo}3i|5k^cjn$5g+E9&YZL(c0t7^Yyr*;k
z{39mNJB|kkA^-oNpr8j6hJ*m~3oM}A&ow%Xk22_5P%a?j<^aqv(ILmiH2Q>4Owl^89`~3rMHp
zp3(w1Yh0kR@38~4fWByT)-r6kJki5KxqsSQ->5QD8+n7Lblrq&rqbQu<4GcZbwU*DehL0!uF<
zAtALa2-nN~-E+^Kf9CT%^Pcydcg~!dGjHY)VIP{X+Mk5X+Z1~yNkl;K;}!vd91tr<
z3$)!P0ZK`15GdXAY=~6eS|ICMe*_|EtvP9boO{_-?eWIq(~Zo-^Ni?kUPq%Frv%84
zr)oV1Do+g^<-_H;g&&6jZW30jA}03FK{ok6%fnpg;T?i6z?Ni4>j&X84{fZopFMV_
zPgq3;2ochOBOr>*RYtVW6qFYa2RCa+Rij=CocWr`A#j^WVQcy=l`bl)`?rJh=2@6e
z5{>%T3cj@IohTK=HSz{HCTuU>e9Jdy(opO40;jY>4CYhDaoW$2zlNl%@5(Qiu=y0y
zcPW^JHHod;>lqb~jFKYaMy2xYMtqcZ)tr_RM@6k9lIwWE8QrU-RZ^X=V;RcRRkvfh
zd1>Ux5k>B6Zog!6HSDMhQY$F;vke(i*FG4;(;LQ}mHEaN8B^s8K(WGkdBU85Nh-nw
z3TtcD!M5Wr+_o`vA0(6W&{4w4+nrWDTW1^{
z`epH{pQuSybd8I*sYD3SJ~2ag
z)Yl_lSuF&Mbw4X`D?Zu`D`om|Xx`05WdlZ9t=JoV-6wy-R)lz9Vmu3c>A*fG30~0(?uQ5FkJ%zGK6$qDU~&hJ-V3Gc6s?!hhw*e)&1k)r=FnmzLWcywDn{+ksed*I9(B{*s3K(%lJ)U)|9X0a^E2
z?>RlLCvy+s4faLC0}D1!+cYzr%>h-s0|&9TBc1a9Zj|0mYS(5
zrQ~xRl7za1>q_E^{8c1q74LqFM-}HUQKs
z-HX=BqDsXVjC!$_)l0!SF$o_V=RXM+z&V&q6#jU#AuF*Ji7|_5#Z1IhRaGYUxFADf
zpXVNXi^mIuN^VZCEy?r%N`o=v9TuU`3mG^fHWsJ7ia5E@h3U;R^8nN0<6mS@yNZ|*5X
zjEnxhb4H)?Mxy|QSTBrESL0adG6`arE$lH-Quq8IpQfLyXQ6-~q4$o-rhCpAt($tI
zaQa-ZZM^S!;$?}%kABf#XFUWGO|RZjOJYN?9`~l2FNCPG(y>&9>G2l#+5fWW;j7y+
zQId*;#2h|q8>}2c^sysZFYgKl&gLAc8b;;_h%M^v5(yp^hO`DU#mFTN
zZo|S}wZuF&o_J(DA!5AX>d=y}Iw7%z*yBr$?F*l*`ncP=hjAJ8zx2t%b$OWhk#*>L
zp`+b!2vJ%5!5Pm;TXyhUy>17398}g9$AA1ssrPvPv44N`QtuuEE{>Jfe<@nFgB5?k
zeEE{>t*#8BJh%#1a}!~{TtS;f#A-UQO!fR1zuQA~$WHb8_sW<`I
zOQt1l>b3%|CE-m#+H%q)ASiMAt&ke3SnvD{cC0Ff;U-w5o;8ioQdl~qkLfEQ-TaIu~%rf%rG#UXd
z#FXb(La?+7@`V^U+FMI3**T4yDFF#ZXU;?IM6Bw#p@kx86Xq&q-1cybR(211`S}V*
znO%<4o*ixUE0Pbh+Yz&y$*tl-EYXj4#@j5-Wj6CQ7slhaV>Bq)HZf-lb{<_}t>aYl
z&=`I3F_+?^Q~lAB&dSS|O^qS%5er4X>)d^YqM{p>F_t3F+O*!(aZ;%_yJJ}DE$sT^
zD?V+F1o)k|;MJA7`df*pD~TA{i+^wLEi5h3gr(29e5~cw@g{21H}^GSsQD@#%k03a
zK9?s{0JjBaTq
z%7|3eul{k|8$TQf8qMtCiY(ub>dVMH!d3$^aEg9r8e~r>3sXIyah&#Of9~35eqFVQ>knQg8ZBr~gYpRT*COY|4$vZssNa2NxUeYfsm!1qND_;I$wR~eah0d%+M7?x^JA+$)Ce~Rg
zeqN7OxBK8sNnuySGL7AXp>`pLB^Uz@)H+Fq#6*xz^WQ%C8FYh2c}ibM$objs+y-d?
zrX=r$2HB8GQAT(a-w^I+Es60?fl37;e}5$RjTuFMKXp%mne_VmrD+=0@u#&VHEO>T
z0+aDh{lgzr?z>~c5JWEZg`onQ5xvC~Pg`I34~`FcnLIpC<-1wExH5^!-;y8S-GaK$
zqV%<$D)?4;qGGHu8a=-ztvXSqxh#zCt;e8A_h?gwd4CR;I%At`%CO^gi0;$9($Z`nsRqjuU6#in|WCc2vnFl7_u}-ps18Z*4Id%R4g&)zX
z=u-}T0Ym3Y-i-H&S?xF}yw?AdonDV+mwfb*odRY)h;UL3);X$Jjcc$Zn&D^A3CtT}
z(yDV3RddXi$VJUPVhedH^S0)1&)Bbgt@+Paok?^h;$k*W0Cbh`vG2mpVU2}c99a5HuH!aSi!
z`nGbfL^TymSO0$QBNCccZm*uW{Nh09Z~MGCeOOU2RMqHJ-N&DuF-2n_ObxbNZG*JV
zbI(4ArNKZ@CUt-@eo_k@7Mxy(MarP*DVP^#5Z;ZCqEYjzxIeI@q|R4zFEvIRGSVU%
z$duRe?0xKK+(*?VWjN^l{Is8>%$
zZ+M=HCS<3MQ`&8i7~}*7hNPrD|Jpj|yihO~({IdOBM?%{!ygU%^BJyBmS%6`!UkVo
zL^v<&C;4Th7tx1l!)WXNrYFSMljXe=FPsxEl#gW6l0I%9R?<>^G5~ze5H_V;gf+ny
zkoSHZ-~~LeKBBjvGOTE0$zT3w3P}2At4ce)1Y^c=mw9(lJ+3FzO|?53ToOlD?jbsQ
z5vy<+b*YLnYm1m9*uo+Hv$3$6AsTswxYOo$!QDU1@_I;r+|0PE$m%;+gL_=h`{M0G
z<%5f$DRD1rkyN$KcaWOd?Z>Vcr0Itq->o9Q2%tOr{?NT>&{g$V>kWg|J-0^vg*>mq
zXDCk~jYn^7od`Ep|5+kxII7RTuS?Tx=nETO{85~G=6slBjlci%kz`5LkHx;b8HlZh
zw*1dWnq*D}N{}lP?*^3Sl#PuDO{Q#n_};J|DU39cPe7s2pX@nCXO~n(FReYqJ3s!S
zxpR+QJYxy(_V`@?XTfn8#(w-Z6!{lnk#x%5?42|OsX85_8tK`R_Ov3I#G8T%~|m5^dSLk
z=E+zY@@x=EdFQ?R+(^!|Odf9!syD1W>9@W&hWlp@K0RyhEXqPgul#0a-Iymp?(Z8+
zedpt^fW(v;4&6%_BXA
z4ML%iVq3UBLjtrypnLM(5fbb$$>*yu%nuPX34Rq^>h*W~m(1Af3XeCtwBOBnb(dcg
z+c1f(KCz$tT8{k$O(PYvpV-y?HCzAn)o{Gqea*A+gt|&S*q!p*I7C$ro)~UpMuq~z
zD|2*bHB0PErq1`Q`F1;cdmrI%ATwI3T;F3jc(Op`_q
zG9GZ(b!$5`zCYFbU0gY*arcOL7%Z11HI8N<
zcq<&EOTU~%Z3Q#_Ew?K+2p9%*Mv-*1Nf&fk%@LxhKX;1l5O|Iu>j}ovw{mq96>@dX
zRyxG|0z=J$nFIqD!E-Q&?67!glaAo1mOtCUh7{Ar?dWVzC&DU-cGcQD
zdZs=K!wc!qJbJ4aoRX@L
zBRa?Q9N7R5#0tl=(2)H*61@~nW?QcNN)aonJBtDj!>d+B8l-Vjc1vu()AGLsOg;z=
z3z>Lgn+88SWz5<$r*2$j5F6$glpX51lvo`8iT|m8vPVVVa|jx
z&hfX2>kf%tAM?<=>xP+`#7lZs61$5|7J_%%!KyPj!t#T}j$H#+@?leTQwL&WsN$BN
zuXS}6RGLD|V8HiN%M-zT^@+Hmns8IP+?%IVh@_upzIr!I+-a7r=-%NBXw*Op0`LK3
zG5fdG`C@Axy?d+8VQLq(qkUTD+FNVrN5Q|J6R&jh2Lv)Ole+5pGloEZZQ79>m7YGM
zSPJ1GRDQtW?r9jb{g**e3Mr>PHrRWagZ|ku4kjL;JOdL~Id05kc*CA+ui@=
zieS-e>hskR-1I9Sx7b4i6p>2LP#vgtG6;8vGL>E3$NPQ$J2r~XGQDNg;Sw=&
zC}lz+3@Sq%I2q-97R&9|8Ij2^?^DGQK_oiqZS2$!-rzVqn=~d~TS{n&I+svxt4dWO
zT?K0)JEx>9E7saW8h!5+MmAkC`g~v*@
z6VKn0>eZdon>BH(O$mACnxk3D?vSlCFFnvZ#+&hUs)Wr!aP{<@|oc^G>bJk59^xhmz!RA%|K_$o)V`D@gVs>@bSmXVID_PQXp
znfja8U01+t3V!o{8ZKi~G@#q$KrAH-Ks3$G{Qo}H|N1ijJMsgZDgOmM1O$Fi0>0CX
zpbAzXhYbP@PV;~=*nn7eQGjoT2b9nGFNg-PpHT$a@?7JL7I&pmkmclS7#Y#zRYg_`D0h47O
z&|%88tXNh8{Yk$@@*HA-B9r#tDkY$>!U#Ie`j1TupjRn@;(ykyyld-zJ{@qm!UG~I
zxR#ZxV8CEi5JXV?ANc~bS9*;MYtkTvifc5iynmg!XpIr%SN*R#E?|3&2QVs~N02d=N!1;GdfNGr)gc$|K#-y*M=Ra9B4#cmk-naoQuS*cWnE3C4
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