|
import serial |
|
import math |
|
from time import sleep |
|
|
|
ArduinoData = serial.Serial('/dev/cu.usbserial-1420', 9600) |
|
|
|
sleep(5) |
|
|
|
RANGE_OF_MOTION = 10 |
|
DISTANCE_PER_SECOND = 35 |
|
|
|
hypotenuse = 0 |
|
servo_angle = 0 |
|
|
|
|
|
def find_height(hypotenuse, angle): |
|
height = math.sin(math.radians(angle))*hypotenuse |
|
return height |
|
|
|
|
|
def distance(): |
|
global hypotenuse, servo_angle |
|
ArduinoData.write(b"distang") |
|
|
|
while hypotenuse == 0: |
|
try: |
|
hypotenuse = int(ArduinoData.readline()) |
|
except ValueError: |
|
hypotenuse = 0 |
|
|
|
servo_angle = int(ArduinoData.readline())-50 |
|
hypotenuse = hypotenuse |
|
|
|
print("Servo angled at:", servo_angle, "Distance to Object:", hypotenuse) |
|
|
|
distance = round(math.cos(math.radians(servo_angle))*hypotenuse) |
|
print("Lateral Distance:", distance) |
|
return distance |
|
|
|
|
|
def wrist_angle(distance, height): |
|
return math.degrees(math.atan(height/distance)) |
|
|
|
|
|
def absolute(num): |
|
return ((num)**2)**0.5 |
|
|
|
|
|
def target(coordinates): |
|
pass |
|
|
|
def find(object): |
|
pass |
|
|
|
def grab(): |
|
pass |
|
|
|
|
|
def go(direction, distance): |
|
global servo_angle, hypotenuse |
|
if direction == "forward": |
|
height = find_height(hypotenuse, servo_angle) |
|
|
|
if distance > RANGE_OF_MOTION: |
|
send_distance = distance - RANGE_OF_MOTION |
|
send_time = send_distance/DISTANCE_PER_SECOND |
|
remaining_distance = distance-send_distance |
|
send_angle = wrist_angle(remaining_distance, height)+50 |
|
print("Moving:", send_distance, "\t\tDistance to Object:", remaining_distance) |
|
|
|
ArduinoData.write(bytes(f"forward {int(send_time*1000)}", 'utf-8')) |
|
sleep(1.5) |
|
ArduinoData.write(bytes(f"wrist_track {int(send_angle)}", "utf-8")) |
|
|
|
if direction == "backward": |
|
send_distance = distance - RANGE_OF_MOTION |
|
send_time = send_distance/DISTANCE_PER_SECOND |
|
ArduinoData.write(bytes(f"backward {int(send_time*1000)}", 'utf-8')) |