Skip to content
Snippets Groups Projects
Commit 8cb5c801 authored by Adrien Lescourt's avatar Adrien Lescourt
Browse files

Add piece state machine doc

parent 511498a6
No related branches found
No related tags found
No related merge requests found
<mxfile host="app.diagrams.net" modified="2021-10-01T17:00:24.120Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.83 Safari/537.36" etag="X7S_uXiCLWks2JBqEszE" version="15.4.1" type="device"><diagram name="Page-1" id="58cdce13-f638-feb5-8d6f-7d28b1aa9fa0">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</diagram></mxfile>
\ No newline at end of file
This diff is collapsed.
...@@ -604,6 +604,7 @@ class PieceTakenDetectionEdgesTriggerTestOnArucoFull: ...@@ -604,6 +604,7 @@ class PieceTakenDetectionEdgesTriggerTestOnArucoFull:
self.fifo_size = 10 self.fifo_size = 10
self.last_boards: List[Board] = [] self.last_boards: List[Board] = []
self.last_state_change = [0]*16 self.last_state_change = [0]*16
self.last_state = [PieceState.UNKNOWN]*16
self.out_board: Optional[Board] = None self.out_board: Optional[Board] = None
def add_board(self, board: Board) -> None: def add_board(self, board: Board) -> None:
...@@ -614,13 +615,23 @@ class PieceTakenDetectionEdgesTriggerTestOnArucoFull: ...@@ -614,13 +615,23 @@ class PieceTakenDetectionEdgesTriggerTestOnArucoFull:
@staticmethod @staticmethod
def _average_state(states: List[PieceState]) -> PieceState: def _average_state(states: List[PieceState]) -> PieceState:
"""Get the most present state in a list"""
u = states.count(PieceState.UNKNOWN), PieceState.UNKNOWN u = states.count(PieceState.UNKNOWN), PieceState.UNKNOWN
on = states.count(PieceState.ON_BOARD), PieceState.ON_BOARD on = states.count(PieceState.ON_BOARD), PieceState.ON_BOARD
off = states.count(PieceState.OFF_BOARD), PieceState.OFF_BOARD off = states.count(PieceState.OFF_BOARD), PieceState.OFF_BOARD
return max(u, on, off, key=lambda t: t[0])[1] return max(u, on, off, key=lambda t: t[0])[1]
def _states_by_pieces(self): @staticmethod
boards_pieces = [board.pieces for board in self.last_boards] def _states_by_pieces(boards: List[Board]) -> list[list[PieceState]]:
"""For every pieces, get the last X states
res = [
[...state_at_t-3, state_at_t-2, state_at_t-1], # piece 0
[...state_at_t-3, state_at_t-2, state_at_t-1], # piece 1
...
]
"""
boards_pieces = [board.pieces for board in boards]
transposed = [elem for elem in zip(*boards_pieces)] transposed = [elem for elem in zip(*boards_pieces)]
res = [] res = []
for last_pieces_for_one_piece in transposed: for last_pieces_for_one_piece in transposed:
...@@ -632,7 +643,7 @@ class PieceTakenDetectionEdgesTriggerTestOnArucoFull: ...@@ -632,7 +643,7 @@ class PieceTakenDetectionEdgesTriggerTestOnArucoFull:
def _average_board(self) -> Board: def _average_board(self) -> Board:
next_out_board = Board.from_board(self.last_boards[-1]) next_out_board = Board.from_board(self.last_boards[-1])
states_by_pieces = self._states_by_pieces() states_by_pieces = self._states_by_pieces(self.last_boards)
average_state_by_pieces = [self._average_state(states) for states in states_by_pieces] average_state_by_pieces = [self._average_state(states) for states in states_by_pieces]
for idx, piece in enumerate(next_out_board.pieces): for idx, piece in enumerate(next_out_board.pieces):
......
from abc import ABC, abstractmethod
from enum import Enum
from memory_lib.model import PieceState
class StateMachineInput(ABC):
def __init__(self, enum: Enum) -> None:
self.enum = enum
class State(ABC):
@abstractmethod
def next(self, sm_input: StateMachineInput) -> "State":
...
class StateMachine:
def __init__(self, inital_state: State) -> None:
self.current_state = inital_state
def next(self, sm_input: StateMachineInput) -> State:
return self.current_state.next(sm_input)
class StateMachineInputPiece(StateMachineInput):
def __init__(self, piece_state: PieceState):
super().__init__(piece_state)
class State0(State):
def next(self, sm_input: StateMachineInputPiece) -> State:
return state_1
class State1(State):
def next(self, sm_input: StateMachineInput) -> State:
if sm_input.enum == PieceState.UNKNOWN:
return state_2
if sm_input.enum == PieceState.ON_BOARD:
return state_1
if sm_input.enum == PieceState.OFF_BOARD:
return state_3 # TODO: output = 1
class State2(State):
def next(self, sm_input: StateMachineInput) -> State:
if sm_input.enum == PieceState.UNKNOWN:
return state_2
if sm_input.enum == PieceState.ON_BOARD:
return state_1
if sm_input.enum == PieceState.OFF_BOARD:
return state_3 # TODO: output = 1
class State3(State):
def next(self, sm_input: StateMachineInput) -> State:
if sm_input.enum == PieceState.UNKNOWN:
return state_2
if sm_input.enum == PieceState.ON_BOARD:
return state_1
if sm_input.enum == PieceState.OFF_BOARD:
return state_3 # TODO: output = 1
state_0 = State0()
state_1 = State1()
state_2 = State2()
state_3 = State3()
...@@ -35,8 +35,8 @@ def main(): ...@@ -35,8 +35,8 @@ def main():
# memory = memory_lib.MemoryABM(cap) # memory = memory_lib.MemoryABM(cap)
# cap = cv.VideoCapture("res/webcam_05_aruco.avi") # cap = cv.VideoCapture("res/webcam_05_aruco.avi")
cap = cv.VideoCapture(0) # cap = cv.VideoCapture(0)
# cap = cv.VideoCapture("res/webcam_11_aruco.avi") cap = cv.VideoCapture("res/webcam_12_aruco_full.avi")
memory = memory_lib.MemoryArucoFull(cap) memory = memory_lib.MemoryArucoFull(cap)
memory.bind_pieces(hello_piece) memory.bind_pieces(hello_piece)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment