From 0c8a0b9f23aa254cbc8537ccbefc2a6e413652f7 Mon Sep 17 00:00:00 2001 From: Michael Pivato Date: Fri, 1 Mar 2019 15:45:24 +1030 Subject: [PATCH] Add centralised controller as main node for the demo --- .../centralisedinstance.py | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 DecisionSystem/CentralisedDecision/centralisedinstance.py diff --git a/DecisionSystem/CentralisedDecision/centralisedinstance.py b/DecisionSystem/CentralisedDecision/centralisedinstance.py new file mode 100644 index 0000000..9cac7f2 --- /dev/null +++ b/DecisionSystem/CentralisedDecision/centralisedinstance.py @@ -0,0 +1,100 @@ +"""This module provides an instance of the centralised, distributed voter""" + +from queue import Queue +import json + +import numpy as np +import cv2 + +import MyRaft.node as raft +import MyRaft.leader as leader +import DecisionSystem.CentralisedDecision.commander as commander +import DecisionSystem.CentralisedDecision.messenger as messenger +import DecisionSystem.CentralisedDecision.ballotvoter as voter +import DecisionSystem.CentralisedDecision.videoget as videoget +import GestureRecognition.simplehandrecogniser as shr +import GestureRecognition.starkaleid as sk + +class Instance: + """An instance of the centralised, distributed approach to voting. + """ + def __init__(self, node_config='config.json', video_file=0): + with open(node_config) as f: + self.cfg= json.load(f) + self.mqtt = messenger.MqttMessenger(self.cfg) + self.we_lead = False + self.node = raft.RaftGrpcNode(node_config) + print("Node initialised") + self.node.add_state_change(self.on_state_changed) + + self.voter = voter.BallotVoter(self.on_vote, self.handle_agreement, self.mqtt) + self.commander = commander.Commander(self.mqtt) + self.recogniser = shr.SimpleHandRecogniser(None) + + self.last_vote = -1 + + self.q = Queue(5) + self.frame = None + self.vd = videoget.VideoGet(self.q, video_file) + + self.kaleid = False + print("Initialised the instance") + + def on_state_changed(self): + """Callback method for state of the raft node changing""" + if isinstance(self.node._current_state, leader.Leader): + # We are now the commander (or leader) + self.commander = commander.Commander(self.mqtt) + else: + # No longer or never were a leader. + del(self.commander) + + def start(self): + self.vd.start() + self.mqtt.connect() + go = True + while go: + if self.kaleid: + go = self.show_kaleidoscope + else: + go = self.show_normal + + def show_normal(self): + self.frame = np.copy(self.q.get()) + cv2.imshow('Frame', self.frame) + if cv2.waitKey(1) & 0xFF == ord('q'): + return False + elif cv2.waitKey(1) & 0xFF == ord('g'): + self.voter.request_vote() + + def show_kaleidoscope(self): + self.frame = sk.make_kaleidoscope(np.copy(self.q.get()), 12) + cv2.imshow('Frame', self.frame) + if cv2.waitKey(1) & 0xFF == ord('q'): + return False + elif cv2.waitKey(1) & 0xFF == ord('g'): + self.voter.request_vote() + + def on_vote(self): + # Get the current frame of the camera and process what hand + # is currently being seen. + print('getting frame') + # Need to copy rather than just take a reference, as frame will + # constantly be changing. + self.recogniser.set_frame(np.copy(self.frame)) + print('Got frame, voting with recogniser') + gesture = self.recogniser.get_gesture() + self.last_vote = gesture + return gesture + + def handle_agreement(self, vote): + if vote == 5: + self.kaleid = True + else: + self.kaleid = False + + +if __name__ == "__main__": + instance = Instance() + instance.start() + \ No newline at end of file