From 0ba967c99724aeb2a4c2c827df980a3c2ac8d3ff Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Fri, 21 Feb 2020 20:59:04 +1030 Subject: [PATCH] Clean up project directory. --- GestureRecognition/HandRecGray.py | 79 ------------- GestureRecognition/HandRecognition.py | 34 ------ GestureRecognition/SimpleHandRecogniser.py | 2 +- MotorControl/ESC.py | 124 --------------------- MotorControl/gpiozero/__init__.py | 0 MotorControl/gpiozero/motor_session.py | 1 - persontracking/__init__.py | 0 persontracking/lidar_cache.py | 17 ++- persontracking/lidar_servicer.py | 14 ++- persontracking/protos/lidar_tracker.proto | 6 +- 10 files changed, 29 insertions(+), 248 deletions(-) delete mode 100644 GestureRecognition/HandRecGray.py delete mode 100644 GestureRecognition/HandRecognition.py delete mode 100644 MotorControl/ESC.py create mode 100644 MotorControl/gpiozero/__init__.py create mode 100644 persontracking/__init__.py diff --git a/GestureRecognition/HandRecGray.py b/GestureRecognition/HandRecGray.py deleted file mode 100644 index 1bb379c..0000000 --- a/GestureRecognition/HandRecGray.py +++ /dev/null @@ -1,79 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Thu Nov 22 14:16:46 2018 - -@author: pivatom -""" - -import numpy as np -import cv2 - -img = cv2.imread('H:\car\GestureRecognition\IMG_0818.png', 1) - -# Downscale the image -img = cv2.resize(img, None, fx=0.1, fy=0.1, interpolation = cv2.INTER_AREA) - -min_seg_threshold = 1.2 -max_seg_threshold = 1.8 - -# Need to make this get correct skin tones. -# img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) -# img_gray[img_gray[:,:] > 90] = 255 -# img_gray[img_gray[:,:] < 90] = 0 - -img_bin = np.zeros(shape=(img.shape[0], img.shape[1]), dtype=int) -img = np.where(img[:,:,1] == 0, 0, img[:,:,1]) -img[(img[:,:,2]/img[:,:,1] > min_seg_threshold) & (img[:,:,2]/img[:,:,1] < max_seg_threshold)] = [255,255,255] - -# Threshold to binary. -ret,img_thresh = cv2.threshold(img_bin, 127, 255, cv2.THRESH_BINARY) - -# Following method is much faster -> 0.00143s -# Still want to speed up further by lowering reliance on memory, which is quite heavy.. -k = np.sum(img_thresh) / 255 - -# Taking indices for num of rows. -x_ind = np.arange(0,img_thresh.shape[1]) -y_ind = np.arange(0,img_thresh.shape[0]) -coords = np.zeros((img_thresh.shape[0], img_thresh.shape[1], 2)) -coords_x = np.zeros((img_thresh.shape[0], img_thresh.shape[1])) -coords_y = np.zeros((img_thresh.shape[0], img_thresh.shape[1])) -coords_x[:,:] = x_ind - - -# Even this is extremely quick as it goes through rows in the numpy array, which in python is much faster than columns -for element in y_ind: - coords_y[element,:] = element - -# Now need to get the average x value and y value for centre of gravity -xb = int(np.sum(coords_x[img_thresh == 255])/k) -yb = int(np.sum(coords_y[img_thresh == 255])/k) - -centre = (int(np.sum(coords_x[img_thresh == 255])/k), int(np.sum(coords_y[img_thresh == 255])/k)) - -#x,y,k,xb,yb = 0,0,0,0,0 -# -## this is inherently slow...like very very slow...0.114s -#for pix in img_thresh: -# for j in pix: -# if j == 255: -# k += 1 -# xb += x -# yb += y -# x += 1 -# y += 1 -# x = 0 -# -#centre = (int(xb/k), int(yb/k)) - - -cv2.rectangle(img_thresh, centre, (centre[0] + 20, centre[1] + 20), (0,0,255), 3) -cv2.circle(img_thresh, centre, 140, (0,0,0), 3) - -# Now need to trace around the circle to figure out where the fingers are. -# First get equation of the circle: -# y = sart(r2 - (x-c)2 + c) - -cv2.imshow("Binary-cot-out", img_thresh) -cv2.waitKey(0) -cv2.destroyAllWindows() diff --git a/GestureRecognition/HandRecognition.py b/GestureRecognition/HandRecognition.py deleted file mode 100644 index e13b766..0000000 --- a/GestureRecognition/HandRecognition.py +++ /dev/null @@ -1,34 +0,0 @@ -import numpy as np -import cv2 - -img = cv2.imread('H:\car\GestureRecognition\IMG_0818.png', 1) - -# Downscale the image -img = cv2.resize(img, None, fx=0.1, fy=0.1, interpolation = cv2.INTER_AREA) - -min_seg_threshold = 1.2 -max_seg_threshold = 3 - -# prevent divide by zero, by just forcing pixel to be ignored. -np.where(img[:,:,1] == 0, 0, img[:,:,1]) -img[(img[:,:,2]/img[:,:,1] > min_seg_threshold) & (img[:,:,2]/img[:,:,1] < max_seg_threshold)] = [255,255,255] - -# Try removing image noise. -#img = cv2.fastNlMeansDenoising(img) - -cv2.imshow('image', img) -cv2.waitKey(0) -cv2.destroyAllWindows() - -# Remove non-hand parts - -# Find centre of the hand -# Hand parts are white pixels. -# Find sum of each col/row to find the left/rightmost and top/bottommost white pixels. -# Have used a for loop but obviously that is going to be slow. - -# Draw appropriate circle - -# Calculate number of different peaks. -# Article just traced around the circle and counted number of times switched from -# zero to one. \ No newline at end of file diff --git a/GestureRecognition/SimpleHandRecogniser.py b/GestureRecognition/SimpleHandRecogniser.py index b9a7b4a..ff78ce8 100644 --- a/GestureRecognition/SimpleHandRecogniser.py +++ b/GestureRecognition/SimpleHandRecogniser.py @@ -30,7 +30,7 @@ class SimpleHandRecogniser(HandRecogniser): # Apply another blur to rmeove any small holes/noise self.img_cut = self.__denoise(self.img_cut) - ret, self.img_cut = cv2.threshold(self.img_cut, 50, 255, cv2.THRESH_BINARY) + _, self.img_cut = cv2.threshold(self.img_cut, 50, 255, cv2.THRESH_BINARY) def __denoise(self, image): """ diff --git a/MotorControl/ESC.py b/MotorControl/ESC.py deleted file mode 100644 index 3c2402b..0000000 --- a/MotorControl/ESC.py +++ /dev/null @@ -1,124 +0,0 @@ -# This program will let you test your ESC and brushless motor. -# Make sure your battery is not connected if you are going to calibrate it at first. -# Since you are testing your motor, I hope you don't have your propeller attached to it otherwise you are in trouble my friend...? -# This program is made by AGT @instructable.com. DO NOT REPUBLISH THIS PROGRAM... actually the program itself is harmful pssst Its not, its safe. - -import os #importing os library so as to communicate with the system -import time #importing time library to make Rpi wait because its too impatient -os.system ("sudo pigpiod") #Launching GPIO library, will say it can't connect if already running -time.sleep(1) # As i said it is too impatient and so if this delay is removed you will get an error -import pigpio #importing GPIO library - -ESC=19 #Connect the ESC in this GPIO pin - -pi = pigpio.pi(); -pi.set_servo_pulsewidth(ESC, 0) - -max_value = 2000 #change this if your ESC's max value is different or leave it be -min_value = 1000 #change this if your ESC's min value is different or leave it be -print("For first time launch, select calibrate") -print("Type the exact word for the function you want") -print("calibrate OR manual OR control OR arm OR stop") - -def manual_drive(): #You will use this function to program your ESC if required - print("You have selected manual option so give a value between 0 and you max value") - while True: - inp = input() - if inp == "stop": - stop() - break - elif inp == "control": - control() - break - elif inp == "arm": - arm() - break - else: - pi.set_servo_pulsewidth(ESC,inp) - -def calibrate(): #This is the auto calibration procedure of a normal ESC - pi.set_servo_pulsewidth(ESC, 0) - print("Disconnect the battery and press Enter") - inp = input() - if inp == '': - pi.set_servo_pulsewidth(ESC, max_value) - print("Connect the battery NOW.. you will here two beeps, then wait for a gradual falling tone then press Enter") - inp = input() - if inp == '': - pi.set_servo_pulsewidth(ESC, min_value) - print("Wierd eh! Special tone") - time.sleep(7) - print("Wait for it ....") - time.sleep (5) - print("Im working on it, DONT WORRY JUST WAIT.....") - pi.set_servo_pulsewidth(ESC, 0) - time.sleep(2) - print("Arming ESC now...") - pi.set_servo_pulsewidth(ESC, min_value) - time.sleep(1) - print("See.... uhhhhh") - control() # You can change this to any other function you want - -def control(): - print("I'm Starting the motor, I hope its calibrated and armed, if not restart by giving 'x'") - time.sleep(1) - speed = 1500 # change your speed if you want to.... it should be between 700 - 2000 - print("Controls - a to decrease speed & d to increase speed OR q to decrease a lot of speed & e to increase a lot of speed") - while True: - pi.set_servo_pulsewidth(ESC, speed) - inp = input() - - if inp == "q": - speed -= 100 # decrementing the speed like hell - print("speed = %d" % speed) - elif inp == "e": - speed += 100 # incrementing the speed like hell - print("speed = %d" % speed) - elif inp == "d": - speed += 10 # incrementing the speed - print("speed = %d" % speed) - elif inp == "a": - speed -= 10 # decrementing the speed - print("speed = %d" % speed) - elif inp == "stop": - stop() #going for the stop function - break - elif inp == "manual": - manual_drive() - break - elif inp == "arm": - arm() - break - else: - print("WHAT DID I SAID!! Press a,q,d or e") - -def arm(): #This is the arming procedure of an ESC - print("Connect the battery and press Enter") - inp = input() - if inp == '': - pi.set_servo_pulsewidth(ESC, 0) - time.sleep(1) - pi.set_servo_pulsewidth(ESC, max_value) - time.sleep(1) - pi.set_servo_pulsewidth(ESC, min_value) - time.sleep(1) - control() - -def stop(): #This will stop every action your Pi is performing for ESC ofcourse. - pi.set_servo_pulsewidth(ESC, 0) - pi.stop() - -#This is the start of the program actually, to start the function it needs to be initialized before calling... stupid python. -inp = input() -if inp == "manual": - manual_drive() -elif inp == "calibrate": - calibrate() -elif inp == "arm": - arm() -elif inp == "control": - control() -elif inp == "stop": - stop() -else: - print("Thank You for not following the things I'm saying... now you gotta restart the program STUPID!!") diff --git a/MotorControl/gpiozero/__init__.py b/MotorControl/gpiozero/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/MotorControl/gpiozero/motor_session.py b/MotorControl/gpiozero/motor_session.py index c71de2b..8d62eda 100644 --- a/MotorControl/gpiozero/motor_session.py +++ b/MotorControl/gpiozero/motor_session.py @@ -1,4 +1,3 @@ -import os from gpiozero import Servo, Device from gpiozero.pins.pigpio import PiGPIOFactory import subprocess diff --git a/persontracking/__init__.py b/persontracking/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/persontracking/lidar_cache.py b/persontracking/lidar_cache.py index b2020a5..2c634b2 100644 --- a/persontracking/lidar_cache.py +++ b/persontracking/lidar_cache.py @@ -1,7 +1,8 @@ import rplidar from rplidar import RPLidar from threading import Thread -import algorithms +from persontracking import algorithms +import zmq class LidarCache(): ''' @@ -14,7 +15,8 @@ class LidarCache(): currentGroups = None groupsChanged = [] - def __init__(self, measurements=100): + def __init__(self, port, measurements=100): + self.port = port self.lidar = RPLidar('/dev/ttyUSB0') self.measurements = measurements print('Info: ' + self.lidar.get_info()) @@ -28,6 +30,11 @@ class LidarCache(): ''' Performs a scan for the given number of iterations. ''' + + # Create the 0MQ socket first. This should not be passed between threads. + self._socket = self._create_socket() + self._socket.bind("tcp://*:" + str(self.port)) + for i, scan in enumerate(self.lidar.iter_scans(min_len=self.measurements)): print('%d: Got %d measurments' % (i, len(scan))) if(not self.run): @@ -40,7 +47,13 @@ class LidarCache(): self.currentGroups = algorithms.calc_groups(scan) def fireGroupsChanged(self): + # Send the updated groups to 0MQ socket. + # self._socket.send_multipart(["lidar_map", ...]) pass def stop_scanning(self): self.run = False + + def _create_socket(self): + return zmq.Context.instance().socket(zmq.PUB) + \ No newline at end of file diff --git a/persontracking/lidar_servicer.py b/persontracking/lidar_servicer.py index 6437bf7..7ab31ad 100644 --- a/persontracking/lidar_servicer.py +++ b/persontracking/lidar_servicer.py @@ -1,7 +1,10 @@ -import lidar_tracker_pb2 -import lidar_tracker_pb2_grpc -from .lidar_cache import LidarCache -class LidarServicer(lidar_tracker_pb2_grpc.PersonTrackingServicer): +import persontracking.lidar_tracker_pb2 as lidar_tracker_pb2 +from persontracking.lidar_tracker_pb2_grpc import PersonTrackingServicer +from persontracking.lidar_cache import LidarCache\ + + + +class LidarServicer(PersonTrackingServicer): def __init__(self): self.cache = LidarCache(measurements=100) @@ -21,5 +24,4 @@ class LidarServicer(lidar_tracker_pb2_grpc.PersonTrackingServicer): Starts the lidar cache. ''' pass - - + \ No newline at end of file diff --git a/persontracking/protos/lidar_tracker.proto b/persontracking/protos/lidar_tracker.proto index f20adf9..7a0829c 100644 --- a/persontracking/protos/lidar_tracker.proto +++ b/persontracking/protos/lidar_tracker.proto @@ -24,6 +24,10 @@ message PointScan{ repeated Point points = 1; } +message TrackingInfo{ + int32 port = 1; +} + service PersonTracking{ rpc set_tracking_group(Int32Value) returns (Empty) {} @@ -31,5 +35,5 @@ service PersonTracking{ rpc get_scan_data(Empty) returns (PointScan) {} - rpc start_tracking(Empty) returns (Empty) {} + rpc start_tracking(TrackingInfo) returns (Empty) {} } \ No newline at end of file