Hľadať kód

Kurz Lekcia 9 z 10: Vyhýbanie sa prekážkam pomocou inteligentného auta Raspberry Pi Pico 4WD

Táto lekcia je súčasťou: Raspberry Pi Pico 4WD inteligentné autíčko

Kurz Lekcia 9 z 10: Vyhýbanie sa prekážkam pomocou inteligentného auta Raspberry Pi Pico 4WD

Úvod

Táto príručka, založená na lekcii 9 z 10 kurzu od Robojax, ukazuje, ako postaviť robota vyhýbajúceho sa prekážkam pomocou súpravy SunFounder Raspberry Pi Pico 4WD Smart Car. Projekt kombinuje servo riadený ultrazvukový senzor s riadením motorov, aby vytvoril robota, ktorý dokáže autonómne navigovať vo svojom prostredí. Snímač sa pohybuje ako radar, auto deteguje prekážky a inteligentne si vyberie voľnú cestu, čo z neho robí ideálny úvod do robotiky, integrácie senzorov a autonómnej navigácie.

Sunfounder_Pico4DW-09-Obstacle-avoidance nastavenie s prekážkou na podlahe

Tento projekt nie je len hračka; je základom pre mnoho praktických aplikácií. Tu je niekoľko nápadov na inšpiráciu:

  • Autonómny prieskumný robot: Postavte robota, ktorý dokáže mapovať a preskúmať miestnosť alebo vonkajší priestor bez zásahu človeka.
  • Inteligentný vysávač: Použite rovnaké princípy na vytvorenie robota, ktorý naviguje v miestnosti, vyhýba sa nábytku a stenám počas upratovania.
  • Bezpečnostný hliadkovací bot: Naprogramujte auto na hliadkovanie po obvode a použite ultrazvukový senzor na detekciu a hlásenie neočakávaných prekážok alebo narušení.
  • Vzdelávacia platforma pre AI: Použite tento projekt ako odrazový mostík na učenie sa zložitejších algoritmov, ako je hľadanie cesty a súčasná lokalizácia a mapovanie (SLAM).

Táto lekcia sa zameriava na základnú logiku a kód, ktoré umožňujú autu robiť rozhodnutia. Auto používa servo motor na otáčanie ultrazvukového senzora, ktorý funguje ako radar na meranie vzdialeností od 0 do 180 stupňov. Kód analyzuje tieto údaje, aby našiel najširšiu voľnú cestu, a podľa toho nasmeruje auto dopredu, doľava alebo doprava. Video demonštruje celý proces, od testovania jednotlivých komponentov až po spustenie finálneho algoritmu vyhýbania sa prekážkam v reálnom bludisku.

Hardvér/Komponenty

Tento projekt je založený na súprave SunFounder Raspberry Pi Pico 4WD Smart Car. Základné komponenty použité v tejto lekcii sú:

  • Mikrokontrolér Raspberry Pi Pico
  • Podvozok SunFounder 4WD Smart Car so štyrmi motormi
  • Doska ovládača motorov
  • Ultrazvukový senzor vzdialenosti (typ HC-SR04)
  • Servo motor (na otáčanie ultrazvukového senzora)
  • Napájanie (batérie pre auto)

Sprievodca zapojením

Súprava SunFounder je navrhnutá na jednoduchú montáž a zapojenie je zvyčajne predpripojené cez špeciálnu rozširujúcu dosku. Ultrazvukový senzor je namontovaný na servo motore, ktorý je potom pripojený k hlavnej riadiacej doske. Toto nastavenie umožňuje otáčať senzorom na skenovanie prostredia. Pre podrobnú schému zapojenia špecifickú pre vašu súpravu si pozrite oficiálnu dokumentáciu SunFounder.

Základné pripojenia zahŕňajú piny trigger a echo ultrazvukového senzora a signálny pin servo motora, všetky pripojené na špecifické GPIO piny na Raspberry Pi Pico. Ovládač motorov je tiež pripojený k Pico na riadenie štyroch hnacích motorov. Video spomína, že kompletná dokumentácia vrátane schém zapojenia je k dispozícii na stiahnutie so súpravou.

Sunfounder_Pico4DW-09-Obstacle-avoidance_keď ultrazvuk deteguje prekážku

Vysvetlenie kódu

