Add centralised controller as main node for the demo

This commit is contained in:
Michael Pivato
2019-03-01 15:45:24 +10:30
parent ede1ec4500
commit 0c8a0b9f23

View File

@@ -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()