Seconda parte: Creare una macchinina telecomandata che evita gli ostacoli e segue un percorso

RCcar

Terzo ed ultimo di una serie di articoli in cui abbiamo visto come realizzare una macchina telecomandata che tramite un sensore ottico segue un percorso ed evita gli ostacoli frontali. In questo articolo presenteremo la parte software che costituisce il "cervello" del nostro piccolo automa su quattro ruote.

Dopo aver introdotto il progetto della nostra macchinina telecomandata "intelligente" tramite schemi a blocchi ed aver visto più nel dettaglio la realizzazione della parte hardware vediamo adesso i dettagli del software di controllo. Ovviamente essendo il terzo di una serie di articoli è fortemente consigliato leggere prima i precedenti per semplificare la comprensione del seguito.

Partiamo dal software di controllo del sensore di prossimità. Tutto il codice relativo a tale funzionalità è contenuto nella funzione speedTask, il link per scaricare il codice è alla fine dell’articolo. Anche in questo caso bisogna sacrificare la precisione in nome della rapidità di risposta. L’analisi dai dati, che include conversione da analogico a digitale ed interpretazione degli stessi per capire se la macchia è troppo vicina ad un ostacolo devono essere svolti molto rapidamente. Effettuando una conversione AD utilizzando il convertitore del microcontrollore i dati ottenuti sono processati con un comparatore di soglia. Se il segnale convertito in digitale proveniente dal sensore è sotto la soglia allora non ci sono ostacoli in prossimità, altrimenti per evitare lo scontro contro un ostacolo si rallenta fino a fermare completamente il modellino.

La scenta della soglia è un punto critico poichè dovrà essere tale da permettere di fermare in tempo la macchina ma non dovrà intervenire troppo presto a seguito di ostacoli che non costituisco un problema immediato poichè distanti.

Per quanto riguarda la gestione della telecamera invece, buona parte del codice è dedicato alla gestione dei segnali di controllo di questa, avendo risolto il problema della elaborazione dei dati provenienti dalla telecamera nel precedente articoli in hardware per ottimizzare al meglio i tempi di esecuzione.

L’algoritmo per il riconoscimento del percorso partendo dai dati forniti dalla telecamera è un punto cruciale per la gestione dell’intero sistema. Infatti per convertire il flusso di dati proveniente dalla telecamera in tempi rapidi, come visto nel precedente articolo, abbiamo dovuto sacrificare l’accuratezza del risultato. In pratica i dati a disposizione del microcontrollore od il modo in cui il microcontrollore "vede" il percorso è mostrato nella figura sottostante, in cui si possono distinguere le linee del percorso da seguire sullo sfondo nero.

Non è un panorama del Botticelli ma è sufficiente per i nostro scopi 

Per prima cosa dobbiamo ottenere un algoritmo preciso e sufficientemente rapido di modo che la macchinina non esca fuori strada. Inoltre vogliamo un algoritmo:

    - che sia semplice da implementare ed usi poca memoria

    - flessibile, nel senso che riesca a funzionare con diverse condizioni di luce, nei limiti del visibile ovviamente…

L’immagine mostrata sopra sarà memorizzata in un vettore ed è su questo che si dovrà lavorare per interpretare correttamente il percorso.

I passi principali dell’algoritmo sono i seguenti:

    - acquisizione del vettore di dati

    - selezione di tre linee dal vettore di dati

    - analisi della prima linea

      – SE le linee di destra e sinistra sono trovare (due valori ad uno fra tutti gli zeri),

        ALLORA fare una media per stimarne il centro e mantenere la posizione in direzione di tale centro

      – ALTRIMENTI SE solo una linea è rilevata bisognerà usare i dati delle altre due linee per stimare il centro della prima linea

L’idea è molto semplice ed i vari casi da considerare seguono di conseguenza appena si capisce l’idea alla base.

Consideriamo 6 punti, a coppie sulla stessa riga ed a triplette sulla stessa colonna come in figura sotto.

Se i punti mostrati sopra sono gli uni che indicano la posizione delle linee da seguire, in curva questi non saranno più allineati sulle colonne. In prossimità di una curva, per esempio a destra, alcuni punti scompariranno dal campo visivo, il rettangolo nero, come mostrato sotto.

Quindi dai tre punti sulla sinistra che possiamo ancora vedere ricaviamo l’informazione relativa alla direzione della curva (pendenza della retta bleu), facendo invece la media tra l’ultimo punto sulla destra ed il secondo punto sulla sinistra ricaviamo il nuovo centro verso cui indirizzare la macchina per seguire la strada in curva, il puntino bleu sarà il nuovo centro da seguire.

Questo e simili metodi, anche molto più approssimati sono un classico di tempi andati. Infatti una volta le schede grafiche approssimavano in questo modo le curve non avendo un coprocessore per i calcoli in virgola mobile, tutto era approssimato con rette e numeri interi.

Quindi con una serie di approssimazioni successive della direzione del modellino è possibile seguire un percorso come quello mostrato sopra.

Ovviamente c’è un limite alla velocità imposto dalla rapidità con cui vengono svolte le operazioni per la correzione del percorso, ma la nostra macchinina non è una ferrari, quindi non ci sono problemi.

Finalmente, dopo tanto lavoro e tanta fatica il risultato finale che fa il suo onesto lavoro è mostrato nel video sottostante.

Il codice, gli schemi dettagliati e tante altre informazioni aggiuntive le trovate qui.

Un lavoro veramente ben fatto, molto interessante e ricco di spunti di riflessione. Infatti abbiamo visto come realizzare in piccolo, per un modellino di automobile, ciò che le più grandi case automobilistiche vorrebbero realizzare per delle auto vere e se già in piccolo ci sono grossi problemi, figuratevi "in grande" quanto crescono i problemi affrontati in questi articoli.

STAMPA

Leave a Reply