Táto lekcia sa zameriava na logiku v príklade `obstacle_avoid`. Kód je napísaný v MicroPythone. Zatiaľ čo celý program je k dispozícii na stiahnutie, zameriame sa na kľúčové, používateľom konfigurovateľné parametre, ktoré riadia správanie auta. Tie sa zvyčajne nachádzajú na začiatku skriptu.

Tu sú hlavné premenné, ktoré môžete upraviť na doladenie výkonu vášho robota:


# Parametre radaru a pohybu
radar_reference = 20  # Minimálna vzdialenosť v cm považovaná za bezpečnú
step_angle = 10       # Prírastok uhla pre každý krok radarového skenovania
forward_speed = 30    # Rýchlosť motora pri pohybe vpred (0-100)
turn_speed = 50       # Rýchlosť motora pri otáčaní (0-100)
forward_scan_angle = 50  # Uhol, ktorý servo skenuje, keď nie je detegovaná žiadna prekážka
  • radar_reference: Toto je kľúčová bezpečnostná vzdialenosť v centimetroch. Ak je prekážka detegovaná bližšie ako táto hodnota, auto ju považuje za "nebezpečenstvo" a spustí manéver vyhýbania sa. Vo videu je nastavená na 20 cm.
  • step_angle: Toto definuje rozlíšenie radarového skenovania. Menšia hodnota (napr. 10 stupňov) znamená podrobnejšie skenovanie, ale trvá dlhšie. Väčšia hodnota by bola rýchlejšia, ale mohla by prehliadnuť úzke prekážky.
  • forward_speed & turn_speed: Tieto riadia výkon posielaný do motorov. Môžete ich upraviť na zmenu celkovej rýchlosti a obratnosti auta. Rýchlosť otáčania je často nastavená vyššie, aby sa zabezpečilo, že sa auto dokáže efektívne otočiť.
  • forward_scan_angle: Keď bezprostredné nebezpečenstvo nie je vpredu, auto zúži svoje skenovanie na tento uhol (vycentrovaný dopredu), aby častejšie kontrolovalo prekážky v priamej dráhe, čo umožňuje plynulejší pohyb vpred.

Video tiež vysvetľuje hlavnú logiku rozhodovania. Funkcia `get_direction()` analyzuje zoznam nameraných vzdialeností (prevedených na 1 a 0 pre bezpečné/nebezpečné), aby našla najširšiu súvislú cestu jednotiek "1". Na základe toho, kde sa táto najširšia cesta nachádza, funkcia vráti smer: "dopredu", "doľava" alebo "doprava". Hlavná slučka potom vykoná príslušnú akciu, otočí auto a znova skenuje, až kým nie je cesta vpred voľná.

Živý projekt/demonštrácia

Video poskytuje dôkladnú demonštráciu projektu. Začína testovaním samotného ultrazvukového senzora, aby ukázalo, ako meria vzdialenosť a vypisuje hodnoty do terminálu. Inštruktor potom vysvetľuje algoritmus vyhýbania sa prekážkam pomocou vývojového diagramu, pričom podrobne opisuje proces rozhodovania pri zatáčaní doľava a doprava. Nakoniec je auto umiestnené do malého bludiska vytvoreného z krabíc, aby demonštrovalo úplné správanie pri vyhýbaní sa prekážkam v praxi. Auto úspešne prechádza bludiskom, zatáča doľava a doprava, aby našlo voľnú cestu vpred.

Kapitoly videa

  • [00:00] Úvod do vyhýbania sa prekážkam
  • [01:31] Prehľad súpravy SunFounder Smart Car Kit a jej funkcií
  • [02:47] Ako funguje funkcia vyhýbania sa prekážkam
  • [03:34] Testovanie ultrazvukového senzora
  • [07:45] Vysvetlenie algoritmu vyhýbania sa prekážkam a vývojového diagramu
  • [12:49] Analýza hlavného kódu vyhýbania sa prekážkam
  • [15:43] Živá demonštrácia logiky vyhýbania sa prekážkam
  • [22:53] Záverečná demonštrácia s bludiskom prekážok
  • [24:35] Záver a ďalšie kroky

Obrázky

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
Jazyk: 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()

Veci, ktoré by ste mohli potrebovať

Zdroje a referencie

Zatiaľ žiadne zdroje.

Súbory📁

Kód pre Raspberry Pi