From ac48afd01a7f84b49626664b97e06f112316f288 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Wed, 28 Sep 2022 13:31:54 +0200 Subject: [PATCH] :sparkles: --- drive_between_arucos.py | 81 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 drive_between_arucos.py diff --git a/drive_between_arucos.py b/drive_between_arucos.py new file mode 100644 index 0000000..af75491 --- /dev/null +++ b/drive_between_arucos.py @@ -0,0 +1,81 @@ +from time import sleep + +import cv2 +import numpy as np + +from robot import Robot + +POWER = 70 + +TURN_T = 7.9 # 1 degree +DRIVE_T = 22 # 1 centimeter + +RIGHT_WHEEL_OFFSET = 4 + +CLOCKWISE_OFFSET = 0.96 + +FOCAL_LENGTH = 1691 + +CAMERA_MATRIX = np.array( + [[FOCAL_LENGTH,0,512],[0,FOCAL_LENGTH,360],[0,0,1]], + dtype=np.float32 +) +DIST_COEF = np.array([0,0,0,0,0], dtype=np.float32) + +def find_aruco(image): + aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250) + aruco_params = cv2.aruco.DetectorParameters_create() + corners, ids, _ = cv2.aruco.detectMarkers( + image, + aruco_dict, + parameters=aruco_params + ) + + if corners is None: + return [] + + return [(box[0], ids[i]) for i, box in enumerate(corners)] + +def find_arucos(arlo): + aruco_list = [] + + while True: + arucos = find_aruco(arlo.take_photo()) + if arucos != []: + aruco_list += arucos + if len(aruco_list) >= 2: + break + arlo.go_diff(40, 40, 1, 0) + sleep(0.3) + arlo.stop() + + return arucos[:2] + +def main(): + arlo = Robot() + arucos = find_arucos(arlo) + + aruco_positions = np.array([cv2.aruco.estimatePoseSingleMarkers( + np.array([aruco[0]]), 14.5, CAMERA_MATRIX, DIST_COEF + )[1][0][0] for aruco in arucos]) + + print(aruco_positions) + + # angle = np.rad2deg(np.arctan(position[0]/position[2])) + # drive_distance = np.sqrt(position[0]**2 + position[2]**2) + # if angle < 0: + # arlo.go_diff(POWER, POWER, 0, 1) + # sleep((abs(angle) * TURN_T)/1000) + # arlo.stop() + # else: + # arlo.go_diff(POWER, POWER, 1, 0) + # sleep((abs(angle) * TURN_T * CLOCKWISE_OFFSET)/1000) + # arlo.stop() + + # arlo.go_diff(POWER, POWER + RIGHT_WHEEL_OFFSET, 1, 1) + # sleep((drive_distance * DRIVE_T)/1000) + # arlo.stop() + + +if __name__ == "__main__": + main()