Karthick
Created September 20, 2018

Smart passengers lift mobile app with ω-π

Walabot can be used to track the human in lift because it has the capability to track human, count the number of persons available in lift.

17
Smart passengers lift mobile app with ω-π

Things used in this project

Hardware components

Raspberry Pi 3 Model B
Raspberry Pi 3 Model B
×1
Walabot Developer Pack
Walabot Developer Pack
×1

Software apps and online services

Walabot Developer Pack Walabot SDK
Walabot Developer Pack walabot App

Story

Read more

Code

People counter code

Python
from __future__ import print_function
from sys import platform
from os import system
from imp import load_source
from enum import Enum
import WalabotAPI as walabotAPI
walabotAPI.Init()

def PrintTrackerTargets(targets):
    system('cls' if platform == 'win32' else 'clear')
    if targets:
        for i, target in enumerate(targets):
            print(('y: {}'.format(target.yPosCm)))
    else:
        print('No Target Detected')


###------------------------------------------###

class Placement(Enum):
    Empty = 0  
    Back = 1 
    Front = 2

class State(Enum):
    Idle = 0  
    Bi = 1  
    Fi = 2
    Bo = 3
    Fo = 4  

def _get_placement(targets):
    if len(targets) is 0:
        return Placement.Empty
    if targets[0].yPosCm > 0:
        return Placement.Front
    if targets[0].yPosCm <= 0:
        return Placement.Back


class PeopleCounter:
    def __init__(self):
        self.placement = Placement.Empty
        self.state = State.Idle
        self.count = 0
        self.state_machine = {
            State.Idle:
                {Placement.Empty: State.Idle,
                 Placement.Back: State.Bi,
                 Placement.Front: State.Fo},
            State.Bi:
                {Placement.Empty: State.Idle,
                 Placement.Back: State.Bi,
                 Placement.Front: State.Fi},
            State.Fi:
                {Placement.Empty: State.Idle,  # increment
                 Placement.Back: State.Bi,
                 Placement.Front: State.Fi},
            State.Fo:
                {Placement.Empty: State.Idle,
                 Placement.Back: State.Bo,
                 Placement.Front: State.Fo},
            State.Bo:
                {Placement.Empty: State.Idle,  # increment
                 Placement.Back: State.Bo,
                 Placement.Front: State.Fo},
        }

    def update_state_get_count(self, targets):
        self.placement = _get_placement(targets)
        prev_state = self.state
        self.state = self.state_machine[self.state][self.placement]

        if prev_state == State.Bo and self.state == State.Idle:
            self._decrement()
        elif prev_state == State.Fi and self.state == State.Idle:
            self._increment()

        return self.count

    def _increment(self):
        self.count += 1
        return State.Idle

    def _decrement(self):
        self.count = max(self.count - 1, 0)
        return State.Idle


def PeopleCounterApp():
    people_counter = PeopleCounter()
    rArenaMin, rArenaMax, rArenaRes = 5, 120, 5
    phiArenaMin, phiArenaMax, phiArenaRes = -60, 60, 3
    thetaArenaMin, thetaArenaMax, thetaArenaRes = -20, 20, 10
    walabotAPI.SetSettingsFolder()
    walabotAPI.ConnectAny()
    walabotAPI.SetProfile(walabotAPI.PROF_TRACKER)
    walabotAPI.SetArenaR(rArenaMin, rArenaMax, rArenaRes)
    walabotAPI.SetArenaPhi(phiArenaMin, phiArenaMax, phiArenaRes)
    walabotAPI.SetArenaTheta(thetaArenaMin, thetaArenaMax, thetaArenaRes)
    walabotAPI.SetDynamicImageFilter(walabotAPI.FILTER_TYPE_MTI)
    walabotAPI.Start()
    try:
        num_of_people = 0
        while True:
            walabotAPI.Trigger()
            targets = walabotAPI.GetTrackerTargets()
            targets = sorted(targets, key=lambda x: x.zPosCm, reverse=True)
            prev_num_of_people = num_of_people
            num_of_people = people_counter.update_state_get_count(targets)
            if prev_num_of_people != num_of_people:
                print('# {} #\n'.format(num_of_people))
   
    except KeyboardInterrupt:
        pass
    finally:
          walabotAPI.Stop()
        walabotAPI.Disconnect()
        walabotAPI.Clean()
    print('Terminated successfully!')
if __name__ == '__main__':
PeopleCounterApp()

Credits

Karthick

Karthick

11 projects • 13 followers
Hobbyist

Comments