Pretraži kod

Kurs Lekcija 9 od 10: Izbjegavanje prepreka koristeći Raspberry Pi Pico 4WD pametni automobil

Kurs Lekcija 9 od 10: Izbjegavanje prepreka koristeći Raspberry Pi Pico 4WD pametni automobil

Uvod

Ovaj vodič, zasnovan na lekciji 9 od 10 iz kursa Robojax, pokazuje kako napraviti robota koji izbjegava prepreke koristeći SunFounder Raspberry Pi Pico 4WD Smart Car komplet. Projekat kombinuje servo upravljani ultrazvučni senzor sa kontrolom motora kako bi se stvorio robot koji može samostalno navigirati svojim okruženjem. Pomicanjem senzora poput radara, automobil detektuje prepreke i inteligentno bira slobodan put za nastavak, što ga čini savršenim uvodom u robotiku, integraciju senzora i autonomnu navigaciju.

Sunfounder_Pico4DW-09-Obstacle-avoidance postavka sa preprekom na podu

Ovaj projekat nije samo igračka; to je temelj za mnoge praktične primjene. Evo nekoliko ideja koje će vas inspirisati:

  • Autonomni istraživački robot: Napravite robota koji može mapirati i istraživati prostoriju ili vanjsko područje bez ljudske intervencije.
  • Pametni usisivač: Koristite iste principe za stvaranje robota koji se kreće po prostoriji, izbjegavajući namještaj i zidove dok čisti.
  • Sigurnosni patrolni bot: Programirajte automobil da patrolira perimetrom i koristi ultrazvučni senzor za otkrivanje i prijavljivanje neočekivanih prepreka ili upada.
  • Edukativna platforma za AI: Koristite ovaj projekat kao odskočnu dasku za učenje o složenijim algoritmima poput pronalaženja puta i simultane lokalizacije i mapiranja (SLAM).

Ova lekcija se fokusira na osnovnu logiku i kod koji omogućavaju automobilu da donosi odluke. Automobil koristi servo motor za rotaciju ultrazvučnog senzora, koji djeluje kao radar za mjerenje udaljenosti od 0 do 180 stepeni. Kod analizira ove podatke kako bi pronašao najširi slobodan put i usmjerava automobil da se kreće naprijed, lijevo ili desno u skladu s tim. Video demonstrira cijeli proces, od testiranja pojedinačnih komponenti do pokretanja finalnog algoritma za izbjegavanje prepreka u stvarnom lavirintu.

Hardver/Komponente

Ovaj projekat je zasnovan na SunFounder Raspberry Pi Pico 4WD Smart Car kompletu. Osnovne komponente korištene u ovoj lekciji su:

  • Raspberry Pi Pico mikrokontrolerska ploča
  • SunFounder 4WD Smart Car šasija sa četiri motora
  • Ploča za upravljanje motorima
  • Ultrazvučni senzor udaljenosti (HC-SR04 tip)
  • Servo motor (za rotaciju ultrazvučnog senzora)
  • Napajanje (baterije za automobil)

Vodič za povezivanje

SunFounder komplet je dizajniran za laku montažu, a povezivanje je obično unaprijed spojeno preko namjenske proširive ploče. Ultrazvučni senzor je montiran na servo motor, koji je zatim povezan na glavnu upravljačku ploču. Ova postavka omogućava rotaciju senzora za skeniranje okoline. Za detaljan dijagram povezivanja specifičan za vaš komplet, pogledajte službenu SunFounder dokumentaciju.

Osnovne veze uključuju trigger i echo pinove ultrazvučnog senzora, te signalni pin servo motora, koji su svi povezani na specifične GPIO pinove na Raspberry Pi Pico. Upravljač motora je također povezan na Pico za kontrolu četiri pogonska motora. Video spominje da je kompletna dokumentacija, uključujući dijagrame povezivanja, dostupna za preuzimanje uz komplet.

Sunfounder_Pico4DW-09-Obstacle-avoidance_kada ultrazvučni senzor detektuje prepreku

Objašnjenje koda

Ova lekcija se fokusira na logiku unutar primjera `obstacle_avoid`. Kod je napisan u MicroPython-u. Iako je cijeli program dostupan za preuzimanje, fokusirat ćemo se na ključne, korisnički podesive parametre koji kontrolišu ponašanje automobila. Oni se obično nalaze na vrhu skripte.

Evo glavnih varijabli koje možete prilagoditi za fino podešavanje performansi vašeg robota:


