2022-10-25 14:53:05 +00:00
|
|
|
from random import randint
|
|
|
|
from kuukar_config import MOTOR_FL_F, MOTOR_FL_R, MOTOR_FR_F, MOTOR_FR_R, MOTOR_RL_F, MOTOR_RL_R, MOTOR_RR_F, MOTOR_RR_R, TURN_TIME_FS_90DEG_MS
|
2022-10-25 07:49:19 +00:00
|
|
|
import time
|
2022-10-23 06:49:59 +00:00
|
|
|
from kuukar_leds import leds
|
|
|
|
from kuukar_sensors import sensors
|
2022-10-25 07:49:19 +00:00
|
|
|
from telemetrix_rpi_pico import telemetrix_rpi_pico
|
|
|
|
import threading
|
2022-10-23 06:49:59 +00:00
|
|
|
|
|
|
|
class motion:
|
2022-10-25 07:49:19 +00:00
|
|
|
|
|
|
|
roaming = False
|
|
|
|
|
|
|
|
def __init__(self, driver_board: telemetrix_rpi_pico.TelemetrixRpiPico, leds: leds, sensors: sensors) -> None:
|
|
|
|
self.driver = driver_board
|
2022-10-23 06:49:59 +00:00
|
|
|
self.leds = leds
|
|
|
|
self.sensors = sensors
|
2022-10-25 07:49:19 +00:00
|
|
|
self.roam_thread = threading.Thread(target = self.roam_loop)
|
|
|
|
self.roam_thread.start()
|
2022-10-23 06:49:59 +00:00
|
|
|
|
2022-10-25 07:49:19 +00:00
|
|
|
drive_pins = [MOTOR_FL_F,MOTOR_FL_R,MOTOR_FR_F,MOTOR_FR_R,MOTOR_RL_F,MOTOR_RL_R,MOTOR_RR_F,MOTOR_RR_R]
|
2022-10-23 06:49:59 +00:00
|
|
|
for drive_pin in drive_pins:
|
2022-10-25 07:49:19 +00:00
|
|
|
self.driver.set_pin_mode_pwm_output(drive_pin)
|
|
|
|
|
|
|
|
def motor_write(self, forward_pin: int,reverse_pin: int, speed: int):
|
|
|
|
if speed < 0:
|
|
|
|
self.driver.pwm_write(forward_pin,0)
|
|
|
|
self.driver.pwm_write(reverse_pin,-speed)
|
|
|
|
elif speed >= 0:
|
|
|
|
self.driver.pwm_write(forward_pin,speed)
|
|
|
|
self.driver.pwm_write(reverse_pin,0)
|
|
|
|
|
|
|
|
def drive(self, speed: int):
|
|
|
|
self.motor_write(MOTOR_FL_F,MOTOR_FL_R,speed)
|
|
|
|
self.motor_write(MOTOR_FR_F,MOTOR_FR_R,speed)
|
|
|
|
self.motor_write(MOTOR_RL_F,MOTOR_RL_R,speed)
|
|
|
|
self.motor_write(MOTOR_RR_F,MOTOR_RR_R,speed)
|
|
|
|
|
|
|
|
def turn(self, speed: int, duration: float):
|
|
|
|
self.motor_write(MOTOR_FL_F,MOTOR_FL_R,speed)
|
|
|
|
self.motor_write(MOTOR_FR_F,MOTOR_FR_R,-speed)
|
|
|
|
self.motor_write(MOTOR_RL_F,MOTOR_RL_R,speed)
|
|
|
|
self.motor_write(MOTOR_RR_F,MOTOR_RR_R,-speed)
|
|
|
|
time.sleep(duration)
|
|
|
|
self.stop()
|
|
|
|
|
2022-10-23 06:49:59 +00:00
|
|
|
def stop(self):
|
2022-10-25 07:49:19 +00:00
|
|
|
self.drive(0)
|
|
|
|
|
2022-10-23 06:49:59 +00:00
|
|
|
def roam_start(self):
|
2022-10-25 07:49:19 +00:00
|
|
|
self.roaming = True
|
|
|
|
|
2022-10-23 06:49:59 +00:00
|
|
|
def roam_stop(self):
|
2022-10-25 07:49:19 +00:00
|
|
|
self.roaming = False
|
|
|
|
|
|
|
|
def __roam_looper__(self):
|
|
|
|
while True:
|
|
|
|
if self.roaming:
|
|
|
|
self.__roam_handle__()
|
|
|
|
|
|
|
|
def __roam_handle__(self):
|
2022-10-25 14:53:05 +00:00
|
|
|
self.drive(50)
|
|
|
|
f_dist = self.sensors.sonar_get_distance(2)
|
|
|
|
if f_dist > 0 and f_dist < 20: # Close to collision, turn the vehicle
|
|
|
|
l_dist = self.sensors.sonar_get_distance
|
|
|
|
r_dist = self.sensors.sonar_get_distance
|
|
|
|
if l_dist < 20: #Left side is blocked
|
|
|
|
if r_dist < 20: #Both side are blocked, do a full 180deg turn
|
|
|
|
self.turn(100,2*TURN_TIME_FS_90DEG_MS)
|
|
|
|
self.drive(50)
|
|
|
|
time.sleep(3)
|
|
|
|
else:
|
|
|
|
#Right Side is Free, turn right
|
|
|
|
self.turn(100,TURN_TIME_FS_90DEG_MS)
|
|
|
|
self.drive(50)
|
|
|
|
time.sleep(3)
|
|
|
|
elif r_dist < 20: #Right side is blocked, left side is free, turn left
|
|
|
|
self.turn(-100,TURN_TIME_FS_90DEG_MS)
|
|
|
|
else: #Both Side are free, randomize a direction
|
|
|
|
right: bool = randint(0,1)
|
|
|
|
if right:
|
|
|
|
self.turn(100,TURN_TIME_FS_90DEG_MS)
|
|
|
|
self.drive(50)
|
|
|
|
time.sleep(3)
|
|
|
|
else:
|
|
|
|
self.turn(-100,TURN_TIME_FS_90DEG_MS)
|
|
|
|
self.drive(50)
|
|
|
|
time.sleep(3)
|
|
|
|
time.sleep(0.5)
|