Skip to content
Snippets Groups Projects
Select Git revision
  • e5a55ae5d895b36506b339f1f24833424616305f
  • 2024ws default
  • 2023ws
  • 2022ws
  • 2021ws
  • 2020ws
  • 2018ws
  • 2019ws
  • 2017ws
  • 2016ws
10 results

init-04.c

Blame
  • main.py 3.03 KiB
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Tue May  9 12:16:54 2023
    
    @author: Jessica Dreyer, Sebastian Böttger
    
    Hi I'm Sir Ludwig. I'm a self driving robot.
    My job is it to follow a white line.
    I love my job!
    """
    
    #%% imports
    import socket
    from datetime import datetime
    from ev3dev2.port import LegoPort
    from ev3dev2.sensor import INPUT_4, INPUT_1
    from ev3dev2.sensor.lego import ColorSensor
    from ev3dev2.motor import OUTPUT_A, OUTPUT_B, MoveTank, SpeedPercent
    from ev3dev2.sensor.lego import GyroSensor
    #import sys
    
    STUD_MM = 8
    use_gyro = 0 # 0 = ohne Gyrosensor, 1 = mit Gyrosensor
    
    #HOST = "10.128.41.108"
    #HOST = "10.128.41.90"
    #HOST = "192.168.178.81"
    HOST = "192.168.0.100"
    PORT = 50007
    
    #%% main programm
    
    print("Hello! My name is Sir Ludwig and I love to follow the line <3")
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST,PORT))
    
    tank_drive = MoveTank(OUTPUT_A, OUTPUT_B)
    max_speed = 170 / 60 # rps
    d = 120 # in mm
    radumfang = (3.141592 * 54) # in mm
    white_value = 54
    black_value = 13
    desired_light = (white_value + black_value) / 2
    t = 4.5 # in ms
    
    cs = ColorSensor(INPUT_4)
    
    gs = GyroSensor(INPUT_1)
    gs.mode = 'GYRO-RATE' # Rotationsgeschwindigkeit
    
    fehler = 0
    fehler_alt = 0
    s_r = 0
    s_r_alt = 0
    s_l = 0
    s_l_alt = 0
    
    counter_links = 0
    counter_rechts = 0
    counter_geradeaus = 0
    counter = 0
    w = 0
    v = 0
    
    time_last_send = datetime.utcnow()
    
    while (1):
        sensorwert = cs.value()
        fehler_alt = fehler
        fehler = desired_light - sensorwert
    
        ableitung = (fehler - fehler_alt) / t
    
        turning = (0.4 * fehler) + (0.08 * ableitung)
    
        right_motor = 30 - turning
        left_motor = 30 + turning
    
        tank_drive.on(SpeedPercent(left_motor), SpeedPercent(right_motor))
        
        right_speed =  tank_drive.right_motor.speed / 360
        left_speed =  tank_drive.left_motor.speed / 360
    
        v_r = right_speed * radumfang # in mm / s       
        v_l = left_speed * radumfang # in mm / s        
    
        v += (v_r + v_l) / 2
    
        if (use_gyro == 0):
            w += (v_r - v_l) / (2*d)
        else:
            w += (gs.value() / 180) * -3.141592
    
        counter += 1
        if(counter == 6):
            w /= counter
            v /= counter
            v_str = str(format((round(v, 5)), '.5f')).zfill(9)
            w_str = format((round(w, 5)), '.5f')
            if (w >= 0):
                w_str = "+" + w_str
            time_delta = datetime.utcnow() - time_last_send
            t_str = format((round(time_delta.total_seconds(), 6)), '.6f')
            stringSend = "w=" + w_str + "v=" + v_str +"t=" + t_str
            s.sendall(stringSend.encode())
            time_last_send = datetime.utcnow()
            counter = 0
            w = 0
            v = 0
    
    
    #print("Links: ", tank_drive.left_motor.speed, file=sys.stderr)
    #print("Rechts: ", tank_drive.right_motor.speed, file=sys.stderr)
    #right_speed = (right_motor / 100) * max_speed
    #left_speed = (left_motor / 100) * max_speed
    #print("links: ", left_speed, file=sys.stderr)
    #print("rechts: ", right_speed, file=sys.stderr)
    #print("Links: ", tank_drive.left_motor.speed / 360, file=sys.stderr)
    #print("Rechts: ", tank_drive.right_motor.speed / 360, file=sys.stderr)