# Radarski i parametri kretanja
radar_reference = 20  # Minimalna udaljenost u cm koja se smatra sigurnom
step_angle = 10       # Povećanje ugla za svaki korak radarskog skeniranja
forward_speed = 30    # Brzina motora za kretanje naprijed (0-100)
turn_speed = 50       # Brzina motora za okretanje (0-100)
forward_scan_angle = 50  # Ugao koji servo skenira kada nema detektovane prepreke
  • radar_reference: Ovo je ključna sigurnosna udaljenost u centimetrima. Ako se prepreka detektuje bliže od ove vrijednosti, automobil će je smatrati "opasnošću" i pokrenuti manevar izbjegavanja. U videu je ovo postavljeno na 20 cm.
  • step_angle: Ovo definiše rezoluciju radarskog skeniranja. Manja vrijednost (npr. 10 stepeni) znači detaljnije skeniranje, ali traje duže. Veća vrijednost bi bila brža, ali bi mogla propustiti uske prepreke.
  • forward_speed & turn_speed: Ovi parametri kontrolišu snagu koja se šalje motorima. Možete ih prilagoditi za promjenu ukupne brzine i okretnosti automobila. Brzina okretanja je često postavljena više kako bi se osiguralo da se automobil može efikasno okretati.
  • forward_scan_angle: Kada nema neposredne opasnosti ispred, automobil sužava svoje skeniranje na ovaj ugao (centriran na smjer naprijed) kako bi češće provjeravao prepreke direktno na svom putu, omogućavajući glatkije kretanje naprijed.

Video također objašnjava glavnu logiku donošenja odluka. Funkcija `get_direction()` analizira listu očitanja udaljenosti (pretvorenih u 1s i 0s za sigurno/nesigurno) kako bi pronašla najširu kontinuiranu putanju "1". Na osnovu toga gdje se ta najšira putanja nalazi, funkcija vraća smjer: "naprijed", "lijevo" ili "desno". Glavna petlja zatim izvršava odgovarajuću akciju, okrećući automobil i ponovo skenirajući dok put ispred ne bude jasan.

Živi projekat/Demonstracija

Video pruža temeljitu demonstraciju projekta. Počinje testiranjem samo ultrazvučnog senzora kako bi se pokazalo kako mjeri udaljenost i ispisuje vrijednosti u ljusku. Instruktor zatim objašnjava algoritam za izbjegavanje prepreka koristeći dijagram toka, detaljno opisujući proces donošenja odluka za skretanje lijevo i desno. Na kraju, automobil se postavlja u mali lavirint napravljen od kutija kako bi se demonstriralo kompletno ponašanje izbjegavanja prepreka u akciji. Automobil uspješno prolazi kroz lavirint, skrećući lijevo i desno kako bi pronašao jasan put naprijed.

Poglavlja videa

  • [00:00] Uvod u izbjegavanje prepreka
  • [01:31] Pregled SunFounder Smart Car Kita i funkcija
  • [02:47] Kako funkcionira funkcija izbjegavanja prepreka
  • [03:34] Testiranje ultrazvučnog senzora
  • [07:45] Objašnjenje algoritma i dijagrama toka za izbjegavanje prepreka
  • [12:49] Analiza glavnog koda za izbjegavanje prepreka
  • [15:43] Živa demonstracija logike izbjegavanja prepreka
  • [22:53] Završna demonstracija s lavirintom prepreka
  • [24:35] Zaključak i sljedeći koraci

Slike

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
909-Lesson 9/10 Pi Pico 4WD card Python code: obstacle avoid
Jezik: C++
# Lesson 9/10 Pi Car Pico 4WD: Obstacle avoid
# Download and resource page https://robojax.com/RJT631
import pico_4wd as car
import time

car.RADAR_REFERENCE = 20
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 30
MOTOR_TURNING_POWER = 50

FORWARD_SCAN_ANGLE = 50

car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
status = "Danger"

def get_dir(radar_data):
    # get scan status of 0, 1
    # print(radar_data)
    radar_data = [str(i) for i in radar_data]
    radar_data = "".join(radar_data)
    # Split 0, leaves the free path
    paths = radar_data.split("0")
    # print(paths)
    # print("paths: %s" % paths)
    length_list = []
    # Calculate where is the widest
    for path in paths:
        length_list.append(len(path))
    if max(length_list) < 4:
        return "left"
    # Calculate the direction of the widest 
    i = length_list.index(max(length_list))
    pos = radar_data.index(paths[i])
    pos += (len(paths[i]) - 1) / 2
    delta = len(radar_data) / 3
    
    if pos < delta:
        return "left"
    elif pos > 2 * delta:
        return "right"
    else:
        return "forward"

def main():
    global status
    # General
    while True:
        radar_data = car.radar_scan()
        # print("radar_data: %s" % radar_data)
        # If radar data return a int, means scan not finished, and the int is current angle status
        if isinstance(radar_data, int):
            if radar_data == 0 and status != "Danger":
                print("Danger!")
                status = "Danger"
                car.move("stop")
                car.set_radar_scan_angle(180)
            continue
        else:
            status = "Save"
        
        direction = get_dir(radar_data)

        if direction == "left":
            print("turn left")
            distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("left", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        elif direction == "right":
            print("turn right")
            distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("right", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        else:
            print("forward")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
            car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

Stvari koje bi vam mogle zatrebati

Resursi i reference

Još nema resursa.

Datoteke📁

Raspberry Pi kod