Skip to main content

Klasse "Robot"

Dies ist ein Beispiel für eine Bibliothek, die dir Grundfunktionen des Fahrens in objektorientierter Programmierung zeigt. Die Funktion fahren(drive(self, s, dir_l, dir_r): setzt die Fahrfunktion allgemein um. Um den Aufruf der Grundfunktionen zu vereinfachen, wird diese Funktion von einfacher benannten Funktionen aufgerufen.

# import motor
from motor import Motor, BiMotor
from ultrasonic import utimeUltra
from infrared import IR
from servo import Servo
import utime, random
class Robot:
    def'''Initialize __init__(self,the m1,class.
        m2):
        self.motor_left= BiMotor(m1)First # Initializing pins 11 and 12pin for left motor.motor, self.motor_right=f.ex. BiMotor(m2)12
        #motor_right Initializing= pinsFirst 14 and 15pin for right motor.motor, f. ex 14
        us = First pin for ultrasonic sensor, f. ex. 16
        ir = Pin for IR-sensor
        Motors and ultrasonic sensor must use consecutive pins.'''
    def __init__(self,ml,mr,us,ir,s):
        self.motor_left = BiMotor(ml)
        self.motor_right = BiMotor(mr)
        if us >= 0:
            self.us = Ultra(us)
        if ir >= 0:
            self.ir = IR(ir,self)
        if s >=0:
            self.servo = Servo(s,self)
        self.speed = 0
        self.new_speed = 0
        self.last_turn_right = random.randint(0,1) == 0
        
    def drive(self, s, dir_l, dir_r):
        '''This abstracted driving function is only called locally by the other functions with better names. '''
        print("alte_G: ", self.speed, " neue G: ", self.new_speed)
        self.motor_left.setForward(set_forward(dir_l)
        self.motor_right.setForward(set_forward(dir_r)
        if s > self.speed:
            steps = 1
        elif snew_speed < self.speed:
            steps = -1
        else:
            steps = 1
        for i in range(self.speed,s,self.new_speed,steps):
            self.motor_left.setSpeed(set_speed(i)
            self.motor_right.setSpeed(set_speed(i)
            utime.sleep_ms(10+int(i/2))
        self.speed = self.new_speed
        
    def drive_instantly(self,dir_l,dir_r):
        self.motor_left.set_forward(dir_l)
        self.motor_right.set_forward(dir_r)
        self.motor_left.set_speed(self.new_speed)
        self.motor_right.set_speed(self.new_speed)
        self.speed = self.new_speed
        
    def set_speed(self,s):
        '''Sets the new speed. Has to be set before
        other driving functions when changing the speed of the robot. '''
        self.new_speed = s
        
    def straight(self,forward(self):
        s):'''Drive forward. Speed has to be set before with set_speed()'''
        self.drive(s,True, True)
        
    def backwards(self,backward(self):
        s):'''Drive forward. Speed has to be set before with set_speed()'''
        self.drive(s,False, False)

    def turn(turn_right(self, d):
        '''Turn right for the given duration. We cannot determine the angle the robot turns without a compass or gyroscope.'''
        self.drive(40,drive_instantly(True,False)
        utime.sleep_ms(d)
        self.emergency_stop()
        
    def turn_before_obstacle(self, distance):
        self.drive(0,True,False)
        while self.get_dist() < distance:
            pass
        self.emergency_stop()
            
    def turn_left(self, d):
        '''Turn right for the given duration. We cannot determine the angle the robot turns without a compass or gyroscope.'''
        self.drive_instantly(False,True)
        utime.sleep_ms(d)
        self.emergency_stop()
        
    def toggle_turn(self, d):
        '''Toggle turn for the given duration. We cannot determine the angle the robot turns without a compass or gyroscope.'''
        if self.last_turn_right:
            self.turn_left(d)
        else:
            self.turn_right(d)
        self.last_turn_right = not self.last_turn_right
    
    
    def random_turn(self,d):
        '''Randomly turn for the given duration. We cannot determine the angle the robot turns without a compass or gyroscope.'''
        if random.randint(0,1) == 0:
            self.turn_left(d)
        else:
            self.turn_right(d)
                
    def stop(self):
        '''Stop the robot slowly by deceleration. '''
        self.set_speed(0)
        self.drive(0,self.motor_left.forward, self.motor_right.forward)
        
    def emergency_stop(self):
        '''Stop the robot immediately.'''
        self.motor_left.set_speed(0)
        self.motor_right.set_speed(0)
        # self.set_speed(0)
        self.speed = 0
    
    def obstacle_detected(self, pin, pin_num):
        '''This method is called when the IR-sensor has detected a change. Fill in your code accordingly'''
        if pin.value() == 0:
            print("obstacle detected on pin", pin_num)
        else:
            print("There is no obstacle anymore on pin ", pin_num)
        # self.emergency_stop()
        
    def get_dist(self):
        return self.us.get_dist()

    def set_angle(self,a):
        self.servo.set_angle(a)
    
    def get_smallest_distance(self):
        '''This returns the angle of the ultrasonic sensor where it measured the smallest distance'''
        self.set_angle(0)
        utime.sleep_ms(500)
        dist_map = {}
        smallest_index=0
        smallest_dist=2000.0
        for i in range(0,180):
            self.set_angle(i)
            dist_map.update({i : self.get_dist()})
        for i,dist in dist_map.items():
            if dist<smallest_dist:
                smallest_index=i
                smallest_dist=dist
        return smallest_index+1

    def get_longest_distance(self):
        '''This returns the angle of the ultrasonic sensor where it measured the longest distance'''
        self.set_angle(0)
        utime.sleep_ms(500)
        dist_map = {}
        longest_index=0
        longest_dist=0.0
        for i in range(0,180):
            self.set_angle(i)
            dist_map.update({i : self.get_dist()})
        for i,dist in dist_map.items():
            if dist>longest_dist:
                longest_index=i
                longest_dist=dist
        return longest_index+1

Beispiel für die Benutzung der Klasse

robot = Robot(12,14,16,11,14)9) # Definiert die Klasse Robot, die die Pins für die Motoren übergibt.
robot.geradeaus(80)set_speed(60)
robot.forward()